<*+M2EXTENSIONS *> <*+STORAGE *> <*-GENFRAME*> <*-PROCINLINE*> <*-DOREORDER*> <*+GENCDIV*> <*+NOPTRALIAS*> <*CPU="PENTIUM"*> IMPLEMENTATION MODULE useri; (* aprsmap user interface *) FROM SYSTEM IMPORT FILL, ADR, INT16, CAST, MOVE, CARD8, INT8, CARD16, SHIFT, ADDRESS, ADDADR, PUT, TSIZE; FROM osi IMPORT WrStr, WrLn, WrStrLn, WrInt, File, RdBin, FdValid, Exists, DIRSEP, WrBin, Close, OpenRead, OpenWrite, sqrt, Seekcur, Size, Erase, arctan, ALLOCATE, DEALLOCATE, time, ln, exp; FROM xosi IMPORT Gammatab, getscreenbuf, rgbtoscreen, gammalut, Shift, paste, cutpaste, CheckProg, beep, sethand, pulling, zooming, Umlaut, setxwinsize, CURSORTYP, cutbuffer, StopProg, StartProg, PROCESSHANDLE, BYTEPIXEL; FROM maptool IMPORT WHITELEVEL, pIMAGE, clr, xytoloc, charwidth, xytodeg, Colset, drawstri, drawsym, PIX, drawchar, MapPackageJob, mappack, xsize, ysize, MINZOOM, MAXZOOM, readpoifiles, MAXCHAR, loadfont, pullmap, POIname, mapxy, Panorama, cmpwild, findpanopos, PANOWIN, (*rdmountains, closesrtmfile,*) fontloadmsg; FROM aprsdecode IMPORT click, lums, systime, realtime, pOPHIST, DEGSYM, WXSET, sWXSET, LF, CR, trunc, tcpjobs, VERS, DELETSYM, MSGSIZE, MONCALL, delwaypoint, pFRAMEHIST, initzoom, POIINFOSIZE, lasttcprx, lasttcptx, udpsocks, savetrack, CLICKTYPS, msgfifo, pMSGFIFO, makemsg, deltxmsg, lastpurge, verb, txmessages, pTXMESSAGE, acknumstr, getactack, REPLYACK, selop, objsender, tcpconnstat, udpconnstat, UDPSOCKS, DESTCALL, importbeacon, extractbeacon, testbeaconbuf, getbeaconname, drawbeacon, makelogfn, FILENAME, poifiles, maploadpid, serialpid, serialpid2, SYMTABLE, COLTYP, BEGINOFTIME, tracenew, CLICKOBJECT, appendmultiline, modmultiline, ismultiline, SYMBOLSET, quit, checkversion, VERSNUM, DEFAULTPOISYMBOL, FOLLOWX, FOLLOWWATCH; FROM aprsstr IMPORT IntToStr, Append, TIME, FixToStr, Length, Assign, DateToStr, posinval, StrCmp, StrToFix, InStr, cleanfilename, TimeToStr, Delstr, CardToStr, rightbound, Extractword, StrToCard, POSITION, loctopos; FROM aprspos IMPORT posvalid, distance, AREASYMT, AREASYM, ENCODEAREA, ENCODEGPS, ENCODEMICE, ENCODECOMP, ENCODEGPSDAO, ENCODEMICEDAO, ENCODEMULTILINE; FROM aprstext IMPORT optext, postostr, deganytopos, TEXTCOLBLU, TEXTCOLRED, TEXTCOLEND, TEXTCOLYEL, TEXTCOLORA, TEXTCOLVIO, TEXTINSERTSYMBOL, TEXTCOLLGR, listop, listtyps, encbeacon, oppo, setmark1, Apphex, deghtopos, sievert2str, decodelistline; FROM aprstat IMPORT kmhist, althist, btimehist, wxgraph, LASTVAL; FROM aprstext IMPORT DateLocToStr, setmarkalti, logfndate, getmypos; FROM libsrtm IMPORT closesrtmfile, srtmdir; <* IF TARGET_FAMILY="UNIX" THEN *> FROM osi IMPORT Rename; <* END *> CONST <* IF TARGET_FAMILY="WIN32" THEN *> MAPLOADER="getosm"; SHOTFORMATS="(.bmp)"; SERIAL1="udpflex.exe -t com3:9600 -k -u -U :9002:9001"; SERIAL2="udpflex.exe -U :9002:9001 -T :"; TICKERHEADLINE="0"; <* ELSE *> MAPLOADER="gm.sh"; SHOTFORMATS="(.ppm/.png)"; SERIAL1="udpflex -t /dev/ttyUSB0:9600 -k -u -U :9002:9001"; SERIAL2="afskmodem -f 22050 -C 0 -p /dev/ttyS0 0 -M 0 -t 250 -T 6 -L 127.0.0.1:9002:9001 -m 0"; TICKERHEADLINE="0"; (* some window managers do not free window headline mem *) <* END*> CHECKVERSFN="chkvers.txt"; MAXXSIZE=32000; MAXYSIZE=32000; MINXSIZE=100; MINYSIZE=70; DEFAULTXSIZE=600; DEFAULTYSIZE=400; COLOURSZ=17; (* colour chooser size *) COLOURSFRAME=5; COLOURLUMA=10; DEFAULTBRI=25; (* defaul map brightness *) FOTOFN=020C; (** enter filename for screenshot *) ONLINESETUPURL=5; (* menu line *) RFCFGRFPORTS=12; (* menu line *) MAPCFGLINE=7; (* menu line *) MAPMOVLINE=6; (* menu line *) TIMESTAMP=11; (* menu line *) TOGGMOUSESHOW=12; (* menu line *) TEXTINFOWINID=2; (* raw + decoded text window id *) HOVERINFOWINID=7; WXWINID=20; (* set of wx graphics windows ids *) MOUSESHOWID=19; (* win d mouseshow *) MAXKNOBS=60; (* max menu lines *) CONFIGWIDTH=200; HELPDEPTH=10; (* history size of help hyperlinks *) MAXSUBKNOBS=20; (* menu columns *) HINTDELAY=2; (* wait before open hint *) MINHINTTIME=12; (* min opentime for hint window *) HINTREADSPEED=15; (* characters per second extra readtime for hints *) LISTMAXLEN=2000; (* lines in list window *) TEXTWINXMARGIN=4; PULLFRAME=3; (* frame width to change window size *) MINH=100; POTIOFF=8; POTWIDTH=37; CONFIGLINES=9; TEXTBUTTONMARGIN=4; MINSROLLKNOB=8; SCRMUL=256; MOVERSIZE=8; MSGPOPID=211; STATUSID=254; DEFLTEXT=80; (* default text luminance *) DEFLOBJ=70; (* default objects luminance *) DEFLTRACK=80; (* default tracks luminance *) DEFLSYM=90; (* default symbols luminance *) DEFLWAY=70; (* default waypoints luminance *) BEACONEDI=3; (* beacon edit shortcut knob *) DIGIEDI=4; (* digi edit shortcut knob *) PULLMENUY=8; (* ysize of menu from top to be pulled *) STARTPULLMOVE=2; (* way to move after leftclick before pull start *) STARTPULLZOOM=5; (* way to move after shift leftclick before zooming *) HINTJITTER=8; SPOO=SP6+SP6; MOP0=346C; (* proportional off *) MOP1=347C; (* color background yellow *) MOP2=350C; (* color background 1 button *) MOP3=351C; (* highlite off *) MOP4=352C; (* color background whole line *) MOP5=353C; (* color background red *) MOP6=354C; MOP7=355C; (* color background blue *) MOP8=356C; (* dimm text *) MOP9=357C; (* hilite whole line *) iMAXIMIZED="M"; iICON="I"; STATUSHINT=17; SYMCHFRAME=SP2; -- OVERSHOOT=WHITELEVEL*3; (* fast white level limiter via table *) TRANSPARENCE=MAX(CARD16); NL=12C; POTIFPS=10; TOOLBARX=31; TOOLBARID=255; LOGMENUID=227; SENDMSGID=228; CONFIGEDITID=229; HINTWINID=220; FIXPOSIDS=200; (* window id > is fixed position *) BUBBLWINID=FIXPOSIDS+1; PANOWINID=FIXPOSIDS+2; OVERLAYID=FIXPOSIDS+3; (* overlay symbol chooser id *) DIGIEDITID=224; BEACONEDITID=226; LISTWINID=225; -- ZOOMTO=7C; -- BLOWOK=11C; CURSESC=33C; MAPCLICK=201C; SYMCLICK=202C; TEXTCLICK=203C; TRACKCLICK=204C; ADDWATCH=205C; TOOLBAR=206C; DELWATCH=210C; CONFIGM2=211C; NOTYET=212C; TOOLOFF=214C; TOOLON=215C; -- CMDRDLOG=216C; (* in def *) FILEMENU=217C; TOOLSMENU=220C; HELPMENU=221C; LISTMENU=222C; CURSDOWNM=224C; CURSUPPM =225C; CURSDOWNPM=226C; CONFSAVE=227C; CONFLOAD=230C; CONFCLICK=231C; WXCLICK=232C; DOPOTIS=233C; CONFSYM=234C; FILERDLOG=235C; -- CMDDOWNLOAD=237C; (* in def *) STOPDOWNLOAD=240C; DOWNLOADMAP=241C; -- CMDSTARTDOWNLOAD=242C; (* in def *) MSGOK=243C; CONFBSYM=244C; -- CMDFIND=245C; (* in def *) LISTDEBUG=246C; LISTINGS=247C; LISTUSERMSGS=250C; SETMARKERS=251C; SETMARKERSMAP=252C; DODIRECTCONF=336C; CMDRELOADMAP=236C; CMDADDBEACON=223C; CMDDOBEACON=213C; CMDFPS=6C; CMDWATCHDO=253C; CMDMSG=254C; CMDSENDMSG=255C; CMDCOMPOMSG=256C; CMDMANMSG=257C; CMDDOMSG=260C; CMDSAVETRACK=261C; CMDCONFIG=262C; CMDCONFIGMAN=263C; CMDMAINCFG=264C; CMDMANFILT=265C; CMDCONFIGDEL=266C; CMDCONFDELMAN=267C; CMDONLINE=270C; CMDRF=271C; CMDMAP=272C; CMDDOTIMERS=273C; CMDDOMAP=274C; CMDDOMOVE=275C; CMDONCLICK=276C; CMDSTATUS=277C; CMDRAIN=300C; CMDMAPADD=301C; CMDMAPCHOOSE=302C; CMDMAPDIR=303C; CMDDOBEEP=304C; CMDHELPTEXT=305C; CMDDOHELP=306C; -- CMDZOOMSQUARE=307C; (* in def *) -- CMDFZOOMIN=310C; (* in def *) -- CMDFZOOMOUT=311C; (* in def *) -- CMDVIDEO=312C; (* in def *) CMDGEOPROFIL=313C; CMDDIGILINE=314C; CMDDIGIED=315C; CMDCOLOURS=316C; CMDCOLOURCLICK=317C; CMDENTEROK=320C; CMDCOLOURSGEO=321C; CMDFILE=323C; CMDSPECIALMAP=324C; CONFONESYM=325C; CHOOSEONESYM=326C; HOVERCLICK=327C; CMDHEARD=330C; CMDPOLIGON=331C; CMDCLONE=332C; CONFPOISYM=333C; CHOOSECONFPOISYM=334C; -- CONFPOISYMFIND=335C; (* in def *) TYPE pCONFLINE=POINTER TO CONFLINE; CONFLINE=RECORD next:pCONFLINE; active:CARD8; line:ARRAY[0..CONFIGWIDTH] OF CHAR; END; CONFIGTYP=(cBOOL, cLINE, cBLINE, cLIST, cBLIST); CONFIG=RECORD typ:CONFIGTYP; updated:BOOLEAN; (* updated by editor *) title:ARRAY[0..30] OF CHAR; curspos, width:CARD16; on:CARD8; hint:CARDINAL; lines:pCONFLINE; END; BACKGROUND=(bBLACK, bCOLOR, bTRANSP); XPIX16=CARD16; XPIX32=CARDINAL; SET8=SET OF [0..7]; SET16=SET OF [0..15]; MINMAXNORMAL=(NORMAL, MINIMIZED, MAXIMIZED); pMENU=POINTER TO MENU; sMENULINES=SET OF [0..MAXKNOBS]; MENU=RECORD next:pMENU; image:pIMAGE; yknob, x0, y0, xsize, ysize, nowx, nowy, (* real position while on screen *) oldknob, hiknob, oldsub, wid, (* window class id *) scroll:CARDINAL; (* lines in window shifted *) minnormmax, (* minimized normal maximized *) sizeconf, (* store to this config when resized *) pullconf:CONFSET; (* pull menu on and store in config *) pullyknob:CARDINAL; (* click size from top to move window *) scrysize, scrxsize:CARDINAL; (* lines collumns *) scrx, scry:INTEGER; (* pixel lines*linehight *) redrawproc:PROCEDURE(pMENU); timeout:TIME; notoverdraw, drawn, hidden, fullclamp, saveimage:BOOLEAN; (* clamp win for cursor scrolling *) background:BACKGROUND; submen:ARRAY[0..MAXKNOBS] OF BOOLEAN; cmds:ARRAY[0..MAXKNOBS] OF CHAR; helpindex:ARRAY[0..MAXKNOBS] OF CARD16; confidx:ARRAY[0..MAXKNOBS] OF CARD8; subk :ARRAY[0..MAXKNOBS] OF ARRAY[0..MAXSUBKNOBS] OF CARD16; nohilite, noprop, clampkb:sMENULINES; (* use keyboard *) END; pLISTLINE=POINTER TO LISTLINE; LISTLINE=RECORD next, fnext :pLISTLINE; position:POSITION; (* to show marker on map *) call :MONCALL; (* to sort by call *) time :TIME; (* to sort by time *) withport:BOOLEAN; (* first char is a port to colorize *) markcp, startcp, (* c/p highlight *) endcp, len :CARDINAL; (* for dealloc *) text :ARRAY[0..500] OF CHAR; END; LISTBUFFER=RECORD newlines, (* count lines to compensate v scroll position *) listlinecnt:CARDINAL; sortby:BOOLEAN; isicon, xy, size:CONFSET; listlines :pLISTLINE; listwintitle: ARRAY[0..30] OF CHAR; -- winid:CARDINAL; END; VAR leftbutton, rightbutton, overtype, sndmsg, digied, hinton, hoveropen, poioff:BOOLEAN; redrawimg:pIMAGE; clampedline, (* on click to a clamped text line set cursor*) dellog, focuswid, (* window class last touched with pointer *) helpdepth, configedit, mouseshowcnt, poinameline:CARDINAL; menus:pMENU; hinttime:TIME; findmouse, hintmouse:MOUSEPOS; (* store mouse to close hover hints if moved a radius away *) hintnum:CARDINAL; helpscroll:ARRAY[0..HELPDEPTH] OF ARRAY[0..40] OF CHAR; configs:ARRAY[MIN(CONFSET)..MAX(CONFSET)] OF CONFIG; pullmenuwhat:CHAR; (* store what should be moved on a menu at pull startpoint *) pullmenuwid, cpendx, cpendy, pullmenux, pullmenuy:INTEGER; listbuffer, monbuffer:LISTBUFFER; panowin:PANOWIN; digiedline:ARRAY[0..CONFIGWIDTH] OF CHAR; listfilt:RECORD str:ARRAY[0..30] OF CHAR; pos:CARDINAL; END; PROCEDURE startcheckvers; VAR s,h:ARRAY[0..1023] OF CHAR; fd:File; i:INTEGER; BEGIN IF checkversion.runs THEN CheckProg(checkversion); --WrInt(checkversion.exitcode, 1); WrInt(ORD(checkversion.runs), 2); WrStrLn(" exc0"); IF checkversion.runs THEN CheckProg(checkversion); --WrInt(checkversion.exitcode, 1); WrInt(ORD(checkversion.runs), 2); WrStrLn(" exc1"); IF checkversion.runs THEN xerrmsg("Check Version in Progress") END; END; END; IF NOT checkversion.runs THEN h:=""; fd:=OpenRead(CHECKVERSFN); IF FdValid(fd) THEN i:=RdBin(fd, h, SIZE(h)); Close(fd); IF i<0 THEN h:=""; xerrmsg("Can not read ["+CHECKVERSFN+"]") ELSIF i<=VAL(INTEGER,HIGH(h)) THEN h[i]:=0C END; ELSE xerrmsg("File ["+CHECKVERSFN+"] not found") END; s:=""; i:=0; WHILE (i<=VAL(INTEGER,HIGH(h))) & (h[i]<>0C) DO IF h[i]="$" THEN Append(s, VERSNUM) ELSE Append(s, h[i]) END; INC(i); END; --WrStrLn(s); StartProg(s, checkversion); IF checkversion.runs THEN CheckProg(checkversion); --WrInt(checkversion.exitcode, 1); WrInt(ORD(checkversion.runs), 2); WrStrLn(" exc2"); IF checkversion.exitcode<>0 THEN h:="Cannot Start ["; Append(h, s); Append(h,"] exit code:"); IntToStr(checkversion.exitcode, 0, s); Append(h, s); xerrmsg(h); END; END; END; END startcheckvers; PROCEDURE Tilegamma(gamma:REAL); VAR i:CARDINAL; v:REAL; BEGIN IF gamma<0.01 THEN gamma:=0.01 ELSIF gamma>50.0 THEN gamma:=50.0 END; FOR i:=0 TO HIGH(lums.maplumcorr) DO IF i=0 THEN v:=0.0 ELSE v:=exp(ln(FLOAT(i)/256.0)/gamma)*1024.5 END; IF v<=0.0 THEN v:=0.0 ELSIF v>1024.0 THEN v:=1024.0 END; lums.maplumcorr[i]:=trunc(v); END; END Tilegamma; PROCEDURE inclim(n, d, min:INTEGER):INTEGER; (* inc CARD INT with limit to min *) BEGIN INC(n, d); IF nNIL THEN DEC(debugmem.screens, SIZE(image^)); DISPOSE(image); image:=NIL; END; END disposeimg; PROCEDURE allocimage(VAR image:pIMAGE; x, y:INTEGER; save:BOOLEAN); BEGIN IF save THEN IF image<>NIL THEN disposeimg(image) ELSE image:=panoimage; panoimage:=NIL; END END; IF (image<>NIL) & ((x<>VAL(INTEGER, HIGH(image^)+1)) OR (y<>VAL(INTEGER, HIGH(image^[0])+1))) THEN disposeimg(image) END; IF image=NIL THEN NEW(image, x, y); debugmem.req:=SIZE(image^); INC(debugmem.screens, debugmem.req); IF image=NIL THEN WrStrLn("image out of memory"); wrheap; HALT END; IF verb THEN wrheap END; ELSE clr(image) END; END allocimage; PROCEDURE daylylogsize(fname-:ARRAY OF CHAR; VAR lenstr:ARRAY OF CHAR):INTEGER; VAR fnd,fn:FILENAME; t:TIME; fc:File; size:REAL; ret:INTEGER; BEGIN Assign(fn, fname); t:=realtime; size:=0.0; ret:=-1; REPEAT fnd:=fn; logfndate(t, fnd); IF fnd=fn THEN RETURN -1 END; (* not dayly log *) fc:=OpenRead(fnd); IF FdValid(fc) THEN ret:=0; size:=size + VAL(REAL,(Size(fc))); Close(fc); END; DEC(t, 3600*24); UNTIL t0.0 THEN ret:=1 END; RETURN ret END daylylogsize; PROCEDURE guesssize(fn-:ARRAY OF CHAR; VAR lenstr:ARRAY OF CHAR):INTEGER;(* return filsize in kb not exact >2gb *) VAR fc:File; pos, byte:CARDINAL; b:CHAR; s:ARRAY[0..99] OF CHAR; ret:INTEGER; BEGIN ret:=daylylogsize(fn, lenstr); IF ret>=0 THEN RETURN ret END; (* dayly log *) lenstr[0]:=0C; fc:=OpenRead(fn); IF NOT FdValid(fc) THEN RETURN -1 END; pos:=0; LOOP Seekcur(fc, 1000000000); (* seek in 100mb steps for eof *) IF RdBin(fc, b, 1)<>1 THEN EXIT END; INC(pos, 128*1024); END; IF pos<2000000 THEN byte:=Size(fc); pos:=byte DIV 1000 END; Close(fc); -- make text kb mb gb... IF pos<100 THEN s:="B"; pos:=byte; ELSE s:="kB"; IF pos>4000 THEN pos:=pos DIV 1000; s:="MB" END; IF pos>4000 THEN pos:=pos DIV 1000; s:="GB" END; END; CardToStr(pos, 0, lenstr); Append(lenstr, s); RETURN pos END guesssize; PROCEDURE AddConfLine(v:CONFSET; act:CARD8; s-:ARRAY OF CHAR); VAR pl:pCONFLINE; BEGIN IF v<=MAX(CONFSET) THEN --WrInt(ORD(configs[v].on), 5);WrStrLn(configs[v].title); configs[v].on:=act; IF configs[v].typ<>cBOOL THEN IF (s[0]<>0C) OR (configs[v].typ<=cBLINE) THEN (* not add list empty lines *) pl:=configs[v].lines; IF configs[v].typ>=cLIST THEN WHILE (pl<>NIL) & NOT StrCmp(pl^.line, s) DO pl:=pl^.next END; END; IF pl=NIL THEN (* not same text in table *) ALLOCATE(pl, SIZE(pl^)); IF pl=NIL THEN WrStrLn("menu out of memory"); wrheap; RETURN END; FILL(pl, 0C, SIZE(pl^)); pl^.next:=configs[v].lines; configs[v].lines:=pl; END; Assign(pl^.line, s); pl^.active:=act; END; END; --WrStr(configs[v].title); WrStr(configs[v].lines^.line); WrInt(ORD(configs[v].lines^.active), 2); WrLn; END; END AddConfLine; PROCEDURE icfg(v:CONFSET; s-:ARRAY OF CHAR); BEGIN AddConfLine(v, 0, s) END icfg; PROCEDURE int2cfg(cfg:CONFSET; v:INTEGER); VAR s:ARRAY[0..30] OF CHAR; BEGIN IntToStr(v, 0, s); icfg(cfg, s); END int2cfg; PROCEDURE clrconfig; BEGIN FILL(ADR(configs), 0C, SIZE(configs)) END clrconfig; PROCEDURE initc(v:CONFSET; tit-:ARRAY OF CHAR; t:CONFIGTYP; text-:ARRAY OF CHAR; o:BOOLEAN; hi:CARDINAL); BEGIN WITH configs[v] DO Assign(title, tit); typ:=t; on:=ORD(o); hint:=hi+MINH*200; END; IF text[0]<>0C THEN AddConfLine(v, ORD(o), text) END; END initc; PROCEDURE initconfig1; BEGIN initc(fTFADE, "Time Fade Out Min", cLINE, "30", FALSE, 155); initc(fTFULL, "Time Full Bright Min", cLINE, "360", FALSE, 160); initc(fLWAY, "Brightness Waypoint", cLINE, "75", FALSE, 175); initc(fTRANSP, "Menu Background", cBLINE,"75", TRUE, 180); initc(fLTEXT, "Brightness Text", cLINE, "70", FALSE, 185); initc(fLSYM, "Brightness Symbol", cLINE, "95", FALSE, 190); initc(fLTRACK, "Brightness Track", cLINE, "65", FALSE, 195); initc(fLOBJ, "Brightness Object", cLINE, DEFAULTLUMOBJ, FALSE, 200); initc(fLMAP, "Brightness Map", cLINE, "30", FALSE, 205); initc(fLRF, "Brightness Heard Path", cLINE, "35", FALSE, 210); initc(fNOMOV, "Brightness Nomover", cLINE, "9", FALSE, 215); initc(fOBJTRACK, "Show Object Track", cBOOL, "", FALSE, 217); initc(fGAMMA, "Screen Gamma", cLINE, "2.2", FALSE, 225); initc(fMOUSELOC, "Mouse-Over function", cBLINE, "9", TRUE, 240); initc(fDUPDEL, "Filter delayed Waypoints Min",cLINE, "180", FALSE, 250); initc(fARROW, "Show Coursearrow", cBOOL, "", TRUE , 255); initc(fINVMOV, "Swap Left/Right Up/Down", cBOOL, "", FALSE, 260); initc(fRULER, "Show Scale", cBOOL, "", TRUE, 265); initc(fKMHTIME, "Km/h Show Time", cLINE, "600", FALSE, 270); initc(fTEMP, "Show Temperature", cBOOL, "", TRUE, 275); initc(fWINDSYM, "Show Wind Vane", cBOOL, "", TRUE, 280); initc(fTIMESTAMP, "Symbol Timestamp", cBOOL, "", FALSE, 282); initc(fALTMIN, "Altitude Show min m", cBLINE, "-10000", FALSE, 285); initc(fMOVESTEP, "Map Move Stepwidth", cLINE, "10", FALSE, 325); initc(fZOOMSTEP, "Finezoom Stepwidth", cLINE, "0.1", FALSE, 330); initc(fCLICKMAP, "Click Map", cLINE, "m", FALSE, 335); initc(fCLICKSYM, "Click Sym", cLINE, CFGRAWDECODED, FALSE, 340); initc(fCLICKWXSYM, "Click Wxsym", cLINE, "0111111111u"+CFGRAWDECODED, FALSE, 345); initc(fCLICKTEXT, "Click Text", cLINE, CFGHEARD, FALSE, 350); initc(fCLICKTRACK, "Click Track", cLINE, CMD1USER+CFGRAWDECODED,FALSE,355); initc(fHOVERSET, "Hover Set", cLINE, CFGRAWDECODED, FALSE, 356); initc(fMARKPOS, "Marker1", cLINE, "", FALSE, 420); initc(fGEOPROFIL, "Geoprofile", cBOOL,"", FALSE, 421); (* do not change order *) initc(fCOLMAPTEXT, "Colour Maptext", cLINE, "100 100 100", FALSE,491); initc(fCOLOBJTEXT, "Colour Objecttext", cLINE, "60 100 100", FALSE,491); initc(fCOLMENUTEXT, "Colour Menutext", cLINE, "100 100 100", FALSE,491); initc(fCOLMENUBACK, "Colour Background", cLINE, "100 100 100", FALSE,491); initc(fCOLMARK1, "Colour Rf Marker1", cLINE, "100 20 0", FALSE,491); initc(fCOLMARK2, "Colour Rf Marker2", cLINE, "0 100 100", FALSE,491); (* do not change order *) END initconfig1; PROCEDURE initconfig; VAR i:CONFSET; s:ARRAY[0..99] OF CHAR; pl, ph:pCONFLINE; BEGIN FOR i:=MIN(CONFSET) TO MAX(CONFSET) DO pl:=configs[i].lines; WHILE pl<>NIL DO ph:=pl^.next; DEALLOCATE(pl, SIZE(pl^)); pl:=ph; END; END; clrconfig; FOR i:=MIN(CONFSET) TO MAX(CONFSET) DO configs[i].width:=SIZE(configs[i].lines^.line); END; initc(fTPURGE, "Keep Data in Memory Min", cLINE, "1500", FALSE, 165); initc(fTPURGEOBJ, "Keep Objects in Memory Min", cLINE, "180", FALSE, 170); initc(fTRACKFILT, "Trackfilter", cBOOL, "", TRUE, 245); initc(fWATCH, "Watch Calls", cLIST, "", FALSE, 5); initc(fAPPROXY, "Approxy Warn (km)", cBLINE,"", FALSE, 5); initc(fFIND, "Find Call or Locator", cLIST, "", FALSE, 10); initc(fLOGWFN, "WriteLogfilename", cBLINE,"logs"+DIRSEP+"rawlog%d", TRUE, 15); initc(fLOGDAYS, "Delete Log Days", cLINE, "31", FALSE, 17); initc(fLOGFN, "ImportLogfilename", cLINE, "", FALSE, 20); DateToStr(realtime, s); s[16]:=0C; initc(fLOGDATE, "Start yyyy.mm.dd hh:mm", cLINE, s, FALSE, 25); configs[fLOGDATE].width:=17; initc(fLOGFIND, "Find Call In Log", cLINE, "", FALSE, 30); configs[fLOGFIND].width:=10; initc(fFOTOFN, "Screenshotfile"+SHOTFORMATS, cLINE, "", FALSE, 35); initc(fDIRECTCONF, "Directconf", cLINE, "", FALSE, 36); initc(fXYSIZE, "Windowsize X Y", cLINE, "600 400", FALSE,40); initc(fMYCALL, "MyCall", cLINE, "", FALSE, 60); initc(fMYPOS, "MyPos", cLINE, "0000.00N/00000.00E", FALSE, 65); initc(fRBTEXT, "RfBeacons", cBLIST,"", FALSE, 70); initc(fRBTYP, "Beacontype", cLINE, "B",FALSE, 71); configs[fRBTYP].width:=1; initc(fRBNAME, "Objectname", cLINE, "", FALSE, 72); configs[fRBNAME].width:=9; initc(fRBSYMB, "Symbol", cLINE, "/-", FALSE, 73); configs[fRBSYMB].width:=2; initc(fRBPOS, "Position", cLINE, "", FALSE, 74); initc(fRBPOSTYP, "RfBeaconPosType", cLINE, ENCODEGPS, FALSE,75); configs[fRBPOSTYP].width:=1; initc(fRBALT, "Altitude(m NN)", cLINE, "", FALSE, 76); initc(fRBSPEED, "Speed (km/h)", cLINE, "", FALSE, 77); initc(fRBDIR, "Direction (deg)", cLINE, "", FALSE, 78); initc(fRBCOMMENT, "Comment", cLINE, "", FALSE, 79); initc(fRBTIME, "Intervall (s)", cLINE, "3600", FALSE, 80); initc(fRBPORT, "RfBeaconPort", cLINE, "1", FALSE, 81); configs[fRBPORT].width:=1; initc(fRBPATH, "Via Path", cLINE, "-1", FALSE, 82); initc(fRBDEST, "Destination", cLINE, DESTCALL, FALSE, 82); configs[fRBDEST].width:=9; initc(fNBTEXT, "Net Beacontext", cLINE, "aprsmap", FALSE, 83); initc(fMYSYM, "My Symbol", cLINE, "/-", FALSE, 84); configs[fMYSYM].width:=2; initc(fNETBTIME, "Netbeacontime (s)", cLINE, "600", FALSE, 85); initc(fRFBTSHIFT, "Rfbeaconshift (s)", cLINE, "120", TRUE, 90); initc(fSERVERURL, "AprsIs-URL", cBLIST, "", FALSE, 95); initc(fSERVERFILT, "AprsIs-Filter", cLINE, "m/200", FALSE, 100); initc(fPW, "PassCode", cLINE, "", FALSE, 105); initc(fCONNECT, "Connect Server", cBOOL, "", FALSE, 110); initc(fALLOWGATE, "Allow Gateing RFtoNET", cBLINE, "1234", FALSE, 115); initc(fALLOWNETTX, "Allow Tx to NET", cBOOL, "", TRUE, 120); initc(fUDP1, "UDP1(ip:send:listen)", cBLINE, "127.0.0.1:9001:9002", FALSE, 125); initc(fUDP2, "UDP2(ip:send:listen)", cBLINE, "", FALSE, 130); initc(fUDP3, "UDP3(ip:send:listen)", cBLINE, "", FALSE, 135); initc(fUDP4, "UDP4(ip:send:listen)", cBLINE, "", FALSE, 140); initc(fSERIALTASK, "Serial Task", cBLINE, SERIAL1, FALSE, 137); initc(fSERIALTASK2,"Serial Task2", cBLINE, SERIAL2, FALSE, 137); initc(fDIGI, "Digipeater", cBLIST, "", FALSE, 139); initc(fDIGITIME, "block same Content [s]", cLINE, "890", FALSE, 140); initc(fDIGIRADIUS, "from Radius [km]", cLINE, "30000", FALSE, 140); initc(fDIGIVIA, "Via Alias", cLINE, "RELAY ECHO", FALSE, 140); initc(fDIGINN, "N-n Words", cLINE, "WIDE TRACE", FALSE, 140); initc(fDIGIX, "block if in Path", cLINE, "TCPIP NOCALL", FALSE, 140); initc(fVIDEOCMD, "Videocompress Cmd", cLINE, "", FALSE, 145); initc(fOSMDIR, "Map Directory Path", cLINE, "osm", FALSE, 150); initc(fDELAYGETMAP,"Delay Start Loadmap s", cLINE, "0", FALSE, 172); initc(fCENTER, "Center Watch Object", cLINE, "100", FALSE, 220); initc(fALLOWEXP, "Allow Expand Tile", cBOOL, "", TRUE, 230); initc(fZOOMMISS, "Autozoom up to having Tiles",cBOOL, "", FALSE, 235); initc(fONESYMB, "Show One Symbol", cLINE, "", FALSE, 271); initc(fDEFZOOM, "Default Zoom", cLINE, "14", FALSE, 290); initc(fANIMSPEED, "Animation Speed", cLINE, "200", FALSE, 295); initc(fVIDEOFAST, "Video Accel Delay", cLINE, "0", FALSE, 300); initc(fFONTSIZE, "Fontsize", cLINE, "13 8 140",FALSE, 302); initc(fVIEW, "View", cLIST, "", FALSE, 305); initc(fMAXZOOM, "Max Zoom", cLINE, "18", FALSE, 310); initc(fDOWNLOADZOOM,"Download to Zoom", cLINE, "", FALSE, 315); initc(fGETMAPS, "Get Map Program", cBLINE, MAPLOADER, TRUE, 320); initc(fMAPNAMES, "Map Names", cBLIST, "", FALSE, 322); initc(fMSGRFDEST, "MsgRfdestcall", cLINE, "NOGATE", FALSE,360); configs[fMSGRFDEST].width:=9; initc(fMSGNETDEST, "MsgNetdestcall", cLINE, DESTCALL, FALSE,365); configs[fMSGNETDEST].width:=9; initc(fMSGPATH, "Msg Path", cLINE, "2", FALSE, 370); initc(fPOPUPMSG, "Popupmsg", cBOOL, "", TRUE, 372); initc(fMSGALLSSID, "Show All Msg SSID", cBOOL, "", TRUE, 374); initc(fPASSSELFMSG,"Show Msg To Myself", cBOOL, "", FALSE, 376); initc(fQUERYS, "Querys", cBLIST,"", FALSE, 380); initc(fKMH, "Km/h Text", cBLINE, "km/h", TRUE, 385); initc(fWRINCOM, "Monitor InOut", cLINE, "1234", FALSE,388); initc(fWRTICKER, "Show Headline", cBLINE, TICKERHEADLINE, FALSE, 390); initc(fLOCALTIME, "Local Time h", cLINE, "0", FALSE, 395); initc(fOBJSRCFILT, "Obj Source Filter", cBLIST, "", FALSE, 400); initc(fIGATEFILT, "Igate Filter", cBLIST, "", FALSE, 405); initc(fFINGERPRINT,"Bad Paths Ports", cLINE, "", FALSE, 407); initc(fOPFILT, "Call Filter", cBLIST, "", FALSE, 410); initc(fSTRFILT, "Comment Filter", cBLIST, "", FALSE, 415); initc(fDESTFILT, "Destination Filter", cBLIST, "", FALSE, 417); initc(fRAWFILT, "Raw Frame Filter", cBLIST, "", FALSE, 418); initc(fMUSTBECALL, "Callcheck", cBOOL, "", FALSE, 420); initc(fGEOBRIGHTNESS,"Brightness", cLINE,"30", FALSE, 422); initc(fGEOCONTRAST,"Contrast", cLINE,"5", FALSE, 423); initc(fREFRACT, "Refraction Factor", cLINE,"0.25", FALSE, 424); initc(fFRESNELL, "MHz", cLINE,"2425.0", FALSE, 425); initc(fANT1, "Antenna 1 m", cLINE,"10", FALSE, 426); initc(fANT2, "Antenna 2 m", cLINE,"10", FALSE, 427); initc(fANT3, "Antenna 3 m", cLINE,"10", FALSE, 428); initc(fPANOSIZE, "Panorama x y", cLINE, "", FALSE, 460); initc(fPANOPOS, "Panopos x y", cLINE, "", FALSE, 460); initc(fSRTMCACHE, "Srtmcache MByte", cBLINE,"100", FALSE, 431); initc(fBEEPPROX, "Bell on Approxy", cBLINE,"400 40 2000 1000", TRUE, 428); initc(fBEEPWATCH, "Bell on Watchcall", cBLINE,"350 50", TRUE,429); initc(fBEEPMSG, "Bell on Message/Ack", cBLINE,"800 500 1000 100", TRUE, 430); initc(fMSGTO, "To Call", cLINE, "", FALSE, 435); configs[fMSGTO].width:=9; initc(fMSGTEXT, "MsgText", cLINE, "", FALSE, 431); configs[fMSGTEXT].width:=MSGSIZE; initc(fMSGPORT, "To Port", cLINE, "A", FALSE, 435); configs[fMSGPORT].width:=1; initc(fMENUXYEDIT, "Line editor x y", cLINE, "", FALSE, 440); initc(fMENUXYMSG, "Message editor x y", cLINE, "", FALSE, 445); initc(fMENUXYBEACON,"Beacon editor x y", cLINE, "", FALSE, 450); initc(fMENUXYDIGI, "Digi editor x y", cLINE, "", FALSE, 451); initc(fMENUXYSTATUS,"Statusbar x y", cLINE, "", FALSE, 455); initc(fMENUXYLIST, "Listwindow x y", cLINE, "", FALSE, 460); initc(fMENUXYLISTMIN,"Listwindowmin x y", cLINE, "32000 32000", FALSE, 465); initc(fMENULISTICON,"Listwindowicon", cLINE, "", FALSE, 470); initc(fMENUSIZELIST,"Listwindow size", cLINE, "300 200",FALSE,475); initc(fMENUMONICON, "Monwindowicon", cBLINE, "", TRUE, 480); initc(fMENUXYMON, "Monwindow x y", cLINE, "", FALSE, 485); initc(fMENUSIZEMON, "Monwindow size", cLINE, "300 100", FALSE,490); initc(fPOIFILTER, "Filter", cLIST, "", FALSE, 492); initc(fPOISMBOLS, "PoiSymbols", cBLIST,"", FALSE, 493); initc(fFOLLOW, "Follow What", cLINE, "2", FALSE, 497); initc(fAUTOSAVE, "Save Config On Quit", cBOOL, "", TRUE, 495); initc(fEDITLINE, "", cLINE, " ", FALSE, 499); initconfig1; END initconfig; PROCEDURE isbool(typ:CONFIGTYP):BOOLEAN; BEGIN RETURN (typ=cBOOL) OR (typ=cBLINE) OR (typ=cBLIST) END isbool; PROCEDURE configon(v:CONFSET):BOOLEAN; BEGIN IF configs[v].typ=cBOOL THEN RETURN configs[v].on>0 ELSIF (configs[v].typ=cBLINE) & (configs[v].lines<>NIL) THEN RETURN configs[v].lines^.active>0; ELSE RETURN FALSE END; END configon; PROCEDURE configson(v:CONFSET; line:CARDINAL):BOOLEAN; VAR pl:pCONFLINE; BEGIN pl:=configs[v].lines; LOOP IF pl=NIL THEN EXIT END; IF line=0 THEN RETURN pl^.active>0 END; DEC(line); pl:=pl^.next; END; RETURN FALSE END configson; PROCEDURE linenoton(pl:pCONFLINE); BEGIN IF pl<>NIL THEN pl^.active:=ORD(pl^.active=0) END; END linenoton; PROCEDURE configdelman(cfg:CONFSET; num, n:CARDINAL); (* 1 on/off, 2 move to editline, 3 del, first n is 1 *) VAR pl, po:pCONFLINE; BEGIN pl:=NIL; IF ORD(cfg)<=HIGH(configs) THEN pl:=configs[cfg].lines END; po:=NIL; WHILE (n>1) & (pl<>NIL) DO po:=pl; pl:=pl^.next; DEC(n) END; IF pl<>NIL THEN IF num=1 THEN linenoton(pl) ELSIF (num=2) OR (num=3) THEN IF po<>NIL THEN po^.next:=pl^.next ELSE configs[cfg].lines:=pl^.next END; IF num=2 THEN icfg(fEDITLINE, pl^.line) END; (* save deleted to editline *) DEALLOCATE(pl, SIZE(pl^)); END; END; refresh:=TRUE; END configdelman; PROCEDURE updatepoisyms; VAR i:CARDINAL; s:ARRAY[0..999] OF CHAR; BEGIN LOOP confstrings(fPOISMBOLS, 0, TRUE, s); IF s[0]=0C THEN EXIT END; configdelman(fPOISMBOLS, 3, 0); END; i:=0; WHILE (i<=HIGH(poifiles)) & (poifiles[i].name[0]<>0C) DO IF (poifiles[i].symbol[0]<>DEFAULTPOISYMBOL[0]) OR (poifiles[i].symbol[1]<>DEFAULTPOISYMBOL[1]) THEN Assign(s, poifiles[i].symbol); Append(s, poifiles[i].name); AddConfLine(fPOISMBOLS, 0, s); END; INC(i); END; END updatepoisyms; PROCEDURE saveconfig; CONST ESC="~"; VAR fd:File; h, backupfn:ARRAY[0..999] OF CHAR; i:CONFSET; pl:pCONFLINE; n, j:CARDINAL; c:CHAR; BEGIN IF click.marktime=0 THEN postostr(click.markpos, "3", h) ELSE h:="" END; AddConfLine(fMARKPOS, 1, h); cleanfilename(lums.configfn); updatepoisyms; (* IF Exists(lums.configfn) THEN (* make config backup *) Assign(backupfn, lums.configfn); Append(backupfn, "~"); Rename(lums.configfn,backupfn); END; *) Assign(backupfn, lums.configfn); <* IF TARGET_FAMILY="UNIX" THEN *> Append(backupfn, "~"); (* write temp file and rename later *) <* END *> fd:=OpenWrite(backupfn); IF NOT FdValid(fd) THEN h:=LF+"Can not write "; Append(h, backupfn); Append(h, LF); textautosize(0, 0, 6, 4, "e", h); refresh:=TRUE; RETURN END; FOR i:=MIN(CONFSET) TO MAX(CONFSET) DO IF (configs[i].title[0]<>0C) & (i<>fEDITLINE) THEN n:=0; pl:=configs[i].lines; WHILE pl<>NIL DO pl:=pl^.next; INC(n) END; LOOP pl:=configs[i].lines; FOR j:=2 TO n DO pl:=pl^.next END; Assign(h, configs[i].title); c:="0"; IF (configs[i].typ=cLIST) OR (configs[i].typ=cBLIST) THEN IF pl<>NIL THEN c:=CHR(pl^.active MOD 8 + ORD("0")) END; ELSE c:=CHR(configs[i].on MOD 8 + ORD("0")) END; IF c="0" THEN Append(h, "||") ELSE Append(h, "|"); Append(h, c);Append(h, "|"); END; IF pl<>NIL THEN j:=0; WHILE (j0C) DO c:=pl^.line[j]; IF c<" " THEN Append(h, ESC); c:=CHR(ORD(c)+64); ELSIF c="|" THEN Append(h, ESC); c:="/"; ELSIF c=ESC THEN Append(h, ESC) END; Append(h, c); INC(j); END; END; <* IF TARGET_FAMILY="WIN32" THEN *> Append(h, CR+LF); <* ELSE *> Append(h, LF); <* END*> WrBin(fd, h, Length(h)); IF n<=1 THEN EXIT END; DEC(n); END; END; END; Close(fd); <* IF TARGET_FAMILY="UNIX" THEN *> Rename(backupfn, lums.configfn); <* END *> textautosize(0, 0, 6, 4, "b", "Config Saved"); rdlums; END saveconfig; PROCEDURE conflineno(v:CONFSET; lineno:CARDINAL; all:BOOLEAN; VAR pl:pCONFLINE); BEGIN pl:=configs[v].lines; LOOP IF pl=NIL THEN EXIT END; IF all OR (pl^.active>0) THEN IF lineno=0 THEN EXIT END; DEC(lineno); END; pl:=pl^.next; END; END conflineno; PROCEDURE confstrings(v:CONFSET; lineno:CARDINAL; all:BOOLEAN; VAR s:ARRAY OF CHAR); VAR pl:pCONFLINE; BEGIN conflineno(v, lineno, all, pl); IF pl<>NIL THEN Assign(s, pl^.line) ELSE s[0]:=0C END; END confstrings; PROCEDURE confstr(v:CONFSET; VAR s:ARRAY OF CHAR); BEGIN confstrings(v, 0, TRUE, s) END confstr; PROCEDURE confflags(v:CONFSET; lineno:CARDINAL):CARD8; VAR pl:pCONFLINE; BEGIN IF (configs[v].typ=cBLIST) OR (configs[v].typ=cLIST) THEN conflineno(v, lineno, TRUE, pl); IF pl<>NIL THEN RETURN pl^.active ELSE RETURN 0 END; ELSE RETURN configs[v].on END; END confflags; PROCEDURE str2config(st-:ARRAY OF CHAR; viacli:BOOLEAN):BOOLEAN; CONST ESC="~"; VAR h, s:ARRAY[0..999] OF CHAR; i:CONFSET; c:CHAR; titmod, j, p:CARDINAL; on:CARD8; BEGIN titmod:=0; h[0]:=0C; p:=0; WHILE (p<=HIGH(st)) & (st[p]<>0C) DO c:=st[p]; IF c=LF THEN IF titmod=2 THEN j:=0; FILL(ADR(s), 0C, SIZE(s)); WHILE (j0C) DO c:=h[j]; IF c=ESC THEN INC(j); c:=h[j]; IF (c>=CHR(64)) & (c<=CHR(96)) THEN c:=CHR(ORD(c)-64); ELSIF c="/" THEN c:="|" END; END; Append(s, c); INC(j); END; IF viacli THEN setcfg(i, 0, s, on); IF i=fFONTSIZE THEN loadfont; killallmenus; say(fontloadmsg, 6, "b") END; ELSE AddConfLine(i, on, s) END; (* set alwasy first enty in list via cli *) RETURN TRUE END; ELSIF titmod=0 THEN IF c="|" THEN IF h[0]=0C THEN RETURN FALSE END; i:=MIN(CONFSET); WHILE NOT StrCmp(h, configs[i].title) DO INC(i); IF i>MAX(CONFSET) THEN RETURN FALSE END; END; titmod:=1; on:=0; ELSIF c>=" " THEN Append(h, c) ELSE titmod:=3 END; ELSIF titmod=1 THEN IF (c="Y") OR (c="y") THEN on:=1 ELSIF (c>="0") & (c<="7") THEN on:=ORD(c)-ORD("0") ELSIF c="|" THEN titmod:=2; h[0]:=0C; END; ELSIF titmod=2 THEN IF c<" " THEN titmod:=3 ELSE Append(h, c) END; END; INC(p); END; RETURN FALSE END str2config; PROCEDURE loadconfig(verb:BOOLEAN); VAR fd:File; s:ARRAY[0..999] OF CHAR; c:CHAR; ok:BOOLEAN; BEGIN initconfig; cleanfilename(lums.configfn); fd:=OpenRead(lums.configfn); IF FdValid(fd) THEN s[0]:=0C; WHILE RdBin(fd, c, 1)=1 DO IF c<>CR THEN Append(s, c); IF c=LF THEN ok:=str2config(s, FALSE); s[0]:=0C; END; END; END; Close(fd); ELSE s:=LF+"Can not read "; Append(s, lums.configfn); Append(s, LF); textautosize(0, 0, 6, 10, "e", s); refresh:=TRUE; IF verb THEN WrStrLn(s) END; END; rdlums; confstr(fMAPNAMES, s); IF s[0]=0C THEN AddConfLine(fMAPNAMES, 1, "tiles 0.25 25"); AddConfLine(fMAPNAMES, 1, "tiles_topo 0.25 25"); AddConfLine(fMAPNAMES, 1, "tiles_cyclemap 0.25 25"); AddConfLine(fMAPNAMES, 1, "tiles_sat 0.45 100"); AddConfLine(fMAPNAMES, 1, "tiles_quest 0.25 25"); END; -- confstr(fDIGI, s); -- IF s[0]=0C THEN AddConfLine(fDIGI, 0, "*10 890 30000 nWIDE nTRACE vWIDE vRELAY vECHO xTCPIP") END; confstr(fQUERYS, s); IF s[0]=0C THEN AddConfLine(fQUERYS, 1, "?APRST:PATH=\\p"); AddConfLine(fQUERYS, 1, "?PING?:PATH=\\p"); AddConfLine(fQUERYS, 1, "?APRSP:\\l"); AddConfLine(fQUERYS, 1, "?VER:VERSION \\v"); AddConfLine(fQUERYS, 1, "?HELP:?APRST,?APRSP,?PING?,?VER"); END; confstr(fMARKPOS, s); deghtopos(s, click.markpos); closesrtmfile; (* to reread possibly updated files *) -- rdmountains(POIFILENAME, FALSE); (* to reread possibly updated file *) -- rdmountains(MYPOIFILENAME, TRUE); readpoifiles; END loadconfig; PROCEDURE DoDirectConf; VAR s:ARRAY[0..999] OF CHAR; BEGIN confstr(fDIRECTCONF, s); Append(s, LF); IF NOT str2config(s, TRUE) THEN s:=LF+"Variable not found "; Append(s, LF); textautosize(0, 0, 6, 10, "e", s); refresh:=TRUE; IF verb THEN WrStrLn(s) END; END; rdlums; resizewin(conf2int(fXYSIZE, 0, MINXSIZE, MAXXSIZE, DEFAULTXSIZE), conf2int(fXYSIZE, 1, MINYSIZE, MAXYSIZE, DEFAULTYSIZE), TRUE); END DoDirectConf; PROCEDURE confappend(v:CONFSET; VAR s:ARRAY OF CHAR); (* append a config line to string *) VAR h:ARRAY[0..999] OF CHAR; BEGIN confstr(v, h); Append(s, h); END confappend; PROCEDURE confreplace(v:CONFSET; lineno:CARDINAL; all:BOOLEAN; s-:ARRAY OF CHAR); VAR pl:pCONFLINE; BEGIN conflineno(v, lineno, all, pl); IF (pl<>NIL) & (pl^.line[0]<>0C) THEN Assign(pl^.line, s) END; END confreplace; PROCEDURE configbool(v:CONFSET; on:BOOLEAN); (* set config to TRUE OR FALSE *) BEGIN configs[v].on:=ORD(on); IF configs[v].typ=cBLINE THEN IF configs[v].lines=NIL THEN AddConfLine(v, ORD(on), "") ELSE configs[v].lines^.active:=ORD(on) END; END; END configbool; PROCEDURE configtogg(v:CONFSET); (* invert TRUE and FALSE of a config *) BEGIN configbool(v, NOT configon(v)) END configtogg; PROCEDURE isupdated(v:CONFSET):BOOLEAN; VAR u:BOOLEAN; BEGIN u:=configs[v].updated; configs[v].updated:=FALSE; RETURN u END isupdated; PROCEDURE setcfg(c:CONFSET; n:INTEGER; s:ARRAY OF CHAR; act:CARD8); VAR pl:pCONFLINE; BEGIN pl:=configs[c].lines; WHILE (pl<>NIL) & (n>0) DO pl:=pl^.next; DEC(n) END; IF pl<>NIL THEN Assign(pl^.line, s); pl^.active:=act; ELSE AddConfLine(c, act, s); pl:=configs[c].lines; IF (pl<>NIL) & (pl^.next<>NIL) THEN configs[c].lines:=pl^.next; WHILE pl^.next^.next<>NIL DO pl^.next:=pl^.next^.next END; pl^.next^.next:=pl; pl^.next:=NIL; END; END; END setcfg; PROCEDURE alloccutbuf(len:CARDINAL); BEGIN IF cutbuffer.text<>NIL THEN DEC(debugmem.screens, cutbuffer.cutlen); DEALLOCATE(cutbuffer.text, cutbuffer.cutlen); END; cutbuffer.text:=NIL; cutbuffer.cutlen:=len; IF cutbuffer.cutlen>0 THEN ALLOCATE(cutbuffer.text, cutbuffer.cutlen);debugmem.req:=cutbuffer.cutlen;INC(debugmem.screens, debugmem.req); IF cutbuffer.text=NIL THEN WrStrLn("cutbuf: out of memory"); wrheap; HALT END; END; END alloccutbuf; PROCEDURE copypaste(s-:ARRAY OF CHAR); VAR len, i:CARDINAL; BEGIN len:=Length(s); IF len>0 THEN alloccutbuf(len); FOR i:=0 TO len-1 DO cutbuffer.text^[i]:=s[i] END; cutpaste; END; END copypaste; PROCEDURE postoconfig(pos:POSITION); (* copy position to editline *) VAR s:ARRAY[0..99] OF CHAR; BEGIN postostr(pos, "3", s); AddConfLine(fEDITLINE, 1, s); IF s[0]<>0C THEN copypaste(s) END; IF beaconediting THEN confstr(fRBPOSTYP, s); IF s=ENCODEMULTILINE THEN appendmultiline(pos) ELSE postostr(pos, "3", s); AddConfLine(fRBPOS, 1, s); END; END; END postoconfig; PROCEDURE conf2str(v:CONFSET; linenum, valnum:CARDINAL; all:BOOLEAN; VAR s:ARRAY OF CHAR); VAR i:CARDINAL; BEGIN confstrings(v, linenum, all, s); LOOP WHILE s[0]=" " DO Delstr(s, 0, 1) END; (* del leading blanks *) i:=0; WHILE (i" ") DO INC(i) END; (* skip value *) IF (s[0]=0C) OR (valnum=0) THEN s[i]:=0C; EXIT END; DEC(valnum); IF i>0 THEN Delstr(s, 0, i) END; END; END conf2str; PROCEDURE conf2int(v:CONFSET; valnum:CARDINAL; min, max, default:INTEGER):INTEGER; VAR rval:REAL; n:INTEGER; s:ARRAY[0..50] OF CHAR; BEGIN conf2str(v, 0, valnum, TRUE, s); IF StrToFix(rval, s) THEN n:=trunc(ABS(rval)); IF rval<0.0 THEN n:=-n END; ELSE n:=default END; IF nmax THEN RETURN max END; RETURN n END conf2int; PROCEDURE conf2real(v:CONFSET; valnum:CARDINAL; min, max, default:REAL):REAL; VAR r:REAL; s:ARRAY[0..50] OF CHAR; BEGIN conf2str(v, 0, valnum, TRUE, s); IF NOT StrToFix(r, s) THEN r:=default END; IF rmax THEN RETURN max END; RETURN r END conf2real; PROCEDURE cntconfigs(v:CONFSET; all:BOOLEAN):CARDINAL; VAR n:CARDINAL; s:ARRAY[0..CONFIGWIDTH] OF CHAR; BEGIN n:=0; LOOP confstrings(v, n, all, s); IF s[0]=0C THEN EXIT END; INC(n); END; RETURN n END cntconfigs; PROCEDURE clreditline; BEGIN IF configs[fEDITLINE].lines<>NIL THEN configs[fEDITLINE].lines^.line[0]:=0C END; configs[fEDITLINE].curspos:=0; END clreditline; PROCEDURE DelCharStr(VAR s:ARRAY OF CHAR; c:CHAR); VAR i,j:CARDINAL; BEGIN i:=0; j:=0; WHILE (i<=HIGH(s)) & (s[i]<>0C) DO IF s[i]<>c THEN s[j]:=s[i]; INC(j) END; INC(i); END; IF j<=HIGH(s) THEN s[j]:=0C END; END DelCharStr; PROCEDURE IsInStr(s-, ch-:ARRAY OF CHAR):BOOLEAN; BEGIN RETURN InStr(s, ch)>=0 END IsInStr; PROCEDURE toggcfg(v:CONFSET; c:CHAR; del-:ARRAY OF CHAR); (* toggle chars in config string *) VAR i:CARDINAL; on:BOOLEAN; s:ARRAY[0..300] OF CHAR; BEGIN confstr(v, s); on:=IsInStr(s, c); IF del[0]=0C THEN s[0]:=0C ELSE DelCharStr(s, c); i:=0; WHILE (i<=HIGH(del)) & (del[i]<>0C) DO DelCharStr(s, del[i]); INC(i) END; END; IF NOT on THEN Append(s, c) END; icfg(v, s); END toggcfg; PROCEDURE ColConfset(VAR c:COLTYP; v:CONFSET); BEGIN c.r:=conf2int(v, 0, 0, 100, 100)*256 DIV 100; c.g:=conf2int(v, 1, 0, 100, 100)*256 DIV 100; c.b:=conf2int(v, 2, 0, 100, 100)*256 DIV 100; IF c.r+c.g+c.b<100 THEN c.r:=256; c.g:=256; c.b:=256; END; (* no self knocking out *) END ColConfset; PROCEDURE localtime():TIME; BEGIN RETURN conf2int(fLOCALTIME, 0, -24, 24, 0)*3600 END localtime; PROCEDURE getview(v:CONFSET; n:CARDINAL; VAR zoom:REAL; VAR pos:POSITION); VAR rval:REAL; rpos:POSITION; s, h:ARRAY[0..100] OF CHAR; BEGIN confstrings(v, n, TRUE, s); s[HIGH(s)]:=0C; Extractword(s, h); IF StrToFix(rval, h) THEN IF rvalMAXZOOM THEN rval:=FLOAT(MAXZOOM) END; zoom:=rval; -- Extractword(s, h); loctopos(rpos, s); IF NOT posvalid(rpos) THEN deganytopos(s, rpos) END; IF posvalid(rpos) THEN zoom:=rval; pos:=rpos END; END; END getview; PROCEDURE getingamma():REAL; VAR s:ARRAY[0..100] OF CHAR; lu:REAL; BEGIN conf2str(fMAPNAMES, lums.mapnum, 1, FALSE, s); IF NOT StrToFix(lu, s) OR (lu>10.0) OR (lu<0.01) THEN lu:=TILEGAMMA END; RETURN lu END getingamma; PROCEDURE mapbritocfg; VAR s,h:ARRAY[0..100] OF CHAR; BEGIN conf2str(fMAPNAMES, lums.mapnum, 0, FALSE, s); (* map name *) Append(s, " "); FixToStr(getingamma(), 3, h); (* map gamma *) Append(s, h); Append(s, " "); CardToStr(conf2int(fLMAP, 0, 0, 100, DEFAULTBRI), 0, h); (* map brightness *) Append(s, h); confreplace(fMAPNAMES, lums.mapnum, FALSE, s); END mapbritocfg; PROCEDURE Setmap(n:CARDINAL); (* MAX(INT) is use next *) VAR s,h,hh:ARRAY[0..100] OF CHAR; i, li:CARDINAL; lu:REAL; BEGIN i:=cntconfigs(fMAPNAMES, FALSE); (* count lines for reverse sort access *) IF n>=MAX(INTEGER) THEN (* cycle thru maps *) n:=lums.mapnum; IF n>=i THEN n:=0 END; (* disabled map used till now *) IF n<>0 THEN n:=i-n END; END; IF n" ") DO lums.mapname[i]:=s[i]; INC(i) END; lums.mapname[i]:=0C; h:="Map:["; Append(h, lums.mapname); (* gamma *) lu:=getingamma(); Tilegamma(lu); Append(h, "] Gamma:"); FixToStr(lu, 3, hh); Append(h, hh); (* bright *) conf2str(fMAPNAMES, lums.mapnum, 2, FALSE, s); IF NOT StrToCard(s, li) OR (li<0) OR (li>100) THEN li:=DEFAULTBRI END; int2cfg(fLMAP, li); Append(h, " Brightness:"); IntToStr(li, 0, hh); Append(h, hh); say(h, 4, "b"); rdlums; END; END Setmap; PROCEDURE saveXYtocfg(c:CONFSET; x, y:INTEGER); VAR s,h:ARRAY[0..100] OF CHAR; BEGIN IntToStr(x, 0, s); IntToStr(y, 0, h); Append(s, " "); Append(s, h); AddConfLine(c, 0, s); END saveXYtocfg; PROCEDURE xerrmsg(s:ARRAY OF CHAR); VAR h:ARRAY[0..2000] OF CHAR; BEGIN IF s[0]<>0C THEN h:=LF; Append(h, s); Append(h, LF); textautosize(0, 0, 6, 0, "e", h); END; END xerrmsg; PROCEDURE rdlums; VAR n:CARDINAL; BEGIN lums.map :=BRIMUL*conf2int(fLMAP, 0, 0, 100, DEFAULTBRI); lums.rfbri:=BRIMUL*conf2int(fLRF, 0, 0, 100, 30); lums.track:=BRIMUL*conf2int(fLTRACK, 0, 0, 100, 100); lums.waypoint:=BRIMUL*conf2int(fLWAY, 0, 0, 100, 100); lums.sym :=BRIMUL*conf2int(fLSYM, 0, 0, 100, 100); lums.obj :=BRIMUL*conf2int(fLOBJ, 0, 0, 100, DEFLOBJ); lums.text :=BRIMUL*conf2int(fLTEXT, 0, 0, 100, DEFLTEXT); lums.nomov:=BRIMUL*conf2int(fNOMOV, 0, 0, 100, 9); lums.centering:=conf2int(fCENTER, 0, 0, 100, 40); lums.purgetime:=60*conf2int(fTPURGE, 0, 0, MAX(INTEGER) DIV 60, 1500); lums.purgetimeobj:=60*conf2int(fTPURGEOBJ, 0, 0, MAX(INTEGER) DIV 60, 1500); lums.firstdim :=60*conf2int(fTFULL, 0, 0, MAX(INTEGER) DIV 60, 1410); lums.maxdim :=60*conf2int(fTFADE, 0, 0, MAX(INTEGER) DIV 60, 30); lums.kmhtime :=conf2int(fKMHTIME, 0, 0, MAX(INTEGER), 600); lums.movestep :=conf2int(fMOVESTEP, 0, 1, 100, 10); lums.dupemaxtime:=60*conf2int(fDUPDEL, 0, 0, 1440, 180); lums.gamma:=conf2real(fGAMMA, 0, 0.1, 10.0, 2.2); Gammatab(lums.gamma); lums.moded:=FALSE; lums.menutransp:=configon(fTRANSP); ColConfset(lums.menubackcol, fCOLMENUBACK); n:=conf2int(fTRANSP, 0, 0, 100, 60); IF n=0 THEN n:=100 END; IF lums.menutransp THEN n:=n*2 END; lums.menubackcol.r:=lums.menubackcol.r*n DIV 100; lums.menubackcol.g:=lums.menubackcol.g*n DIV 200*2; lums.menubackcol.b:=lums.menubackcol.b*n DIV 100; IF ODD(lums.menubackcol.g) THEN DEC(lums.menubackcol.g) END; ColConfset(lums.menucol, fCOLMENUTEXT); IF ODD(lums.menucol.g) THEN DEC(lums.menucol.g) END; confstr(fOSMDIR, srtmdir); lums.followwhat:=CAST(BITSET, conf2int(fFOLLOW, 0, 0, 3, 2)); END rdlums; PROCEDURE rdonesymb(on, say:BOOLEAN); (* configline to symbol filter set*) VAR s:ARRAY[0..99] OF CHAR; i,j,n,b, cnt:CARDINAL; BEGIN click.onesymbolset:=SYMBOLSET{}; confstr(fONESYMB, s); cnt:=0; IF Length(s)>=2+192 DIV 4 THEN click.onesymbolset:=SYMBOLSET{}; b:=0; FOR i:=2 TO 2+192 DIV 4-1 DO n:=ORD(s[i]); IF n9 THEN DEC(n, ORD("A")-ORD("0")-10) END; FOR j:=0 TO 3 DO IF ODD(n) THEN INCL(click.onesymbolset, b); INC(cnt); END; INC(b); n:=n DIV 2; END; END; END; IF cnt=0 THEN IF ORD(s[0]) IN SYMTABLE THEN click.onesymbol.tab:=s[0]; click.onesymbol.pic:=s[1]; ELSE click.onesymbol.tab:=0C END; s:="Show One Symbol"; ELSE click.onesymbol.tab:=cMULTISYMBOL; click.onesymbol.pic:=" "; s:="Symbol Filter"; END; IF NOT on THEN click.onesymbol.tab:=0C END; IF say THEN sayonoff(s, click.onesymbol.tab<>0C) END; END rdonesymb; PROCEDURE onoffm(img:pIMAGE; x0, y0:INTEGER; on:BOOLEAN); VAR x, y, w, ww, xc, yc:INTEGER; col:PIX; BEGIN IF on THEN col.r:=100; col.g:=999; col.b:=100; ELSE col.r:=150; col.g:=151; col.b:=150 END; IF x0<0 THEN x0:=-x0; col:=img^[x0-5][y0-5] END; w:=lums.fontxsize DIV 2+3; ww:=w*w; FOR y:=-w TO w DO FOR x:=-w TO w DO IF x*x+y*y=0) & (xc=0) & (yc=3 THEN h:=xx; xx:=yy; yy:=h END; xc:=x0+xx; yc:=y0+yy; IF (xc>=0) & (xc=0) & (ycNIL) THEN m^.image:=panoimage; panoimage:=NIL; ELSE allocimage(m^.image, xsize, ysize, m^.saveimage); IF m^.image=NIL THEN WrStrLn("menuimage out of memory"); wrheap; RETURN END; -- clr(m^.image); END; END; END allocmenu; PROCEDURE popxbase(y1:CARDINAL):INTEGER; (* find right end of docked windows *) VAR m:pMENU; x, xm:CARDINAL; BEGIN x:=0; IF lums.headmenuy THEN m:=menus; WHILE m<>NIL DO IF m^.notoverdraw & (m^.nowy=xm THEN xm:=m^.nowx END; INC(xm, m^.xsize); IF (xm>x) THEN x:=xm END; END; m:=m^.next; END; END; RETURN x END popxbase; PROCEDURE starthint(num:CARDINAL; center:BOOLEAN); BEGIN hintnum:=num; IF num>0 THEN hinttime:=realtime; IF center THEN xmouse.x:=0; xmouse.y:=ysize; hinttime:=0 END; END; END starthint; PROCEDURE killmenus(from:pMENU); VAR m:pMENU; BEGIN WHILE from<>NIL DO m:=from^.next; IF menus=from THEN menus:=m END; IF from^.image<>NIL THEN IF from^.saveimage THEN IF panoimage<>NIL THEN disposeimg(panoimage) END; panoimage:=from^.image; from^.image:=NIL; ELSE disposeimg(from^.image) END; END; -- IF from=actmenu THEN actmenu:=NIL END; DEC(debugmem.menus, SIZE(menus^)); DEALLOCATE(from, SIZE(menus^)); --DEC(menucnt); WrInt(menucnt, 3);WrStrLn("=menus-"); from:=m; END; starthint(0, FALSE); END killmenus; PROCEDURE killallmenus; BEGIN killmenus(menus); click.watchlast:=FALSE; END killallmenus; PROCEDURE killmenu(km:pMENU); VAR m:pMENU; BEGIN IF km<>NIL THEN IF km=menus THEN km:=km^.next; menus^.next:=NIL; killmenus(menus); menus:=km; ELSE m:=menus; WHILE m^.next<>NIL DO IF m^.next=km THEN m^.next:=km^.next; km^.next:=NIL; killmenus(km); RETURN END; m:=m^.next; END; END; END; END killmenu; PROCEDURE findmenuid(id:CARDINAL):pMENU; VAR m:pMENU; BEGIN m:=menus; WHILE m<>NIL DO IF m^.wid=id THEN RETURN m END; m:=m^.next; END; RETURN NIL END findmenuid; PROCEDURE killmenuid(id:CARDINAL); VAR m:pMENU; BEGIN m:=findmenuid(id); IF m<>NIL THEN killmenu(m) END; END killmenuid; PROCEDURE mainxs():CARDINAL; BEGIN IF redrawimg=NIL THEN RETURN 0 ELSE RETURN HIGH(redrawimg^)+1 END END mainxs; PROCEDURE mainys():CARDINAL; BEGIN IF redrawimg=NIL THEN RETURN 0 ELSE RETURN HIGH(redrawimg^[0])+1 END END mainys; PROCEDURE lastmenu():pMENU; VAR m:pMENU; x, xm, y, ys:CARDINAL; BEGIN m:=menus; IF m<>NIL THEN WHILE m^.next<>NIL DO m:=m^.next END; END; RETURN m END lastmenu; PROCEDURE joinmenux(m, menu:pMENU); VAR xm:CARDINAL; BEGIN IF (m<>NIL) & (menu^.wid=0) THEN xm:=HIGH(menu^.image^); (* find x position *) menu^.x0:=m^.nowx+m^.xsize-2; IF (menu^.x0+xm>mainxs()) & (menu^.x0>xm) THEN IF m^.nowx+2>=xm THEN menu^.x0:=m^.nowx+2-xm ELSE menu^.x0:=0 END; END; END; END joinmenux; PROCEDURE appendmenu(menu:pMENU); VAR m, mh:pMENU; x, xm, y, ys:CARDINAL; BEGIN IF menu^.wid>0 THEN killmenuid(menu^.wid) END; menu^.next:=NIL; menu^.oldknob:=0; m:=lastmenu(); IF m<>NIL THEN m^.next:=menu ELSE menus:=menu END; (* append next menu in chain *) joinmenux(m, menu); m:=menus; WHILE m<>NIL DO IF (m^.wid>0) & (m^.widNIL DO IF (m^.wid>0) & (m^.wid=ys) THEN ys:=m^.ysize; mh:=m END; m:=m^.next; END; IF mh=NIL THEN EXIT END; mh^.y0:=y; INC(y, ys); END; END appendmenu; PROCEDURE microspace(c-:ARRAY OF CHAR):INTEGER; VAR i, x:CARDINAL; BEGIN x:=0; i:=0; WHILE (i<=HIGH(c)) & (c[i]<>0C) DO IF (c[i]>=SP1) & (c[i]<=SP9) THEN INC(x, ((ORD(c[i])-(ORD(SP1)-1))*lums.fontxsize+5) DIV 6) ELSIF c[i]=SPS THEN INC(x, lums.symsize); (* space symbol size *) ELSE INC(x, lums.fontxsize) END; INC(i); END; RETURN x END microspace; PROCEDURE knobtexty(yk:CARDINAL):CARDINAL; BEGIN IF yk<=lums.fontysize THEN RETURN 0 ELSE RETURN (yk-lums.fontysize-1) DIV 2 END END knobtexty; PROCEDURE addline(m:pMENU; s-:ARRAY OF CHAR; ccmd:ARRAY OF CHAR; hint:CARDINAL); CONST MB=0; MW=200; VAR x, y, i, si, sk, mark, dimm:CARDINAL; col, colc:COLTYP; h:ARRAY[0..1000] OF CHAR; mmr, mmg, mmb, mbr, mbg, mbb:INT16; highlitewholline:BOOLEAN; BEGIN i:=0; x:=0; si:=0; dimm:=1000; highlitewholline:=FALSE; mark:=MAX(CARDINAL); EXCL(m^.nohilite, m^.oldknob); mmr:=200; mmg:=10; mmb:=10; WHILE (i<=HIGH(s)) & (s[i]<>0C) & (si<=HIGH(m^.subk[0])) DO IF s[i]="|" THEN m^.subk[m^.oldknob][si]:=x; INC(si); -- ELSIF (s[i]>=SP1) & (s[i]<=SP9) THEN INC(x, (ORD(s[i])-(ORD(SP1)-1))*CHARWIDTH DIV 6); -- ELSIF s[i]=SPS THEN INC(x, lums.symsize); (* space symbol size *) ELSIF (s[i]>=MOP0) & (s[i]<=MOP9) THEN IF s[i]=MOP0 THEN INCL(m^.noprop, m^.oldknob); (* proportional off *) ELSIF s[i]=MOP3 THEN INCL(m^.nohilite, m^.oldknob); ELSIF s[i]=MOP2 THEN mark:=si; (* color background 1 button *) ELSIF s[i]=MOP4 THEN mark:=MAX(CARDINAL)-1; (* color background whole line *) ELSIF s[i]=MOP1 THEN mmr:=350; mmg:=250; mmb:=50; (* color background yellow *) ELSIF s[i]=MOP7 THEN mmr:=10; mmg:=10; mmb:=600; (* color background blue *) ELSIF s[i]=MOP8 THEN dimm:=400; (* dimm text *) ELSIF s[i]=MOP9 THEN highlitewholline:=TRUE END; ELSE INC(x, microspace(s[i])) END; -- ELSE INC(x, CHARWIDTH) END; INC(i); END; IF si<=HIGH(m^.subk[0]) THEN m^.subk[m^.oldknob][si]:=0 END; mbr:=2;mbg:=2;mbb:=2; IF lums.menutransp THEN (* user enabled transparency *) IF m^.background=bCOLOR THEN mbr:=lums.menubackcol.r DIV 4; mbg:=lums.menubackcol.g DIV 8*2; mbb:=lums.menubackcol.b DIV 4; END; ELSIF m^.background<>bBLACK THEN mbr:=lums.menubackcol.r; mbg:=lums.menubackcol.g; mbb:=lums.menubackcol.b; END; FOR y:=0 TO m^.yknob-1 DO si:=0; sk:=0; FOR x:=0 TO m^.xsize-1 DO WITH m^.image^[x][y+m^.oldknob*m^.yknob] DO IF (x=m^.xsize-1) OR (sk=2) OR (x>0) & (x0) & (x0 THEN DEC(sk) END; i:=m^.subk[m^.oldknob][si]; IF (i>1) & (i-2<=x) THEN -- IF m^.oldknob IN m^.noprop THEN r:=100; g:=100; b:=100 ELSE sk:=2 END; IF highlitewholline THEN r:=100; g:=100; b:=100 ELSE sk:=2 END; INC(si); END; END; END; END; x:=0; si:=0; ColConfset(colc, fCOLMENUTEXT); colc.g:=colc.g DIV 2*2; col:=colc; i:=0; LOOP IF (i<=HIGH(s)) & (s[i]<>"|") & (s[i]<>0C) THEN h[x]:=s[i]; IF s[i]=MOP5 THEN Colset(col, "R"); ELSIF s[i]=MOP6 THEN Colset(col, "Y") END; IF (xMOP9)) THEN INC(x) END; ELSE h[x]:=0C; IF x>0 THEN IF si=0 THEN x:=0 ELSE x:=m^.subk[m^.oldknob][si-1] END; drawstri(m^.image, h, x+1, m^.oldknob*m^.yknob+knobtexty(m^.yknob), dimm, 1, col, NOT (m^.oldknob IN m^.noprop), FALSE); END; INC(si); x:=0; IF (si>HIGH(m^.subk[0])) OR (i>HIGH(s)) OR (s[i]=0C) THEN EXIT END; -- INC(y); col:=colc; END; INC(i) END; IF highlitewholline THEN -- IF m^.oldknob IN m^.noprop THEN FOR i:=0 TO HIGH(m^.subk[0]) DO m^.subk[m^.oldknob][i]:=0 END; END; m^.cmds[m^.oldknob+1]:=ccmd[0]; IF m^.oldknob=m^.hiknob THEN m^.hiknob:=0 END; m^.oldsub:=0; INC(m^.oldknob); IF (HIGH(ccmd)>0) & (ccmd[0]<>0C) & (ccmd[1]<>0C) THEN m^.submen[m^.oldknob]:=TRUE; subicon(m^.image, m^.xsize-lums.fontxsize-3, midy(m), 0, lums.fontxsize-1); END; m^.helpindex[m^.oldknob]:=hint; END addline; PROCEDURE addonoff(m:pMENU; s-:ARRAY OF CHAR; c:ARRAY OF CHAR; hint:CARDINAL; x0:INTEGER; on:BOOLEAN); BEGIN addline(m, s, c, hint); onoff(m, x0, on); END addonoff; PROCEDURE potival(m:pMENU; knob, val, textsx, textwx:CARDINAL; s, w:ARRAY OF CHAR); VAR x, y:CARDINAL; col:COLTYP; BEGIN IF knob>0 THEN FOR y:=4 TO m^.yknob-4 DO FOR x:=POTIOFF TO m^.xsize-(POTIOFF+1) DO WITH m^.image^[x][y+(knob-1)*m^.yknob] DO IF y>=m^.yknob-7 THEN IF xNIL THEN allocmenu(menu, 0, 0, FALSE); menu^.image:=img1; xm:=HIGH(menu^.image^); ym:=HIGH(menu^.image^[0]); -- IF imagesx0=xm THEN menu^.x0:=imagesx0-xm ELSE menu^.x0:=0 END; menu^.x0:=popxbase(MAX(INTEGER)); -- menu^.y0:=mainys()-VAL(CARDINAL,click.y); menu^.xsize:=xm+1; menu^.ysize:=ym+1; menu^.wid:=WXWINID+ORD(wi); -- IF lums.headmenuy THEN joinmenux(menu) END; menu^.y0:=0; appendmenu(menu); END; END; END; END images; PROCEDURE menuimgy(liney, entries:CARDINAL):CARDINAL; (* return menu image y size *) BEGIN RETURN liney*entries+4 END menuimgy; PROCEDURE wrcolor(img:pIMAGE; s-:ARRAY OF CHAR; leftmargin, bri:CARDINAL; prop:BOOLEAN; VAR y:CARDINAL); VAR col, colw:COLTYP; inc:INTEGER; x, i:CARDINAL; BEGIN x:=leftmargin; -- Colset(col, "W"); ColConfset(colw, fCOLMENUTEXT); col:=colw; i:=0; WHILE (i<=HIGH(s)) & (s[i]<>0C) & (x0 THEN killmenuid(ident) END; allocmenu(menu, xw, menuimgy(lums.fontysize, lines)+(lums.fontysize+TEXTLINESPACE)*ORD(mstr[0]<>0C), FALSE); xm:=HIGH(menu^.image^); ym:=HIGH(menu^.image^[0]); IF VAL(CARDINAL,click.x)0C THEN WITH menu^.image^[x][y] DO IF x=0 THEN r:=rr*2; g:=gg*2; b:=bb*2; ELSIF x0C THEN menu^.yknob:=(lums.fontysize+TEXTLINESPACE); menu^.oldknob:=0; addline(menu, mstr, cstr, 0); FOR i:=1 TO HIGH(menu^.cmds) DO menu^.cmds[i]:=cstr[0] END; EXCL(menu^.nohilite, 0); END; appendmenu(menu); IF ypo<>0 THEN menu^.y0:=ypo END; refresh:=TRUE; IF time>0 THEN menu^.timeout:=realtime+time END; END textwin; PROCEDURE textautomenu(x0, y0:INTEGER; id:CARDINAL; time:TIME; color:CHAR; s-, mtext-, cmd-:ARRAY OF CHAR); VAR n,x,xmax:CARDINAL; i, l:INTEGER; BEGIN IF (s[0]<>0C) OR (mtext[0]<>0C) THEN n:=ORD(s[0]<>0C); xmax:=0; x:=0; l:=VAL(INTEGER,Length(s))-1; FOR i:=0 TO l DO IF s[i]=NL THEN INC(n); x:=0; ELSIF s[i]=TEXTINSERTSYMBOL THEN INC(x, lums.symsize); ELSIF s[i]<=CHR(MAXCHAR) THEN INC(x, charwidth(s[i])); IF x>xmax THEN xmax:=x END; END; END; i:=0; x:=0; WHILE (i<=VAL(INTEGER, HIGH(mtext))) & (mtext[i]<>0C) DO INC(x, charwidth(mtext[i])); INC(i); END; IF x>xmax THEN xmax:=x END; IF x0=DOCKX THEN x0:=popxbase(y0 + VAL(INTEGER, menuimgy(lums.fontysize, n+1))); ELSIF x0<0 THEN x0:=(xsize-VAL(INTEGER,xmax)) DIV 2 END; IF y0<0 THEN y0:=ysize DIV 2 - VAL(INTEGER, menuimgy(lums.fontysize, n+2)) - 10 END; IF x0<0 THEN x0:=0 END; IF y0<0 THEN y0:=0 END; textwin(xmax+TEXTWINXMARGIN*2, n, x0, y0, id, time, color, s, mtext, cmd); refresh:=TRUE; END; END textautomenu; PROCEDURE textautosize(x0, y0:INTEGER; id:CARDINAL; time:TIME; color:CHAR; s-:ARRAY OF CHAR); BEGIN textautomenu(x0, y0, id, time, color, s, 0C, 0C) END textautosize; PROCEDURE popwatchcall(s-:ARRAY OF CHAR); VAR h:ARRAY[0..40] OF CHAR; BEGIN h:=MOP4+MOP7+"Watch:"; Append(h, s); textautomenu(DOCKX, 0, 3, 0, "b", "", h, CMDCLICKWATCH); END popwatchcall; PROCEDURE poligonmenu; VAR h:ARRAY[0..140] OF CHAR; BEGIN IF click.insreplaceline THEN h:=" Insert" ELSE h:=" Move" END; Append(h, " Line| Del Line| Colour| Line Type| Filled/Open "); textautomenu(DOCKX, 0, 3, 0, "b", "", h, CMDPOLIGON); END poligonmenu; PROCEDURE helptext(line, sub, xclick, yclick:CARDINAL; idx-:ARRAY OF CHAR); (* line0 new, line1 back, else hyperlink click *) CONST HELPFILENAME="help.txt"; HL="|"; HX=":"; HELPWID=4; VAR fd:File; fl, fp, li:INTEGER; tp, px:CARDINAL; c:CHAR; inh:CARD8; fb:ARRAY[0..4095] OF CHAR; s:ARRAY[0..2000] OF CHAR; PROCEDURE rh():CHAR; BEGIN IF fp>=fl THEN fl:=RdBin(fd, fb, SIZE(fb)); IF fl<=0 THEN RETURN 0C END; fp:=0; END; INC(fp); RETURN fb[fp-1] END rh; PROCEDURE hopen(h-:ARRAY OF CHAR; offset:CARDINAL):INTEGER; VAR i:CARDINAL; lc:INTEGER; c:CHAR; BEGIN fp:=0; fl:=0; fd:=OpenRead(HELPFILENAME); IF NOT FdValid(fd) THEN RETURN -1 END; lc:=0; i:=0; LOOP IF h[i]=0C THEN EXIT END; c:=rh(); IF c=0C THEN RETURN 0 END; IF (c=LF) OR (c>" ") THEN IF (h[i]=c) & (i0 DO c:=rh(); IF c=0C THEN RETURN 0 END; IF c=LF THEN DEC(offset) END; END; RETURN lc END hopen; BEGIN IF line=0 THEN (* open help *) helpdepth:=0; helpscroll[0]:="|"; Append(helpscroll[0], idx); Append(helpscroll[0], LF); ELSIF line=1 THEN (* back in history *) IF helpdepth>0 THEN IF sub=1 THEN helpdepth:=1 ELSE DEC(helpdepth) END; ELSE killmenuid(HELPWID); refresh:=TRUE; RETURN END; END; REPEAT --FOR tp:=0 TO helpdepth DO WrStr("<"); WrStr(helpscroll[tp]);WrStrLn(">") END; IF line>1 THEN tp:=yclick DIV lums.fontysize ELSE tp:=0 END; li:=hopen(helpscroll[helpdepth], tp); IF li<0 THEN textautosize(-1, 0, 5, 2, "e", HELPFILENAME+" not found"); RETURN END; (* file not found *) IF (li=0) & (helpdepth>0) THEN (* anchor not found *) Assign(s, helpscroll[helpdepth]); Append(s, "index not found"); DEC(helpdepth); (* try last link *) Close(fd); line:=1; textautosize(-1, 0, 5, 2, "e", s); ELSIF line>1 THEN (* hyperlink click *) IF helpdepth>=HIGH(helpscroll) THEN FOR tp:=3 TO HIGH(helpscroll) DO helpscroll[tp-1]:=helpscroll[tp] END; (* strip history *) ELSE INC(helpdepth) END; helpscroll[helpdepth][0]:=0C; tp:=0; px:=TEXTWINXMARGIN; LOOP c:=rh(); IF (tp=0) & (c<>HL) THEN INC(px, charwidth(c)) END; IF c=HL THEN IF tp=0 THEN helpscroll[helpdepth][0]:=HL; tp:=1 ELSE tp:=0 END; ELSIF (c=HX) & (tp>0) THEN (* link name end *) IF px>xclick THEN tp:=0; EXIT END; (* we are right behind of click *) REPEAT c:=rh(); IF c<" " THEN tp:=0; EXIT END; IF c<>HX THEN INC(px, charwidth(c)) END; UNTIL c=HX; (* link text end *) IF px>=xclick THEN EXIT ELSE tp:=0 END; (* text is at click or right *) ELSIF c<" " THEN tp:=0; EXIT (* no link in this line *) ELSIF (tp>0) & (tp0 THEN helpscroll[helpdepth][tp]:=LF; helpscroll[helpdepth][tp+1]:=0C; ELSIF helpdepth>0 THEN DEC(helpdepth) END; (* no link found *) Close(fd); line:=1; ELSIF line>0 THEN line:=0 END; UNTIL line=0; tp:=0; inh:=0; LOOP c:=rh(); IF c=0C THEN EXIT END; IF c=HL THEN inh:=1; ELSIF (c<" ") & (inh<>0) THEN EXIT ELSIF c=HX THEN IF inh=1 THEN c:=TEXTCOLORA; inh:=2; ELSIF inh=2 THEN c:=TEXTCOLEND; inh:=0 END; END; IF (inh<>1) & ((c=LF) OR (c>=" ")) (* & ((tp<>0) OR (c<>LF))*) THEN s[tp]:=c; INC(tp); IF tp>=HIGH(s) THEN EXIT END; END; END; WHILE (tp>0) & (s[tp-1]<=" ") DO DEC(tp) END; s[tp]:=0C; IF s[0]=0C THEN s:="no text" END; IF helpdepth=0 THEN fb:=" Close " ELSIF helpdepth<2 THEN fb:=" < Back "; ELSE fb:=" < Back | Index " END; textautomenu(-1, lums.fontysize, HELPWID, 0, "b", s, fb, CMDDOHELP); Close(fd); END helptext; PROCEDURE say(s-:ARRAY OF CHAR; time:TIME; color:CHAR); BEGIN textautosize(0, 0, 4, time, color, s); END say; PROCEDURE sayonoff(s:ARRAY OF CHAR; on:BOOLEAN); VAR h:ARRAY[0..99] OF CHAR; BEGIN Assign(h, s); IF on THEN Append(h, " On") ELSE Append(h, " Off") END; say(h, 4, "b"); END sayonoff; PROCEDURE downloadprogress; VAR s, s1:ARRAY[0..999] OF CHAR; BEGIN WITH mappack DO s:="Done "; IntToStr(donecnt, 1, s1); Append(s, s1); Append(s, " of "); IntToStr(mapscnt, 1, s1); Append(s, s1); Append(s, " missed: "); IntToStr(givups, 1, s1); Append(s, s1); Append(s, " retries: "); IF run THEN IntToStr(retrys, 1, s1) ELSE IntToStr(retrysum, 1, s1) END; Append(s, s1); IF NOT run THEN Append(s, " Ready") END; textautosize(DOCKX, 0, 6, 0, "b", s); END; END downloadprogress; PROCEDURE msgpop; VAR s, s1:ARRAY[0..200] OF CHAR; m:pMENU; pm, pn:pMSGFIFO; i,mc:INTEGER; y0:INTEGER; new:BOOLEAN; col:CHAR; BEGIN mc:=0; pn:=msgfifo; pm:=NIL; new:=nextmsg<0; -- IF NOT new OR configon(fPOPUPMSG) THEN nextmsg:=ABS(nextmsg); WHILE pn<>NIL DO INC(mc); IF mc=nextmsg THEN pm:=pn END; pn:=pn^.next; END; IF pm=NIL THEN nextmsg:=1; pm:=msgfifo; END; IF pm<>NIL THEN IF new THEN killmenuid(MSGPOPID) END; m:=findmenuid(MSGPOPID); IF m=NIL THEN WITH pm^ DO IF query THEN IF isaa THEN s:="Auto Answer (" ELSE s:="Query (" END; ELSIF posvalid(itempos) THEN IF deleteitem THEN s:="Deleted Item (" ELSE s:="Item Message (" END; ELSE s:="Message (" END; i:=nextmsg; IF i>mc THEN i:=mc END; IntToStr(i, 1, s1); Append(s, s1); Append(s, "/"); IntToStr(mc, 1, s1); Append(s, s1); Append(s, ") from ["); Append(s, from); Append(s, "] to ["); Append(s, to); IF ack[0]<>0C THEN Append(s, "] ack["); Append(s, ack); END; Append(s, "] Port["); Append(s, port); DateLocToStr(time, s1); Append(s, "] "); Append(s, s1); Append(s, LF); IF posvalid(itempos) THEN Append(s, TEXTCOLORA); Append(s, itemname); Append(s, TEXTCOLEND+" ["); s1:=" Close | Next | Reply | Delete | Find Item"; ELSE Append(s, "["); s1:=" Close | Next | Reply | Delete"; END; i:=0; WHILE (i0C) DO IF (txt[i]<" ") OR (txt[i]>=177C) THEN txt[i]:=" " END; (* remove ctrl call *) INC(i) END; Append(s, txt); Append(s, "]"); IF sndmsg THEN y0:=40 ELSE y0:=-1 END; IF new THEN col:="r" ELSE col:="b" END; textautomenu(-1, y0, MSGPOPID, 0, col, s, s1, MSGOK); END; END; ELSE nextmsg:=0; textautosize(0, 0, 6, 4, "b", "No Messages") END; -- END; END msgpop; PROCEDURE clrmsgtext(to-:ARRAY OF CHAR); VAR s:ARRAY[0..99] OF CHAR; BEGIN confstr(fMSGTO, s); IF NOT StrCmp(to, s) THEN (* msg to another call so clear text *) icfg(fMSGTEXT, 0C); configs[fMSGTEXT].curspos:=0; END; END clrmsgtext; PROCEDURE reply; VAR pm:pMSGFIFO; i:INTEGER; oldport:CHAR; BEGIN IF msgfifo<>NIL THEN pm:=msgfifo; i:=1; WHILE (ABS(nextmsg)>i) & (pm^.next<>NIL) DO pm:=pm^.next; INC(i) END; clrmsgtext(pm^.from); icfg(fMSGTO, pm^.from); confstr(fMSGPORT, oldport); IF oldport<>"A" THEN icfg(fMSGPORT, pm^.port) END; (* if not autoport copy rx port to tx port *) sndmsg:=TRUE; END; END reply; PROCEDURE msgtoobj; VAR op:pOPHIST; BEGIN op:=selop(); IF op<>NIL THEN clrmsgtext(op^.call); icfg(fMSGTO, op^.call); IF op^.lastrxport<>0C THEN icfg(fMSGPORT, op^.lastrxport) END; sndmsg:=TRUE; END; END msgtoobj; PROCEDURE delmsgfifo; VAR pm, po:pMSGFIFO; i:INTEGER; BEGIN IF msgfifo<>NIL THEN pm:=msgfifo; IF (pm^.next=NIL) OR (ABS(nextmsg)<=1) THEN msgfifo:=msgfifo^.next ELSE po:=NIL; i:=1; WHILE ((nextmsg)>i) & (pm^.next<>NIL) DO po:=pm; pm:=pm^.next; INC(i) END; IF po<>NIL THEN po^.next:=pm^.next END; END; DEALLOCATE(pm, SIZE(pm^)); END; killmenuid(MSGPOPID); refresh:=TRUE; END delmsgfifo; PROCEDURE zoomtoitem(msgnum:INTEGER); VAR pn:pMSGFIFO; i:INTEGER; BEGIN pn:=msgfifo; WHILE (pn<>NIL) & (msgnum>1) DO DEC(msgnum); pn:=pn^.next; END; IF (pn<>NIL) & posvalid(pn^.itempos) THEN setmark1(pn^.itempos, TRUE, MAX(INTEGER), realtime) END; -- click.cmd:=CMDZOOMTOMARKS; click.cmd:=CMDLISTWINLINE; refresh:=TRUE; END zoomtoitem; PROCEDURE getwxset(set:CONFSET; VAR s:ARRAY OF CHAR; VAR wset:sWXSET); VAR i:CARDINAL; BEGIN confstr(set, s); wset:=sWXSET{}; IF s[0]="0" THEN (* else menu and all off *) i:=0; LOOP IF s[i+1]="1" THEN INCL(wset, VAL(WXSET,i)) ELSIF s[i+1]<>"0" THEN EXIT END; INC(i); IF i>10 THEN EXIT END; (* end of wx switches *) END; END; END getwxset; PROCEDURE textinfo(typ:CARDINAL; withfind:BOOLEAN); VAR s,fs:ARRAY[0..1000] OF CHAR; col:CHAR; BEGIN IF withfind THEN confstr(fFIND, fs); IF InStr(fs, "<>")<>0 THEN fs:="" ELSE Delstr(fs, 0, 2) END; ELSE fs:="" END; optext(typ, fs, click.table[click.selected], click.watchlast, s); WITH click.table[click.selected] DO IF (opf<>NIL) & (pff0<>NIL) THEN IF typ=2 THEN setmarkalti(NIL, opf, FALSE); (* not use last frame for marker because marker should be at symbol position but symbol is on last ERROR-FREE position *) ELSE setmarkalti(pff0, opf, FALSE) END; END; END; col:="b"; IF click.watchlast THEN col:="r" END; IF s[0]<>0C THEN textautosize(DOCKX, 0, TEXTINFOWINID, 0, col, s) END; END textinfo; PROCEDURE refrinfo; VAR s:ARRAY[0..99] OF CHAR; t:CLICKTYPS; BEGIN IF click.entries>0 THEN t:=click.table[click.selected].typf; s:=""; IF (t=tTEXT) OR (t=tOBJECTTEXT) THEN confstr(fCLICKTEXT, s); ELSIF (t=tSYMBOL) OR (t=tOBJECT) THEN confstr(fCLICKSYM, s) END; IF IsInStr(s, CFGRAWDECODED) THEN textinfo(2, FALSE) END; images(click.table[click.selected].opf, 0C, click.graphset); END; END refrinfo; PROCEDURE hoverinfo(obj:CLICKOBJECT); VAR hh:ARRAY[0..50] OF CHAR; graphset:sWXSET; s:ARRAY[0..1000] OF CHAR; col:CHAR; void:BOOLEAN; BEGIN IF findmenuid(TEXTINFOWINID)=NIL THEN hintmouse:=xmouse; getwxset(fHOVERSET, hh, graphset); (* what wx images are enabled *) hoveropen:=TRUE; -- IF xmouse.x>20 THEN imagesx0:=xmouse.x-20 ELSE imagesx0:=0 END; -- imagesx1:=xmouse.x+20; IF IsInStr(hh, CFGRAWDECODED) THEN optext(2, "", obj, void, s); col:="m"; IF s[0]<>0C THEN textautosize(DOCKX, 0, HOVERINFOWINID, 0, col, s) END; END; images(obj.opf, 0C, graphset); END; END hoverinfo; PROCEDURE oneclickinfo; VAR i:CARDINAL; wset:sWXSET; img:pIMAGE; lastval:LASTVAL; raw:BOOLEAN; hh:ARRAY[0..50] OF CHAR; s:ARRAY[0..99] OF CHAR; ct:CLICKTYPS; BEGIN IF click.entries=0 THEN RETURN END; i:=click.selected; raw:=FALSE; click.graphset:=sWXSET{}; ct:=click.table[i].typf; IF (ct=tSYMBOL) OR (ct=tOBJECT) THEN getwxset(fCLICKWXSYM, hh, click.graphset); (* what wx images are enabled *) wset:=sWXSET{}; img:=NIL; IF IsInStr(hh, CFGRAWDECODED) THEN raw:=TRUE END; wxgraph(img, selop(), systime, wset, lastval); (* what do we have *) IF wset*click.graphset=sWXSET{} THEN (* no wx to show *) confstr(fCLICKSYM, s); IF IsInStr(s, "s") THEN INCL(click.graphset, wSHIST) END; IF IsInStr(s, "b") THEN INCL(click.graphset, wBHIST) END; IF IsInStr(s, "n") THEN INCL(click.graphset, wAHIST) END; IF IsInStr(s, CFGRAWDECODED) THEN raw:=TRUE END; IF click.graphset=sWXSET{} THEN hh[0]:=s[0] END; END; ELSIF (ct=tTEXT) OR (ct=tOBJECTTEXT) THEN (* text click *) confstr(fCLICKTEXT, s); IF IsInStr(s, "s") THEN INCL(click.graphset, wSHIST) END; IF IsInStr(s, "b") THEN INCL(click.graphset, wBHIST) END; IF IsInStr(s, "n") THEN INCL(click.graphset, wAHIST) END; IF IsInStr(s, CFGRAWDECODED) THEN raw:=TRUE END; ELSIF ct=tTRACK THEN (* track click *) confstr(fCLICKTRACK, s); IF (click.mhop[0]<>0C) OR NOT IsInStr(s, CMD1USER) THEN (* only if 1 user or not goto 1 user *) IF IsInStr(s, "s") THEN INCL(click.graphset, wSHIST) END; IF IsInStr(s, "b") THEN INCL(click.graphset, wBHIST) END; IF IsInStr(s, "n") THEN INCL(click.graphset, wAHIST) END; END; IF IsInStr(s, CFGRAWDECODED) THEN raw:=TRUE END; END; IF raw THEN IF ct=tTRACK THEN textinfo(3, FALSE); (* click.cmd:=">";*) (* refresh:=TRUE;*) ELSE textinfo(2, FALSE) END; click.cmd:=" "; END; images(click.table[click.selected].opf, hh[0], click.graphset); refresh:=TRUE; END oneclickinfo; PROCEDURE updatemenus; VAR m:pMENU; BEGIN m:=menus; WHILE m<>NIL DO IF m^.redrawproc<>NIL THEN m^.redrawproc(m);(* m^.redrawproc:=NIL*) END; m:=m^.next; END; refresh:=TRUE; END updatemenus; PROCEDURE Viewline(VAR s:ARRAY OF CHAR); VAR pos:POSITION; zoom:REAL; i:CARDINAL; h:ARRAY[0..100] OF CHAR; BEGIN s[0]:=0C; i:=0; REPEAT zoom:=0.0; posinval(pos); getview(fVIEW, i, zoom, pos); IF zoom=0.0 THEN h:="P "; h[1]:=CHR(i+ORD("1")); ELSE FixToStr(zoom+0.5, 0, h) END; IF Length(h)=1 THEN Append(s, SP6); Append(h,SP4+" ") ELSE Append(s, SP4); Append(h,SP8) END; Append(s, h); INC(i); IF i<4 THEN Append(s, "|") END; UNTIL (zoom=0.0) OR (i>=4); END Viewline; PROCEDURE setunderbar(m:pMENU; x:INTEGER); BEGIN IF lums.headmenuy THEN IF x<0 THEN x:=0 END; m^.x0:=x; m^.y0:=lums.fontysize; END; END setunderbar; PROCEDURE setmenu(menu:pMENU; liney, entries:CARDINAL; background:BACKGROUND); VAR xm:CARDINAL; yh:INTEGER; BEGIN xm:=HIGH(menu^.image^); IF VAL(CARDINAL,click.x)yh THEN menu^.y0:=xmouse.y-yh ELSE menu^.y0:=0 END; appendmenu(menu); clampedline:=0; END setmenu; PROCEDURE newmenu(VAR menu:pMENU; linex, liney, entries:CARDINAL; background:BACKGROUND); BEGIN allocmenu(menu, linex, menuimgy(liney, entries), FALSE); setmenu(menu, liney, entries, background); END newmenu; PROCEDURE refrmenu(VAR menu:pMENU; linex, liney, entries:CARDINAL; background:BACKGROUND; saveimg:BOOLEAN); (* refresh/resize menu *) VAR ys:CARDINAL; BEGIN IF menu<>NIL THEN IF saveimg THEN IF menu^.image=NIL THEN menu^.image:=panoimage; panoimage:=NIL END; END; (* WrInt(ORD(menu^.image=NIL), 3); WrInt(ORD(saveimg), 3); WrInt(linex, 6); WrInt(menu^.xsize, 6); WrInt(liney, 6); WrInt(menu^.yknob, 6); WrStrLn(""); *) ys:=menuimgy(liney, entries); --IF menu^.image<>NIL THEN WrInt(ys, 10); WrInt(HIGH(menu^.image^[0])+1, 10); WrStrLn(" ys ysize") END; IF (menu^.image=NIL) OR (linex<>menu^.xsize) OR (liney<>menu^.yknob) OR (ys<>HIGH(menu^.image^[0])+1) THEN disposeimg(menu^.image); allocimage(menu^.image, linex, ys, menu^.saveimage); IF menu^.image=NIL THEN WrStrLn("menuimage out of memory"); wrheap; RETURN END; menu^.yknob:=liney; menu^.xsize:=linex; IF saveimg THEN clr(menu^.image) END; END; ELSE allocmenu(menu, linex, menuimgy(liney, entries), saveimg); setmenu(menu, liney, entries, background); END; END refrmenu; PROCEDURE domainpop(m:pMENU); VAR olds, oldk, i:CARDINAL; entc:INTEGER; s:ARRAY[0..100] OF CHAR; BEGIN oldk:=m^.oldknob; olds:=m^.oldsub; m^.oldknob:=0; FOR entc:=VAL(INTEGER,click.entries)-1 TO 0 BY -1 DO IF (click.table[entc].opf<>NIL) & (m^.oldknob+1<10) THEN WITH click.table[entc].opf^ DO -- s:=SP6+SP7+"|"+SP1+SPS+"|"; Append(s, call); s:=MOP0+SP6+SP7+"|"; FOR i:=0 TO lums.symsize DIV lums.fontxsize DO Append(s, " ") END; Append(s, call); addonoff(m, s, "?",MINH+1, lums.fontxsize, entc=VAL(INTEGER, click.selected)); drawsym(m^.image, sym.tab, sym.pic, FALSE, FLOAT(lums.symsize DIV 2+lums.fontxsize*2+3), FLOAT((m^.oldknob-1)*m^.yknob+m^.yknob DIV 2), 1000); END; END; END; IF NOT lums.headmenuy THEN addline(m, " Tools", TOOLSMENU+">", MINH+3); END; IF click.entries>0 THEN IF click.selected>=click.entries THEN click.selected:=0 END; addline(m, " More Infos", "i>", MINH+4); IF (click.table[click.selected].opf<>NIL) & (distance(click.table[click.selected].opf^.margin0, click.table[click.selected].opf^.margin1)>0.05) THEN addline(m, " Animate Object", CMDANIMATE1, MINH+5); END; -- IF click.mhop[0]<>0C THEN addline(m, " Focus |+ Rfpath", CMD1USER, MINH+8); -- ELSE addline(m, " Show 1|+ Rfpath", CMD1USER, MINH+6); -- END; addline(m, " Heard | Message", CMDHEARD, MINH+10); END; IF click.mhop[0]<>0C THEN addline(m, " Focus | Show All", "0", MINH+12); END; IF NOT lums.headmenuy THEN addline(m, " On next Click", "K>", MINH+23); END; IF click.entries=0 THEN addline(m, " 1"+SP4+"|"+SP2+"Clr"+SP4+"|"+SP3+"Clr"+SP3+"| 2", SETMARKERSMAP, MINH+15); Viewline(s); addline(m, s, "1", MINH+25); END; IF posvalid(click.markpos) & posvalid(click.measurepos) THEN addline(m, " Zoom to Markers", CMDZOOMTOMARKS, MINH+20) END; addline(m, " - | "+SP4+"| +", CURSDOWN, MINH+30); subicon(m^.image, lums.fontxsize*8, midy(m)+2, 3, lums.fontxsize); addline(m, " |"+SP4+"Center"+SP4+"|", CURSLEFT, MINH+33); subicon(m^.image, 13, midy(m), 1, lums.fontxsize); subicon(m^.image, m^.xsize-13, midy(m), 2, lums.fontxsize); addline(m, " << | "+SP4+"| X", CURSUP, MINH+36); subicon(m^.image, lums.fontxsize*8, midy(m)-2, 4, lums.fontxsize); m^.ysize:=m^.oldknob*m^.yknob; m^.redrawproc:=domainpop; m^.hiknob:=0; m^.oldknob:=oldk; m^.oldsub:=olds; m^.notoverdraw:=TRUE; IF click.entries>0 THEN oneclickinfo END; END domainpop; PROCEDURE mainpop; CONST MENUXLEFT=16; VAR menu:pMENU; yh:INTEGER; BEGIN killallmenus; newmenu(menu, lums.fontxsize*14+16, lums.fontysize+7, MAXKNOBS, bTRANSP); IF NOT lums.headmenuy THEN (* set popup mainmenue to not hide symbol and its texts *) yh:=VAL(INTEGER, mainys())-click.y; IF VAL(CARDINAL,click.x)", MINH*3+2); addline(menu, " Import Log", FILERDLOG+">", MINH*3+3); menu^.redrawproc:=dofilemenu; menu^.hiknob:=0; END dofilemenu; PROCEDURE filemenu; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*13+4, lums.fontysize+7, 10, bTRANSP); dofilemenu(menu); setunderbar(menu, 0); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.wid:=249; menu^.notoverdraw:=TRUE; END filemenu; PROCEDURE listmenu(m:pMENU); VAR mo, s, h:ARRAY[0..99] OF CHAR; i:CARDINAL; BEGIN m^.oldknob:=0; mo:=" - | - | - | - | - | Monitor"; confstr(fWRINCOM, s); FOR i:=0 TO 4 DO IF i=0 THEN h[0]:="n" ELSE h[0]:=CHR(i+ORD("0")) END; h[1]:=0C; IF IsInStr(s, h[0]) THEN Append(h, "+"); IF IsInStr(s, h) THEN mo[i*4+1]:="d" ELSE mo[i*4+1]:="r" END; END; END; addline(m, " Internals", LISTINGS, MINH*4+40); addline(m, " Bulletins", LISTINGS, MINH*4+35); addline(m, " Messages", LISTINGS, MINH*4+30); addline(m, mo, LISTINGS, MINH*4+20); addline(m, " No Pos Beacons| decode", LISTINGS, MINH*4+15); addline(m, " Moving Beacons| decode", LISTINGS, MINH*4+10); addline(m, " Wx Stations | decode", LISTINGS, MINH*4+5); addline(m, " Objects/Items | decode", LISTINGS, MINH*4); m^.redrawproc:=listmenu; m^.hiknob:=0; m^.notoverdraw:=TRUE; END listmenu; PROCEDURE listmen; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*23+4, lums.fontysize+7, 10, bTRANSP); listmenu(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; -- setunderbar(menu, 0); menu^.wid:=249; menu^.notoverdraw:=TRUE; END listmen; PROCEDURE monconfig(sub:CARDINAL); VAR mo, s, h:ARRAY[0..99] OF CHAR; i, st:CARDINAL; BEGIN mo[0]:=0C; confstr(fWRINCOM, s); FOR i:=0 TO 4 DO IF i=0 THEN h[0]:="n" ELSE h[0]:=CHR(i+ORD("0")) END; h[1]:=0C; st:=0; IF IsInStr(s, h[0]) THEN Append(h, "+"); IF IsInStr(s, h) THEN st:=2 ELSE st:=1 END; (* decoded / raw *) END; IF i=sub THEN st:=(st+1) MOD 3 END; (* rotate off/raw/decoded *) IF st>0 THEN IF i=0 THEN Append(mo, "n") ELSE Append(mo, CHR(i+ORD("0"))) END; IF st=2 THEN Append(mo, "+") END; (* decoded *) END; END; icfg(fWRINCOM, mo); updatemenus; END monconfig; PROCEDURE dotoolsmenu(menu:pMENU); BEGIN menu^.oldknob:=0; addline(menu, " Animate", "A", MINH*5+5); IF lums.headmenuy & posvalid(click.markpos) THEN addline(menu, " Clear Markers", ":", MINH*5+15); END; addline(menu, " Send Message", CMDCOMPOMSG, MINH*5+35); addline(menu, " Map directory", CMDMAPDIR, MINH*5+36); addline(menu, " Add Maptypes", CMDMAPADD, MINH*5+38); addline(menu, " Select Data", CMDSPECIALMAP+">", MINH*5+22); addonoff(menu, " |Radiolink", CMDGEOPROFIL+">", MINH*5+17, lums.fontxsize+4, configon(fGEOPROFIL)); addline(menu, " Find", "F>", MINH*5); addline(menu, " Choose Maps", "c>", MINH*5+40); addline(menu, " List", LISTMENU+">", MINH*5+45); IF lums.headmenuy THEN addline(menu, " On next Click", "K>", MINH*5+50); addline(menu, " Toolbar Off", TOOLOFF, MINH*5+55); menu^.x0:=65; menu^.y0:=lums.fontysize; ELSE addline(menu, " Help", HELPMENU+">", MINH*5+60); addline(menu, " Config", CONFIGM2+">", MINH*5+65); addline(menu, " File", FILEMENU+">", MINH*5+70); addline(menu, " Toolbar On", TOOLON, MINH*5+75); END; menu^.redrawproc:=dotoolsmenu; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.hiknob:=0; menu^.wid:=249; menu^.notoverdraw:=TRUE; END dotoolsmenu; PROCEDURE toolsmenu; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*14+4, lums.fontysize+5, 16, bTRANSP); dotoolsmenu(menu); -- menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END toolsmenu; PROCEDURE drawsquare(image:pIMAGE; col:PIX; x0, y0, x1, y1:INTEGER); VAR x, y:INTEGER; BEGIN IF x0<0 THEN x0:=0 END; IF x1<0 THEN x1:=0 END; IF y0<0 THEN y0:=0 END; IF y1<0 THEN y1:=0 END; IF x0>VAL(INTEGER,HIGH(image^)) THEN x0:=VAL(INTEGER,HIGH(image^)) END; IF x1>VAL(INTEGER,HIGH(image^)) THEN x1:=VAL(INTEGER,HIGH(image^)) END; IF y0>VAL(INTEGER,HIGH(image^[0])) THEN y0:=VAL(INTEGER,HIGH(image^[0])) END; IF y1>VAL(INTEGER,HIGH(image^[0])) THEN y1:=VAL(INTEGER,HIGH(image^[0])) END; FOR y:=y0 TO y1 DO FOR x:=x0 TO x1 DO image^[x][y]:=col END; END; END drawsquare; PROCEDURE drawsymsquare(image:pIMAGE; tab, sym:CHAR; x0, y0:INTEGER); VAR col:PIX; BEGIN IF NOT (ORD(tab) IN SYMTABLE) THEN tab:="\"; sym:="?"; textautosize(0, 0, 6, 2, "e", LF+"illegal symbol"+LF); END; col.r:=300; col.g:=301; col.b:=300; drawsquare(image, col, x0-VAL(INTEGER, lums.symsize DIV 2), y0-VAL(INTEGER, lums.symsize DIV 2), x0+VAL(INTEGER, lums.symsize DIV 2), y0+VAL(INTEGER, lums.symsize DIV 2)); drawsym(image, tab,sym, FALSE, FLOAT(x0), FLOAT(y0), 1000); END drawsymsquare; PROCEDURE specialmapmenu(m:pMENU); VAR s, h:ARRAY[0..99] OF CHAR; BEGIN m^.oldknob:=0; addline(m, " Show All", CMDRAIN, MINH*86+0); addline(m, " Show POI", "C>", MINH*86+3); addline(m, " WX Stations", CMDRAIN, MINH*86+5); addline(m, " Temp Colourmap", "W", MINH*86+10); addline(m, " Rain Colourmap", "W", MINH*86+15); addline(m, " Dimm Notmover", "m", MINH*86+20); confstr(fONESYMB, s); s[2]:=0C; h:=" Symbol |"; Append(h, s); addline(m, h, CONFONESYM+">", MINH*86+25); IF ORD(s[0]) IN SYMTABLE THEN drawsymsquare(m^.image, s[0], s[1], m^.xsize-lums.symsize DIV 2-lums.fontxsize-8, (m^.oldknob-1)*m^.yknob+m^.yknob DIV 2); END; m^.redrawproc:=specialmapmenu; m^.hiknob:=0; END specialmapmenu; PROCEDURE specialmap; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+7, 10, bTRANSP); specialmapmenu(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.wid:=249; menu^.notoverdraw:=TRUE; END specialmap; PROCEDURE helpmenu; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*25+4, lums.fontysize+7, 4, bTRANSP); -- addline(menu, "Shortcuts", CMDSHORTCUTLIST, MINH*6); addline(menu, "Check Version", CMDHELPTEXT, MINH*6+7); addline(menu, "Helptext", CMDHELPTEXT, MINH*6+10); addline(menu, VERS+" by OE5DXL ", " ", MINH*6+5); setunderbar(menu, 37); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.wid:=249; menu^.notoverdraw:=TRUE; END helpmenu; PROCEDURE mapchoose; CONST MAXBUTT=20; MTAB="789"; VAR menu:pMENU; i,n,m:CARDINAL; s:ARRAY[0..100] OF CHAR; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+7, MAXBUTT, bTRANSP); m:=0; FOR n:=MAXBUTT-3 TO 0 BY -1 DO; confstrings(fMAPNAMES, n, FALSE, s); IF s[0]<>0C THEN i:=0; WHILE (i" ") DO INC(i) END; s[i]:=0C; IF m<3 THEN Append(s, " ["); Append(s, MTAB[m]); Append(s, "]") END; INC(m); addline(menu, s, CMDMAPCHOOSE, MINH*7+10); END; END; addline(menu, "Download", DOWNLOADMAP, MINH*7); addline(menu, "Reload", CMDRELOADMAP, MINH*7+1); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END mapchoose; PROCEDURE nextclick; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*13+4, lums.fontysize+7, 10, bTRANSP); addline(menu, "Symbol Hover", CMDONCLICK+">", MINH*9+5); addline(menu, "To Map", CMDONCLICK+">", MINH*9); addline(menu, "To Text", CMDONCLICK+">", MINH*9+1); addline(menu, "To Symbol", CMDONCLICK+">", MINH*9+2); addline(menu, "To WxSymbol", CMDONCLICK+">", MINH*9+3); addline(menu, "To Track", CMDONCLICK+">", MINH*9+4); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END nextclick; PROCEDURE mapclick; VAR menu:pMENU; s:ARRAY[0..99] OF CHAR; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+7, 10, bTRANSP); confstr(fCLICKMAP, s); addonoff(menu, SPOO+"|Center", MAPCLICK, MINH*10, lums.fontxsize+2, s[0]=CMDCENTERMOUSE); addonoff(menu, SPOO+"|Set Marker 1", MAPCLICK, MINH*10+5, lums.fontxsize+2, s[0]="X"); addonoff(menu, SPOO+"|Set Marker 2", MAPCLICK, MINH*10+10, lums.fontxsize+2, s[0]="Y"); addonoff(menu, SPOO+"|Marker 1 then 2", MAPCLICK, MINH*10+15, lums.fontxsize+2, s[0]="2"); IF NOT lums.headmenuy THEN addline(menu, SPOO+"|Menu", MAPCLICK, MINH*10+20); ELSE addline(menu, SPOO+"|More Options", MAPCLICK, MINH*10+25); END; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END mapclick; PROCEDURE wxonoff(menu:pMENU); VAR ch:ARRAY[0..50] OF CHAR; wset:sWXSET; BEGIN getwxset(fCLICKWXSYM, ch, wset); menu^.oldknob:=0; (* addonoff(menu, SPOO+"|Center", WXCLICK, MINH*11, lums.fontxsize+1, IsInStr(ch,"C")); addonoff(menu, SPOO+"|Zoom To", WXCLICK, MINH*11+1, lums.fontxsize+1, IsInStr(ch,CMD1USER)); addonoff(menu, SPOO+"|Show Rf", WXCLICK, MINH*11+2, lums.fontxsize+1, IsInStr(ch,CMD1USERRF)); addonoff(menu, SPOO+"|Heard", WXCLICK, MINH*11+3, lums.fontxsize+1, IsInStr(ch,CFGHEARD)); addonoff(menu, SPOO+"|Beacon Hist", WXCLICK, MINH*11+4, lums.fontxsize+1, IsInStr(ch,"b")); *) addonoff(menu, SPOO+"|Raw+Decoded", WXCLICK, MINH*11, lums.fontxsize+1, IsInStr(ch,CFGRAWDECODED)); addonoff(menu, SPOO+"|Finedust", WXCLICK, MINH*11+1, lums.fontxsize+1, wFINEDUST IN wset); addonoff(menu, SPOO+"|Gamma", WXCLICK, MINH*11+2, lums.fontxsize+1, wSIEV IN wset); addonoff(menu, SPOO+"|Luminosity", WXCLICK, MINH*11+3, lums.fontxsize+1, wLUMI IN wset); addonoff(menu, SPOO+"|Rain", WXCLICK, MINH*11+4, lums.fontxsize+1, wRAIN IN wset); addonoff(menu, SPOO+"|Wind Dir", WXCLICK, MINH*11+5, lums.fontxsize+1, wWINDDIR IN wset); addonoff(menu, SPOO+"|Wind", WXCLICK, MINH*11+6, lums.fontxsize+1, wWIND IN wset); addonoff(menu, SPOO+"|Humidity", WXCLICK, MINH*11+7, lums.fontxsize+1, wHYG IN wset); addonoff(menu, SPOO+"|Barometer", WXCLICK, MINH*11+8, lums.fontxsize+1, wBARO IN wset); addonoff(menu, SPOO+"|Temp", WXCLICK, MINH*11+9, lums.fontxsize+1, wTEMP IN wset); addline(menu, SPOO+"|Menu", WXCLICK, MINH*11+10); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END wxonoff; PROCEDURE wxclick; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+3, 18, bTRANSP); wxonoff(menu); END wxclick; PROCEDURE hoveronoff(menu:pMENU); VAR ch:ARRAY[0..50] OF CHAR; wset:sWXSET; BEGIN getwxset(fHOVERSET, ch, wset); menu^.oldknob:=0; addonoff(menu, SPOO+"|Raw+Decoded", HOVERCLICK, MINH*11+51, lums.fontxsize+1, IsInStr(ch,CFGRAWDECODED)); addonoff(menu, SPOO+"|Finedust", HOVERCLICK, MINH*11+52, lums.fontxsize+1, wFINEDUST IN wset); addonoff(menu, SPOO+"|Gamma", HOVERCLICK, MINH*11+52, lums.fontxsize+1, wSIEV IN wset); addonoff(menu, SPOO+"|Luminosity", HOVERCLICK, MINH*11+52, lums.fontxsize+1, wLUMI IN wset); addonoff(menu, SPOO+"|Rain", HOVERCLICK, MINH*11+53, lums.fontxsize+1, wRAIN IN wset); addonoff(menu, SPOO+"|Wind Dir", HOVERCLICK, MINH*11+54, lums.fontxsize+1, wWINDDIR IN wset); addonoff(menu, SPOO+"|Wind", HOVERCLICK, MINH*11+55, lums.fontxsize+1, wWIND IN wset); addonoff(menu, SPOO+"|Humidity", HOVERCLICK, MINH*11+56, lums.fontxsize+1, wHYG IN wset); addonoff(menu, SPOO+"|Barometer", HOVERCLICK, MINH*11+57, lums.fontxsize+1, wBARO IN wset); addonoff(menu, SPOO+"|Temp", HOVERCLICK, MINH*11+58, lums.fontxsize+1, wTEMP IN wset); addline(menu, SPOO+"|Hover OFf", HOVERCLICK, MINH*11+59); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END hoveronoff; PROCEDURE hoverclick; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+3, 20, bTRANSP); hoveronoff(menu); END hoverclick; PROCEDURE trackonoff(menu:pMENU; on:CHAR; v:CONFSET); VAR w:ARRAY[0..99] OF CHAR; BEGIN confstr(v, w); menu^.oldknob:=0; addonoff(menu, SPOO+"|Del Waypoint", on, MINH*12+8, lums.fontxsize+1, IsInStr(w,CMDDELWAYPOINT)); addonoff(menu, SPOO+"|Altitude", on, MINH*12+7, lums.fontxsize+1, IsInStr(w,"n")); addonoff(menu, SPOO+"|Speed Hist", on, MINH*12, lums.fontxsize+1, IsInStr(w,"s")); addonoff(menu, SPOO+"|Animate", on, MINH*12+1, lums.fontxsize+1, IsInStr(w,"A")); addonoff(menu, SPOO+"|Zoom To", on, MINH*12+2, lums.fontxsize+1, IsInStr(w,CMD1USER)); addonoff(menu, SPOO+"|Show Rf", on, MINH*12+3, lums.fontxsize+1, IsInStr(w,CMD1USERRF)); addonoff(menu, SPOO+"|Beacon Hist", on, MINH*12+4, lums.fontxsize+1, IsInStr(w,"b")); addonoff(menu, SPOO+"|Raw+Decoded", on, MINH*12+5, lums.fontxsize+1, IsInStr(w,CFGRAWDECODED)); addline(menu, SPOO+"|Menu", on, MINH*12+6); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END trackonoff; PROCEDURE trackclick; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+3, 20, bTRANSP); trackonoff(menu, TRACKCLICK, fCLICKTRACK); END trackclick; PROCEDURE symbolonoff(menu:pMENU; on:CHAR; v:CONFSET); VAR w:ARRAY[0..30] OF CHAR; BEGIN confstr(v, w); menu^.oldknob:=0; addonoff(menu, SPOO+"|Set Marker 2", on, MINH*13, lums.fontxsize+1, IsInStr(w,"Y")); addonoff(menu, SPOO+"|Set Marker 1", on, MINH*13+1, lums.fontxsize+1, IsInStr(w,"X")); addonoff(menu, SPOO+"|Center", on, MINH*13+2, lums.fontxsize+1, IsInStr(w,"C")); addonoff(menu, SPOO+"|Raw+Decoded", on, MINH*13+3, lums.fontxsize+1, IsInStr(w,CFGRAWDECODED)); addonoff(menu, SPOO+"|Animate", on, MINH*13+4, lums.fontxsize+1, IsInStr(w,"A")); addonoff(menu, SPOO+"|Zoom To", on, MINH*13+5, lums.fontxsize+1, IsInStr(w,CMD1USER)); addonoff(menu, SPOO+"|Show Rf", on, MINH*13+6, lums.fontxsize+1, IsInStr(w,CMD1USERRF)); addonoff(menu, SPOO+"|Heard", on, MINH*13+7, lums.fontxsize+1, IsInStr(w,CFGHEARD)); addonoff(menu, SPOO+"|Beacon Hist", on, MINH*13+8, lums.fontxsize+1, IsInStr(w,"b")); addonoff(menu, SPOO+"|Speed Hist", on, MINH*13+9, lums.fontxsize+1, IsInStr(w,"s")); addonoff(menu, SPOO+"|Altitude", on, MINH*13+10, lums.fontxsize+1, IsInStr(w,"n")); addline(menu, SPOO+"|Menue", on, MINH*13+11); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END symbolonoff; PROCEDURE symbolclick(on:CHAR; v:CONFSET); VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+3, 20, bTRANSP); symbolonoff(menu, on, v); END symbolclick; PROCEDURE toggwx(set:CONFSET; w:WXSET); (* swich wx graphics on/off *) VAR n:CARDINAL; s:ARRAY[0..99] OF CHAR; BEGIN n:=ORD(w)+1; confstr(set, s); --WrStr(s); WrStrLn(""0" THEN s[0]:=0C END; (* all off *) WHILE Length(s)NIL THEN WITH click.table[click.selected] DO IF (pff0<>NIL) & (typf<>tOBJECT) & (typf<>tSYMBOL) THEN RETURN TRUE END; END; END; RETURN FALSE END testdelwaypoint; PROCEDURE infosdo(menu:pMENU); VAR op:pOPHIST; s,h:ARRAY[0..100] OF CHAR; what:sWXSET; test:BOOLEAN; lastval:LASTVAL; img1:pIMAGE; km:REAL; beacons, acks, msgs, rejs, oldk, olds:CARDINAL; BEGIN op:=selop(); oldk:=menu^.oldknob; olds:=menu^.oldsub; menu^.oldknob:=0; IF lums.errorstep THEN s:=SP2+" | Errors |" ELSE s:=SP2+" | Waypoints |" END; addline(menu, s, "e", MINH*14); subicon(menu^.image, 13, midy(menu), 1, 7); subicon(menu^.image, HIGH(menu^.image^)-14, midy(menu), 2, 7); what:=sWXSET{}; img1:=NIL; wxgraph(img1, selop(), systime, what, lastval); addline(menu, " List Raw |+ Decoded", LISTDEBUG, MINH*14+5); IF posvalid(op^.lastpos) THEN addline(menu, " Marker 1 | Marker 2", SETMARKERS, MINH*14+7); END; test:=TRUE; kmhist(img1, op, test); IF test THEN addline(menu, " Speed Diagram", "s", MINH*14+10) END; test:=TRUE; althist(img1, op, test, km, beacons, msgs, acks, rejs); s:=" "; IF km<999.9 THEN FixToStr(km, 3, h) ELSE FixToStr(km, 0, h) END; Append(s, h); Append(s, "km "); IF test THEN Append(s, "Altitudes") ELSE Append(s, "Moved") END; IF (km>0.05) OR test THEN addline(menu, s, "n", MINH*14+15) END; s:=" "; IntToStr(beacons, 1, h); Append(s, h); Append(s, " Beacon Times"); addline(menu, s, "b", MINH*14+20); addline(menu, " Save Info to File", CMDSAVETRACK, MINH*14+25); IF beaconediting THEN addline(menu, " Clone to Beaconeditor", CMDCLONE, MINH*14+27) END; IF (op<>NIL) & isinwatch(op^.call) THEN addline(menu, " Disable in Watchlist", DELWATCH, MINH*14+30); ELSE addline(menu, " Add to Watchlist", ADDWATCH, MINH*14+35) END; objsender(selop(), h); IF h[0]<>0C THEN -- Assign(click.mhop, h); s:=" Objects of "; Append (s, h); addline(menu, s, "o", MINH*14+38); END; IF op<>NIL THEN s:=" Delete "; IF testdelwaypoint() THEN Append(s, "Waypoint"); ELSE Append(s, op^.call) END; addline(menu, s, CURSDEL, MINH*14+40); END; IF km>0.05 THEN addline(menu, " Change Trackcolour", "~", MINH*14+45) END; s:=" Msg "; IntToStr(msgs, 1, h); Append(s, h); Append(s, "/Ack "); IntToStr(acks, 1, h); Append(s, h); Append(s, "/Rej "); IntToStr(rejs, 1, h); Append(s, h); IF msgs>0 THEN addline(menu, s, LISTUSERMSGS, MINH*14+50); ELSE addline(menu, s, 0C, MINH*14+50) END; IF wTEMP IN what THEN FixToStr(lastval.temp, 2, s); h:="Temp |"; Append(h, s); Append(h, DEGSYM+"C"); addline(menu, h, "w", MINH*14+55); END; IF wBARO IN what THEN FixToStr(lastval.baro, 2, s); h:="Barometer |"; Append(h, s); Append(h, "hPa"); addline(menu, h, "p", MINH*14+58); END; IF wHYG IN what THEN FixToStr(lastval.hyg, 0, s); h:="Humidity |"; Append(h, s); Append(h, "%"); addline(menu, h, "h", MINH*14+60); END; IF wWIND IN what THEN FixToStr(lastval.winds, 2, s); h:="Wind |"; Append(h, s); Append(h, "km/h"); addline(menu, h, "j", MINH*14+62); IF (lastval.gust<1000.0) & (lastval.gust>=lastval.winds) THEN FixToStr(lastval.gust, 2, s); h:="Gust |"; Append(h, s); Append(h, "km/h"); addline(menu, h, "j", MINH*14+62); END; END; IF wWINDDIR IN what THEN FixToStr(lastval.winddir, 0, s); h:="Wind Dir |"; Append(h, s); Append(h, "deg"); addline(menu, h, "d", MINH*14+64); END; IF wRAIN IN what THEN IF lastval.rain>0.0 THEN FixToStr(lastval.rain, 2, s); h:="Rain |"; Append(h, s); Append(h, "mm"); addline(menu, h, "r", MINH*14+66); END; IF lastval.rain1>0.0 THEN FixToStr(lastval.rain1, 2, s); h:="Rain last h|"; Append(h, s); Append(h, "mm"); addline(menu, h, "r", MINH*14+66); END; IF lastval.rain24>0.0 THEN FixToStr(lastval.rain24,2,s); h:="Rain in 24h|"; Append(h, s); Append(h, "mm"); addline(menu, h, "r", MINH*14+66); END; END; IF wLUMI IN what THEN FixToStr(lastval.lumi, 0, s); h:="Luminosity |"; Append(h, s); Append(h, "W/m2"); addline(menu, h, "l", MINH*14+68); END; IF wSIEV IN what THEN h:="Radiation |"; sievert2str(lastval.siev, s); Append(h, s); addline(menu, h, "g", MINH*14+70); END; IF wFINEDUST IN what THEN IF lastval.dust10>0 THEN IntToStr(lastval.dust10, 0, s);h:="PM10 |"; Append(h, s); Append(h, "ug/m3"); addline(menu, h, "f", MINH*14+70); END; IF lastval.dust2>0 THEN IntToStr(lastval.dust2, 0, s); h:="PM2.5 |"; Append(h, s); Append(h, "ug/m3"); addline(menu, h, "f", MINH*14+70); END; IF lastval.dust1>0 THEN IntToStr(lastval.dust1, 0, s); h:="PM1 |"; Append(h, s); Append(h, "ug/m3"); addline(menu, h, "f", MINH*14+70); END; IF lastval.dust01>0 THEN IntToStr(lastval.dust01, 0, s);h:="PM0.1 |"; Append(h, s); Append(h, "ug/m3"); addline(menu, h, "f", MINH*14+70); END; END; menu^.redrawproc:=infosdo; menu^.hiknob:=0; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=oldk; menu^.oldsub:=olds; menu^.notoverdraw:=TRUE; END infosdo; PROCEDURE infos; VAR menu:pMENU; BEGIN IF selop()<>NIL THEN newmenu(menu, lums.fontxsize*21+4, lums.fontysize+5, 29, bTRANSP); infosdo(menu); -- menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END; END infos; PROCEDURE potimove(m:pMENU; potx, knob:CARDINAL); CONST MAXGAMMA=10; MINBRIGHT=3600; MAXFADE=600*60; MAXFPS=200*25; VAR s,h:ARRAY[0..99] OF CHAR; v, vp, vw, vd, tx1, potwidth:CARDINAL; maxbright:TIME; gam:REAL; PROCEDURE perc(cfg:CONFSET; def:CARDINAL; VAR lum:INTEGER); VAR v:CARDINAL; BEGIN v:=conf2int(cfg, 0, 0, 100, def); IF potx>0 THEN v:=vw*100 DIV WHITELEVEL; lum:=vw END; Assign(s, configs[cfg].title); int2cfg(cfg, v); IntToStr(v, 0, h); Append(h,"%"); vd:=v*potwidth DIV 100; END perc; BEGIN potwidth:=POTWIDTH*lums.fontxsize; lums.moving:=FALSE; IF potxpotwidth THEN vp:=potwidth END; tx1:=potwidth-40; vw:=vp*WHITELEVEL DIV potwidth; vd:=0; IF knob=1 THEN perc(fLOBJ, DEFLOBJ, lums.obj); ELSIF knob=2 THEN perc(fLMAP, DEFAULTBRI, lums.map); mapbritocfg; ELSIF knob=3 THEN perc(fLTRACK, DEFLTRACK, lums.track); ELSIF knob=4 THEN gam:=lums.gamma; IF potx>0 THEN gam:=FLOAT(vp)*10.0/FLOAT(potwidth); IF gam<0.2 THEN gam:=0.2 END; lums.gamma:=gam; END; Gammatab(lums.gamma); s:="Gamma"; FixToStr(gam+0.05, 2, h); icfg(fGAMMA, h); vd:=trunc(gam*FLOAT(potwidth)/10.0); ELSIF knob=5 THEN perc(fLSYM, DEFLSYM, lums.sym); ELSIF knob=6 THEN perc(fLTEXT, DEFLTEXT, lums.text); ELSIF knob=7 THEN perc(fLWAY, DEFLWAY, lums.waypoint); ELSIF knob=8 THEN maxbright:=lums.purgetime; IF maxbrightlums.purgetime THEN v:=lums.purgetime END; IF potx>0 THEN v:=vp*maxbright DIV potwidth; lums.firstdim:=v END; s:="Time full Bright"; int2cfg(fTFULL, v DIV 60); IF v<3600*2 THEN IntToStr(v DIV 60, 0, h); Append(h,"Min"); ELSE IntToStr(v DIV 3600, 0, h); Append(h,"h") END; vd:=v*potwidth DIV maxbright; ELSIF knob=9 THEN v:=lums.maxdim; IF potx>0 THEN v:=vp*MAXFADE DIV potwidth; lums.maxdim:=v END; s:="Time Fade Out"; IntToStr(v DIV 60, 0, h); icfg(fTFADE, h); Append(h,"Min"); vd:=v*potwidth DIV MAXFADE; ELSIF knob=POTIFPS THEN (* v:=lums.actfps; IF potx>0 THEN v:=vp*MAXFPS DIV potwidth; lums.actfps:=v END; IF lums.actfps=0 THEN lums.actfps:=1 END; s:="s/Frame"; IntToStr(v, 0, h); vd:=v*potwidth DIV MAXFPS; *) v:=lums.actfps; IF potx>0 THEN v:=vp*vp*MAXFPS DIV (potwidth*potwidth) END; IF v=0 THEN v:=1 END; lums.actfps:=v; s:="s/Frame"; IntToStr(v, 0, h); vd:=VAL(CARDINAL, sqrt(FLOAT(v*potwidth*potwidth DIV MAXFPS))); tx1:=90; knob:=1; END; potival(m, knob, vd, POTIOFF+3, tx1, s, h); m^.notoverdraw:=TRUE; END potimove; PROCEDURE potisonoff(menu:pMENU); VAR i:CARDINAL; BEGIN menu^.oldknob:=0; FOR i:=1 TO 9 DO addline(menu, "", DOPOTIS, MINH*15+i); potimove(menu, 0, i); END; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END potisonoff; PROCEDURE potis; VAR menu:pMENU; BEGIN newmenu(menu, POTWIDTH*lums.fontxsize+POTIOFF*2, lums.fontysize+9, 10, bCOLOR); potisonoff(menu); END potis; PROCEDURE abortpoponoff(menu:pMENU); BEGIN menu^.oldknob:=0; addline(menu, "", CMDFPS, MINH*19); potimove(menu, 0, POTIFPS); addline(menu, "Abort", 3C, MINH*19+5); addline(menu, "Continue","A", MINH*19+10); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END abortpoponoff; PROCEDURE abortpop; VAR menu:pMENU; BEGIN killallmenus; newmenu(menu, lums.fontxsize*40+4, lums.fontysize+7, 4, bTRANSP); abortpoponoff(menu); END abortpop; PROCEDURE linewr(m:pMENU; knob, x0, curs, width:CARDINAL; curson:BOOLEAN; s, s1:ARRAY OF CHAR); CONST noprop=TRUE; VAR x, y, x1, y1, i, iw, ic:CARDINAL; inc:INTEGER; col:COLTYP; BEGIN IF knob=0 THEN RETURN END; FOR y:=2 TO m^.yknob-3 DO FOR x:=x0 TO m^.xsize-TEXTBUTTONMARGIN DO WITH m^.image^[x][y+(knob-1)*m^.yknob] DO r:=200; g:=211; b:=200 END; END; END; -- Colset(col, "W"); (*"Y"*) col.r:=256; col.g:=201; col.b:=256; --title x:=x0; y:=(knob-1)*m^.yknob+knobtexty(m^.yknob); FOR i:=1 TO Length(s) DO drawchar(m^.image, s[i-1], FLOAT(x), FLOAT(y), inc, 1000, 1, col, FALSE); IF noprop THEN inc:=lums.fontxsize END; INC(x, inc); END; x1:=x+lums.fontxsize; --title --text IF width>0 THEN i:=m^.xsize-TEXTBUTTONMARGIN; -- IF width>0 THEN iw:=x1+width*lums.fontxsize+2; IF iwm^.xsize THEN i:=(x-m^.xsize) DIV lums.fontxsize ELSE i:=0 END; x:=x1; LOOP inc:=lums.fontxsize; IF i=HIGH(s1) THEN EXIT END; INC(i); END; END; --text END linewr; PROCEDURE keybknob(m:pMENU; knob:CARDINAL; withcurs:BOOLEAN; posx:CARDINAL); VAR idx:CONFSET; x,l:CARDINAL; s:ARRAY[0..999] OF CHAR; BEGIN idx:=VAL(CONFSET, m^.confidx[knob]); IF (idx<=MAX(CONFSET)) & (knob IN m^.clampkb) THEN WITH configs[idx] DO IF isbool(typ) THEN x:=TEXTBUTTONMARGIN+13 ELSE x:=TEXTBUTTONMARGIN END; IF posx>x THEN posx:=(posx-x) DIV lums.fontxsize; l:=Length(title)+1; IF (clampedline=knob) & (posx>=l) THEN -- IF posx>=l THEN curspos:=posx-l; refresh:=TRUE; END; END; confstr(idx, s); linewr(m, knob, x, curspos, width, withcurs, title, s); END; IF posx<>0 THEN clampedline:=knob END; END; END keybknob; PROCEDURE setmenupos(m:pMENU; defx, defy:CARDINAL); VAR xc, yc:CARDINAL; BEGIN IF (m<>NIL) & (ORD(m^.pullconf)>0) THEN xc:=conf2int(m^.pullconf, 0, 0, MAXXSIZE, 0); yc:=conf2int(m^.pullconf, 1, 0, MAXYSIZE, 0); IF (xc=0) & (yc=0) THEN (* not pulled set default *) m^.x0:=defx; m^.y0:=defy; ELSE (* set pulled pos and save *) -- IF xc+m^.xsize>VAL(CARDINAL, xsize) THEN xc:=MAXXSIZE END; (* connect to window frame *) -- IF yc+m^.ysize>VAL(CARDINAL, ysize) THEN yc:=MAXYSIZE END; (* connect to window frame *) IF xc+m^.xsize>VAL(CARDINAL, xsize) THEN xc:=VAL(CARDINAL, xsize)-m^.xsize END; IF yc+m^.ysize>VAL(CARDINAL, ysize) THEN yc:=VAL(CARDINAL, ysize)-m^.ysize END; m^.x0:=xc; m^.y0:=yc; -- saveXYtocfg(m^.pullconf, xc, yc); END; END; END setmenupos; PROCEDURE invline(im:pIMAGE; x0, y0, x1, y1:CARDINAL; allcolor:BOOLEAN); CONST W=1024; VAR x, y:CARDINAL; BEGIN --WrInt(x1, 10); WrInt(HIGH(im^), 10); WrInt(y1, 10);WrInt(HIGH(im^[0]), 10); WrLn; IF (y1<=HIGH(im^[0])) & (x1<=HIGH(im^)+1) THEN FOR y:=y0 TO y1 DO FOR x:=x0+2 TO x1-1 DO WITH im^[x][y] DO (* IF allcolor OR ((r=g) & (g=b)) THEN IF allcolor OR NOT ODD(g) THEN w:=g; IF w>W THEN w:=0 ELSE w:=W-w END; r:=w; g:=w; b:=w; END; *) IF allcolor OR NOT ODD(g) THEN IF r>W THEN r:=W END; IF g>W THEN g:=W END; IF b>W THEN b:=W END; r:=W-r; g:=W-g; b:=W-b; END; END; END; END; END; END invline; PROCEDURE inv(m:pMENU; sub, k:CARDINAL); CONST W=1024; VAR x0, y0, x1, y1:CARDINAL; BEGIN IF NOT (k-1 IN m^.nohilite) THEN IF k IN m^.clampkb THEN x0:=m^.subk[k-1][1]; x1:=m^.xsize; IF (sub=0) & (x0>0) THEN x1:=x0; x0:=0 END; ELSIF sub=0 THEN x0:=0; x1:=m^.subk[k-1][0]; ELSE x0:=m^.subk[k-1][sub-1]; x1:=m^.subk[k-1][sub]; END; IF x1=0 THEN x1:=m^.xsize END; y0:=(k-1)*m^.yknob+1; y1:=k*m^.yknob-2; invline(m^.image, x0, y0, x1, y1, FALSE); END; END inv; PROCEDURE movewin(pm:pMENU; dx, dy:INTEGER); VAR xc, yc:CARDINAL; BEGIN IF ORD(pm^.pullconf)>0 THEN xc:=conf2int(pm^.pullconf, 0, 0, MAXXSIZE, 0); yc:=conf2int(pm^.pullconf, 1, 0, MAXYSIZE, 0); xc:=inclim(xc, dx, 0); yc:=inclim(yc, dy, 0); IF xc+pm^.xsize>=VAL(CARDINAL, xsize) THEN xc:=MAXXSIZE END; (* connect to window frame *) IF yc+pm^.ysize>=VAL(CARDINAL, ysize) THEN yc:=MAXYSIZE END; (* connect to window frame *) saveXYtocfg(pm^.pullconf, xc, yc); END; END movewin; PROCEDURE dosymchoose(menu:pMENU); (* draw symbol chart to select one *) CONST YS=12; S=SYMCHFRAME+SPS+"|"; VAR x, y,xx,yy,wi:CARDINAL; t:CHAR; BEGIN menu^.oldknob:=0; wi:=microspace(SYMCHFRAME); FOR y:=0 TO YS-1 DO addline(menu, S+S+S+S+S+S+S+S+S+S+S+S+S+S+S+S, CHR(menu^.scroll), MINH*21+16*((YS-1)-y)); END; FOR y:=0 TO HIGH(menu^.image^[0]) DO FOR x:=0 TO HIGH(menu^.image^) DO IF (x MOD (lums.symsize+wi)>1) & ((y+1) MOD (lums.symsize+2)>1) THEN WITH menu^.image^[x][y] DO r:=140; g:=140; b:=140 END; ELSE WITH menu^.image^[x][y] DO r:=0; g:=0; b:=0 END; END; END; END; FOR y:=0 TO YS-1 DO IF y<6 THEN t:="/" ELSE t:="\" END; FOR x:=0 TO 15 DO drawsym(menu^.image, t, CHR(32+x+16*(y MOD 6)), FALSE, FLOAT(x*(lums.symsize+wi)+(lums.symsize+2) DIV 2+1), FLOAT(((YS-1)-y)*(lums.symsize+2)+(lums.symsize+2) DIV 2), 250); IF (CHR(menu^.scroll)=CHOOSEONESYM) & (x+y*16 IN click.onesymbolset) THEN FOR yy:=0 TO lums.symsize+1 DO xx:=0; REPEAT WITH menu^.image^[xx+x*(lums.symsize+wi)+1][yy+((YS-1)-y)*(lums.symsize+2)] DO r:=(xx+yy)*30; g:=1000; b:=300 END; IF (yy=0) OR (yy=lums.symsize+1) THEN INC(xx) ELSE INC(xx, lums.symsize+1) END; UNTIL xx>=lums.symsize+2; END; END; END; END; menu^.redrawproc:=dosymchoose; menu^.hiknob:=0; menu^.notoverdraw:=TRUE; -- menu^.ysize:=menu^.oldknob*menu^.yknob; -- menu^.oldknob:=0; END dosymchoose; PROCEDURE symchoose(myorbeacon:CHAR); CONST YS=12; VAR menu:pMENU; wi :CARDINAL; BEGIN rdonesymb(click.onesymbol.tab<>0C, FALSE); wi:=microspace(SYMCHFRAME); newmenu(menu, 16*(lums.symsize+wi)+2, lums.symsize+2, YS, bCOLOR); menu^.scroll:=ORD(myorbeacon); dosymchoose(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END symchoose; PROCEDURE overlaychoose(myorbeacon:CHAR); --CONST S=SP9+SP8+"|"; VAR menu:pMENU; BEGIN newmenu(menu, 12*(lums.fontxsize*2+1), lums.fontysize+5, 5, bCOLOR); addline(menu, "0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |", myorbeacon, MINH*41); addline(menu, "N |O |P |Q |R |S |T |U |V |W |X |Y |Z |", myorbeacon, MINH*21+40); addline(menu, "A |B |C |D |E |F |G |H |I |J |K |L |M |", myorbeacon, MINH*21+40); addline(menu, "n |o |p |q |r |s |t |u |v |w |x |y |z |", myorbeacon, MINH*21+40); addline(menu, "a |b |c |d |e |f |g |h |i |j |k |l |m |", myorbeacon, MINH*21+40); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; -- setmenupos(menu, xmouse.x, xmouse.y); menu^.x0:=xmouse.x; IF xmouse.y>8 THEN menu^.y0:=xmouse.y-8 ELSE menu^.y0:=0 END; menu^.wid:=OVERLAYID; END overlaychoose; PROCEDURE AppBlueButton(VAR s:ARRAY OF CHAR; text:ARRAY OF CHAR; on:BOOLEAN); BEGIN IF on THEN Append(s, MOP2) END; Append(s, text); END AppBlueButton; PROCEDURE AddEditLine(m:pMENU; cmd:ARRAY OF CHAR; text-:ARRAY OF CHAR; conf:CONFSET; help:CARDINAL); BEGIN INC(m^.scroll); IF text[0]=0C THEN addline(m, "", cmd, help); INCL(m^.clampkb, m^.scroll); m^.confidx[m^.scroll]:=ORD(conf); keybknob(m, m^.scroll, FALSE, 0); ELSE addline(m, text, " ", help); EXCL(m^.clampkb, m^.scroll); m^.confidx[m^.scroll]:=0; END; END AddEditLine; PROCEDURE managemsg(scroll, num:CARDINAL); VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*8+4, lums.fontysize+5, 6, bCOLOR); menu^.scroll:=scroll-num; addline(menu, "Edit", CMDDOMSG, MINH*69); addline(menu, "Set Port", CMDDOMSG, MINH*69+1); addline(menu, "Hold", CMDDOMSG, MINH*69+2); addline(menu, "Restart", CMDDOMSG, MINH*69+3); addline(menu, "Kick", CMDDOMSG, MINH*69+4); addline(menu, "Delete", CMDDOMSG, MINH*69+5); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END managemsg; PROCEDURE setmsgport(p:CARDINAL); VAR c:CHAR; BEGIN IF p=0 THEN c:="A" ELSIF p=1 THEN c:="N" ELSE c:=CHR(p-1+ORD("0")) END; icfg(fMSGPORT, c); END setmsgport; PROCEDURE sendmsg; CONST YKNOB=20; YPOS=200; MLINES=6; (* static menu lines *) DAY=86400; NOTIME ="--:--:--"; NOACKTIME=" "; HOLD =" HOLD "; REJECTED ="REJECTED"; VAR m :pMENU; xw, cntm, cnt, i, xchar:CARDINAL; ii :INTEGER; pm, pmh:pTXMESSAGE; s,h :ARRAY[0..200] OF CHAR; po :CHAR; loct:TIME; oks,hks,ohs:CARDINAL; BEGIN cntm:=0; pm:=txmessages; WHILE pm<>NIL DO INC(cntm); pm:=pm^.next END; cnt:=cntm; i:=mainys() DIV YKNOB; IF i>=MAXKNOBS THEN i:=MAXKNOBS END; IF ii THEN cnt:=i END; xw:=lums.fontxsize*77; IF xw>VAL(CARDINAL,xsize) THEN xw:=xsize END; xchar:=xw DIV lums.fontxsize; m:=findmenuid(SENDMSGID); refrmenu(m, xw, lums.fontysize+7, cnt+MLINES, bCOLOR, FALSE); oks:=m^.oldknob; hks:=m^.hiknob; ohs:=m^.oldsub; m^.oldknob:=0; m^.scroll:=0; IF beaconediting & beaconed THEN (* beacon editor is open too *) confstr(fRBTYP, s); IF (s[0]="I") OR (s[0]="J") THEN (* send item message from beacon editor *) encbeacon(s, i); ii:=InStr(s, ":)"); IF ii>1 THEN Delstr(s, 0, ii+1); icfg(fMSGTEXT, s); IF Length(s)>=MSGSIZE THEN say(LF+"Beacon does not fit in Msg!"+LF, 4, "e") END; END; END; END; loct:=localtime(); addline(m, " Send with Ack | Send/Query | Close", CMDSENDMSG, MINH*68); INC(m^.scroll); addline(m, "", CMDSENDMSG, MINH*68+10); INC(m^.scroll); INCL(m^.clampkb, 2); m^.confidx[2]:=ORD(fMSGTEXT); keybknob(m, 2, FALSE, 0); addline(m, "", CMDSENDMSG, MINH*68+15); INC(m^.scroll); INCL(m^.clampkb, 3); m^.confidx[3]:=ORD(fMSGTO); keybknob(m, 3, FALSE, 0); confstr(fMSGPORT, s); po:=CAP(s[0]); s:=MOP7; AppBlueButton(s, " Auto "+SP4+"|", (po=" ") OR (po="A")); AppBlueButton(s, " Net |", (po="N") OR (po="I")); FOR i:=1 TO UDPSOCKS DO h:=" RfPort "; Append(h, CHR(i+ORD("0"))); IF i<>UDPSOCKS THEN Append(h, " |") END; AppBlueButton(s, h, po=CHR(i+ORD("0"))); END; addline(m, s, CMDSENDMSG, MINH*68+20); INC(m^.scroll); m^.scroll:=cntm-cnt+4; m^.oldknob:=4; WHILE cnt>0 DO pm:=txmessages; i:=cntm; WHILE (i>1) & (pm<>NIL) DO pm:=pm^.next; DEC(i) END; IF pm<>NIL THEN s:=MOP0+MOP9; IF pm^.rej OR (pm^.acknum=0) & (pm^.txcnt>0) OR (pm^.acktime>0) THEN Append(s, MOP8) END; IF pm^.txtime=MAX(TIME) THEN h:=HOLD ELSIF pm^.txtime>0 THEN TimeToStr((pm^.txtime+loct) MOD DAY, h) ELSE h:=NOTIME END; Append(s, h); Append(s, " |"); IF pm^.rej THEN h:=MOP2+REJECTED ELSIF pm^.acknum=0 THEN h:=NOACKTIME ELSIF pm^.acktime>0 THEN TimeToStr((pm^.acktime+loct) MOD DAY, h); ELSE pmh:=pm^.next; WHILE (pmh<>NIL) & NOT StrCmp(pmh^.to, pm^.to) DO pmh:=pmh^.next END; IF pmh<>NIL THEN h:=MOP2+NOTIME ELSE h:=NOTIME END; END; Append(s, h);Append(s, " |"); IntToStr(pm^.txcnt,3,h); Append(s, h); Append(s, " |"+SP2); Append(s, pm^.port); Append(s, SP4+" |"); Assign(h, pm^.to); Append(h, " "); h[SIZE(MONCALL)]:=0C; Append(s, h); Append(s, " |"); IF pm^.acknum>0 THEN acknumstr(h, pm^.acknum); Append(s, h); getactack(pm^.to, h); IF h[0]<>0C THEN Append(s, REPLYACK); Append(s, h) ELSE Append(s, " ") END; ELSE Append(s, "-----") END; Append(s, " |"); Append(s, pm^.msgtext); IF Length(s)>xchar THEN s[xchar]:=0C; Append(s, "...") END; addline(m, s, CMDMANMSG+">", MINH*68+4); INC(m^.scroll); END; DEC(cntm); DEC(cnt); END; IF txmessages<>NIL THEN addline(m, MOP0+MOP1+MOP3+MOP4+" TxTime |AckTime |Ret |Po |Receiver |AckTxt |Message", " ", MINH*68+5); END; m^.hiknob:=hks; m^.wid:=SENDMSGID; m^.ysize:=m^.oldknob*m^.yknob; m^.oldknob:=oks; -- IF xw0 THEN IF m^.hiknob IN m^.clampkb THEN keybknob(m, m^.hiknob, TRUE, 0) END; inv(m, m^.oldsub, m^.hiknob); END; -- END; END sendmsg; (* === beacons === *) PROCEDURE DelBeaconByName(dname:ARRAY OF CHAR); VAR name:MONCALL; cnt:CARDINAL; symb:ARRAY[0..2] OF CHAR; isobj, isdel, isbad:BOOLEAN; s:ARRAY[0..200] OF CHAR; BEGIN cnt:=0; LOOP confstrings(fRBTEXT, cnt, TRUE, s); IF s[0]=0C THEN EXIT END; getbeaconname(s, name, symb, isobj, isdel, isbad); INC(cnt); IF StrCmp(name, dname) THEN configdelman(fRBTEXT, 3, cnt); cnt:=0; END; END; END DelBeaconByName; PROCEDURE isbkn(typ:CHAR):BOOLEAN; BEGIN typ:=CAP(typ); RETURN (typ<>"O") & (typ<>"H") & (typ<>"P") & (typ<>"I") & (typ<>"J"); END isbkn; PROCEDURE beaconeditor; CONST MLINES=15; (* static menu lines *) VAR m:pMENU; xw, cnt, cntm, i, xp, yp:CARDINAL; s,h:ARRAY[0..200] OF CHAR; bkn:BOOLEAN; typ, postyp, port:CHAR; name, ename:MONCALL; symb:ARRAY[0..2] OF CHAR; isobj, isdel, isbad, replace:BOOLEAN; mypos:POSITION; oks,hks,ohs:CARDINAL; BEGIN confstr(fRBNAME, ename); replace:=FALSE; cntm:=0; LOOP confstrings(fRBTEXT, cntm, TRUE, s); (* beacon raw text *) IF s[0]=0C THEN EXIT END; getbeaconname(s, name, symb, isobj, isdel, isbad); IF isobj & StrCmp(name, ename) THEN replace:=TRUE END; (* do we have edited obj name *) INC(cntm); END; cnt:=cntm; i:=mainys() DIV (lums.fontysize+5); IF i>=MAXKNOBS THEN i:=MAXKNOBS END; IF ii THEN cnt:=i END; xw:=lums.fontxsize*50; IF xw>VAL(CARDINAL,xsize) THEN xw:=xsize END; m:=findmenuid(BEACONEDITID); --IF m=NIL THEN beaconed:=TRUE END; refrmenu(m, xw, lums.fontysize+5, cnt+MLINES+1, bCOLOR, FALSE); (* +1 for pullknob *) oks:=m^.oldknob; hks:=m^.hiknob; ohs:=m^.oldsub; IF m^.image=NIL THEN WrStrLn("menu img nil") END; m^.oldknob:=0; m^.scroll:=1; IF beaconed THEN IF replace THEN h:=" Ok " ELSE h:=" Add " END; Append(h, "| Draw | Send now| Cancel | Close"); addline(m, h, CMDADDBEACON, MINH*81); ELSE addline(m, " New | Close", CMDADDBEACON, MINH*81+10) END; IF beaconed THEN confstr(fRBTYP, typ); typ:=CAP(typ); bkn:=isbkn(typ); confstr(fRBPOSTYP, postyp); AddEditLine(m, CMDADDBEACON, "", fRBNAME, MINH*81+15); IF bkn & getmypos(mypos) THEN s:=MOP0+MOP8+MOP3+" "; Append(s, configs[fRBPOS].title); Append(s, " (Config/Online) "); confappend(fMYPOS, s); ELSE s:="" END; AddEditLine(m, CMDADDBEACON, s, fRBPOS, MINH*81+20); AddEditLine(m, CMDADDBEACON, "", fRBCOMMENT, MINH*81+22); AddEditLine(m, CMDADDBEACON, "", fRBTIME, MINH*81+24); AddEditLine(m, CMDADDBEACON, "", fRBPATH, MINH*81+26); AddEditLine(m, CMDADDBEACON, "", fRBALT, MINH*81+28); AddEditLine(m, CMDADDBEACON, "", fRBSPEED, MINH*81+30); AddEditLine(m, CMDADDBEACON, "", fRBDIR, MINH*81+32); -- AddEditLine(m, CMDADDBEACON, "", fRBSYMB, MINH*81+34); IF bkn & ((postyp=ENCODEMICE) OR (postyp=ENCODEMICEDAO)) THEN s:=MOP0+MOP8+MOP3+" "; Append(s, configs[fRBDEST].title); Append(s, " "); confappend(fRBDEST, s); ELSE s:="" END; AddEditLine(m, CMDADDBEACON, s, fRBDEST, MINH*81+36); confstr(fRBSYMB, s); drawsymsquare(m^.image, s[0], s[1], m^.xsize-lums.symsize-lums.fontxsize-8, (m^.oldknob-1)*m^.yknob+m^.yknob DIV 2); IF (s[0]=AREASYMT) & (s[1]=AREASYM) THEN textautosize(0, 0, 6, 2, "r", LF+"Area Symbol!"+LF) END; AddEditLine(m, CMDADDBEACON+">", "", fRBSYMB, MINH*81+38); s:=MOP7; AppBlueButton(s, " Lat/Long |", (postyp=ENCODEGPS) OR (postyp=ENCODEAREA)); IF bkn THEN AppBlueButton(s, " Mic-e |", postyp=ENCODEMICE); ELSE AppBlueButton(s, " Multiline|", postyp=ENCODEMULTILINE) END; -- ELSE AppBlueButton(s, " |", FALSE) END; AppBlueButton(s, "Compressed|", postyp=ENCODECOMP); AppBlueButton(s, " Lat/Long+|", postyp=ENCODEGPSDAO); IF bkn THEN AppBlueButton(s, " Mic-e+ |", postyp=ENCODEMICEDAO); ELSE AppBlueButton(s, " |", FALSE) END; addline(m, s, CMDADDBEACON, MINH*81+50); INC(m^.scroll); s:=MOP7; AppBlueButton(s, " Beacon |", bkn); AppBlueButton(s, "Object/d|", typ="O"); AppBlueButton(s, "Object/h|", typ="H"); AppBlueButton(s, " Item |", typ="I"); AppBlueButton(s, " -Item |", typ="J"); AppBlueButton(s, " -Object" , typ="P"); addline(m, s, CMDADDBEACON, MINH*81+40); INC(m^.scroll); confstr(fRBPORT, s); port:=CAP(s[0]); s:=MOP7; AppBlueButton(s, " Tx Net|", port="N"); AppBlueButton(s, " To Map|", port="M"); FOR i:=1 TO UDPSOCKS DO h:=" TxPort "; Append(h, CHR(i+ORD("0"))); IF i<>UDPSOCKS THEN Append(h, "|") END; AppBlueButton(s, h, port=CHR(i+ORD("0"))); END; addline(m, s, CMDADDBEACON, MINH*81+60); INC(m^.scroll); END; confstr(fRBNAME, ename); cntm:=0; WHILE cnt>0 DO confstrings(fRBTEXT, cntm, TRUE, h); getbeaconname(h, name, symb, isobj, isdel, isbad); (* IF isbad THEN IF symb[0]<" " THEN s:=MOP4+MOP5+" ?? " ELSE s:=MOP4+MOP5+" " END; ELSIF beaconed & StrCmp(name, ename) THEN s:=MOP8+" "; -- ELSIF isbad THEN -- IF symb[0]<" " THEN s:=MOP4+MOP5+" ?? " ELSE s:=MOP4+MOP5+" " END; ELSIF isdel THEN s:=MOP4+MOP1+" "; ELSE s:=" "; END; *) IF isbad THEN IF symb[0]<" " THEN s:=MOP0+MOP4+MOP5+" ?? " ELSE s:=MOP0+MOP4+MOP5+" " END; ELSIF beaconed & StrCmp(name, ename) THEN s:=MOP0+MOP8+" "; ELSIF isdel THEN s:=MOP0+MOP4+MOP1+" "; ELSE s:=MOP0+" "; END; FOR i:=0 TO lums.symsize DIV lums.fontxsize DO Append(s, " ") END; Append(s, h); IF Length(s)>=49 THEN s[46]:=0C; Append(s, "...") END; addline(m, s, CMDADDBEACON+">", MINH*81+70); IF symb[0]>=" " THEN drawsymsquare(m^.image, symb[0], symb[1], lums.symsize DIV 2+lums.fontxsize+10, (m^.oldknob-1)*m^.yknob+m^.yknob DIV 2); END; onoff(m, 8, configson(fRBTEXT, cntm)); INC(cntm); DEC(cnt); END; -- drawpullknob(m^.image, xw, m^.oldknob*m^.yknob+1, m^.oldknob*m^.yknob+YPULLBUTTON); -- col.r:=400; col.g:=400; col.b:=400; -- drawsquare(m^.image, col, 0, m^.oldknob*m^.yknob+1, xw-2, m^.oldknob*m^.yknob+YPULLBUTTON); m^.hiknob:=hks; m^.ysize:=m^.oldknob*m^.yknob; i:=m^.oldknob; m^.oldknob:=oks; m^.wid:=BEACONEDITID; m^.pullconf:=fMENUXYBEACON; m^.pullyknob:=PULLMENUY; IF xw0) & (m^.hiknob<=i) THEN IF m^.hiknob IN m^.clampkb THEN keybknob(m, m^.hiknob, TRUE, 0) END; inv(m, m^.oldsub, m^.hiknob); END; END beaconeditor; PROCEDURE managebeacon(scroll, knob, subknob:CARDINAL; folded:BOOLEAN); VAR ch:CHAR; menu:pMENU; len:CARDINAL; typ:CHAR; VAR s,h:ARRAY[0..999] OF CHAR; BEGIN IF knob=1 THEN IF subknob=0 THEN IF beaconed THEN (* Add beacon *) confstr(fRBTYP, typ); IF (typ="O") OR (typ="H") OR (typ="P") OR (typ="I") OR (typ="J") THEN (* obj item *) confstr(fRBNAME, s); DelBeaconByName(s); END; encbeacon(s, len); AddConfLine(fRBTEXT, 0, s); ELSE (* New baecon *) confstr(fMYCALL, s); AddConfLine(fRBNAME, 1, s); AddConfLine(fRBCOMMENT, 1, ""); AddConfLine(fRBTIME, 1, "3600"); AddConfLine(fRBPATH, 1, "-1"); AddConfLine(fRBALT, 1, ""); AddConfLine(fRBSPEED, 1, ""); AddConfLine(fRBDIR, 1, ""); AddConfLine(fRBSYMB, 1, "/-"); AddConfLine(fRBDEST, 1, DESTCALL); AddConfLine(fRBTYP, 1, "b"); AddConfLine(fRBPOSTYP, 1, ENCODEGPS); AddConfLine(fRBPORT, 1, "1"); END; killmenuid(BEACONEDITID); beaconed:=TRUE; ELSIF subknob=1 THEN (* draw local *) IF beaconed THEN encbeacon(s, len); IF s[0]<>0C THEN drawbeacon(s) END; ELSE beaconediting:=FALSE; killmenuid(BEACONEDITID) END; (* Close *) ELSIF subknob=2 THEN IF beaconed THEN encbeacon(testbeaconbuf, len) END; (* Send beacon *) -- ELSE configedit:=0; killmenuid(BEACONEDITID) END; (* Close *) ELSIF subknob=3 THEN (* Cancel beacon *) killmenuid(BEACONEDITID); IF NOT beaconed THEN configedit:=0 END; beaconed:=FALSE; ELSE beaconediting:=FALSE; killmenuid(BEACONEDITID) END; (* Close beacon *) ELSIF NOT beaconed OR (knob>14) THEN IF folded THEN newmenu(menu, lums.fontxsize*9+4, lums.fontysize+5, 8, bTRANSP); menu^.scroll:=knob-scroll; addline(menu, "Edit Cut", CMDDOBEACON, MINH*81+80); addline(menu, "Send now", CMDDOBEACON, MINH*81+82); addline(menu, "Draw", CMDDOBEACON, MINH*81+84); addline(menu, "Raw Edit", CMDDOBEACON, MINH*81+86); addline(menu, "Delete", CMDDOBEACON, MINH*81+88); addline(menu, "Edit Copy",CMDDOBEACON, MINH*81+90); addline(menu, "On/Off", CMDDOBEACON, MINH*81+92); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; confstrings(fRBTEXT, menu^.scroll-1, TRUE, s); h[0]:=0C; Apphex(h, s); say(h, 4, "b"); END; ELSE IF knob=11 THEN IF folded THEN symchoose(CONFBSYM) END; ELSIF knob=12 THEN confstr(fRBTYP, typ); IF subknob=1 THEN IF isbkn(typ) THEN ch:=ENCODEMICE ELSE ch:=ENCODEMULTILINE; click.cmd:=" " END; ELSIF subknob=2 THEN ch:=ENCODECOMP; ELSIF subknob=3 THEN ch:=ENCODEGPSDAO; ELSIF subknob=4 THEN ch:=ENCODEMICEDAO; ELSE ch:=ENCODEGPS END; IF (typ="O") OR (typ="H") OR (typ="P") OR (typ="I") OR (typ="J") THEN (* obj item *) IF (ch=ENCODEMICE) OR (ch=ENCODEMICEDAO) THEN (* mice only in beacon *) ch:=ENCODECOMP; say("encoding changed to 'Compressed'",4, "r"); END; END; AddConfLine(fRBPOSTYP, 1, ch); ELSIF knob=13 THEN IF subknob=1 THEN ch:="O"; ELSIF subknob=2 THEN ch:="H"; ELSIF subknob=3 THEN ch:="I"; ELSIF subknob=4 THEN ch:="J"; ELSIF subknob=5 THEN ch:="P"; ELSE ch:="B" END; AddConfLine(fRBTYP, 1, ch); IF ch<>"B" THEN confstr(fRBPOSTYP, ch); ch:=CAP(ch); IF (ch=ENCODEMICE) OR (ch=ENCODEMICEDAO) THEN (* no mice for items/objects *) ch:=ENCODECOMP; (* set to compressed *) AddConfLine(fRBPOSTYP, 1, ch); say("encoding changed to 'Compressed'", 4, "r"); END; END; ELSIF knob=14 THEN IF subknob=0 THEN ch:="N"; ELSIF subknob=1 THEN ch:="M"; ELSE ch:=CHR(subknob-1+ORD("0")) END; AddConfLine(fRBPORT, 1, ch); END; END; refresh:=TRUE; END managebeacon; PROCEDURE dobeacon(scroll, knob:CARDINAL); (* do beacon ed fold menu *) VAR s:ARRAY[0..300] OF CHAR; BEGIN IF (knob=1) OR (knob=2) OR (knob=3) OR (knob=6) THEN confstrings(fRBTEXT, scroll-1, TRUE, s); IF (knob=1) OR (knob=6) THEN extractbeacon(s, TRUE, TRUE) END; END; IF knob=1 THEN beaconed:=TRUE; configdelman(fRBTEXT, 2, scroll); ELSIF knob=2 THEN Assign(testbeaconbuf,s); (* beacon send now *) ELSIF knob=3 THEN drawbeacon(s); (* draw store local *) ELSIF knob=5 THEN configdelman(fRBTEXT, 3, scroll); (* beacon cut edit *) ELSIF knob=6 THEN beaconed:=TRUE; (* beacon copy edit *) ELSIF knob=7 THEN configdelman(fRBTEXT, 1, scroll); (* beacon on/off *) END; refresh:=TRUE; END dobeacon; PROCEDURE beaconlen; VAR s,h:ARRAY[0..200] OF CHAR; len:CARDINAL; BEGIN encbeacon(s, len); s:="Beacon len="; IntToStr(len, 1, h); Append(s, h); say(s, 4, "b"); END beaconlen; (* === beacons === *) (* === digi === *) PROCEDURE extractdigi(s:ARRAY OF CHAR; VAR vv, vn, vx:ARRAY OF CHAR; VAR from, to:CHAR; VAR dir, cut:BOOLEAN; VAR t, km:CARDINAL); VAR h:ARRAY[0..200] OF CHAR; BEGIN Extractword(s, h); from:=h[0]; IF ((from<"1") OR (from>"4")) & (from<>"*") & (from<>"N") THEN from:="*" END; to:=h[1]; IF (to<"1") OR (to>"4") THEN to:="1" END; dir:=h[2]<="1"; cut:=NOT ODD(ORD(h[2])); Extractword(s, h); IF NOT StrToCard(h, t) OR (t>86400) THEN t:=890 END; Extractword(s, h); IF NOT StrToCard(h, km) OR (km>30000) THEN km:=30000 END; vv[0]:=0C; vn[0]:=0C; vx[0]:=0C; LOOP Extractword(s, h); IF h[0]=0C THEN EXIT END; IF h[0]="v" THEN Delstr(h, 0, 1); Append(vv, h); Append(vv, " ") ELSIF h[0]="n" THEN Delstr(h, 0, 1); Append(vn, h); Append(vn, " ") ELSIF h[0]="x" THEN Delstr(h, 0, 1); Append(vx, h); Append(vx, " ") END; END; END extractdigi; PROCEDURE digieditor; CONST DIGIMLINES=6; (* static menu lines digi config *) S1=" | | "; S2=S1+"| "; VAR m:pMENU; xw, cnt, cntm, i, xp, yp, duptime, radius, xchar:CARDINAL; s,h,vv, vn, vx:ARRAY[0..200] OF CHAR; from, to:CHAR; direct, cutpath:BOOLEAN; oks,hks,ohs:CARDINAL; BEGIN -- confstr(fDIGI, ename); -- replace:=FALSE; cntm:=cntconfigs(fDIGI, TRUE); cnt:=cntm; -- i:=mainys() DIV (lums.fontysize+5); -- IF ii THEN cnt:=i END; IF cnt>=MAXKNOBS-DIGIMLINES THEN cnt:=MAXKNOBS-DIGIMLINES END; (* limit for max menu lines *) xw:=lums.fontxsize*60; IF xw>VAL(CARDINAL,xsize) THEN xw:=xsize END; xchar:=xw DIV lums.fontxsize; m:=findmenuid(DIGIEDITID); IF m=NIL THEN digiedline[0]:=0C END; (* init replace line *) refrmenu(m, xw, lums.fontysize+5, cnt+DIGIMLINES+1, bCOLOR, FALSE); (* +1 for pullknob *) oks:=m^.oldknob; hks:=m^.hiknob; ohs:=m^.oldsub; m^.oldknob:=0; m^.scroll:=1; addline(m, " Add | Save | Close", CMDDIGILINE, MINH*83+5); AddEditLine(m, CMDDIGILINE, "", fDIGIX, MINH*83+10); AddEditLine(m, CMDDIGILINE, "", fDIGINN, MINH*83+15); AddEditLine(m, CMDDIGILINE, "", fDIGIVIA, MINH*83+20); AddEditLine(m, CMDDIGILINE, "", fDIGIRADIUS, MINH*83+25); AddEditLine(m, CMDDIGILINE, "", fDIGITIME, MINH*83+30); cntm:=0; WHILE cnt>0 DO confstrings(fDIGI, cntm, TRUE, h); extractdigi(h, vv, vn, vx, from, to, direct, cutpath, duptime, radius); IF digiedline=h THEN s:=MOP8 ELSE s[0]:=0C END; vv:=MOP0+S2+" | |"; vv[6]:=from; vv[10]:=to; Append(s, vv); CardToStr(duptime, 5, vv); Append(s, vv); Append(s, " "); CardToStr(radius, 5, vv); Append(s, vv); Append(s, " "); Extractword(h, vv); Extractword(h, vv); Extractword(h, vv); Append(s, h); IF Length(s)>xchar THEN s[xchar]:=0C; Append(s, "...") END; addline(m, s, CMDDIGILINE+">", MINH*83+35); onoff(m, lums.fontxsize+3, configson(fDIGI, cntm)); onoff(m, microspace(S1), direct); onoff(m, microspace(S2), cutpath); INC(cntm); DEC(cnt); END; IF cntm>0 THEN addline(m, MOP0+MOP1+MOP3+MOP4+"On |Rx |Tx |First |Last |Dupes |Radius", " ", MINH*83+50); END; m^.hiknob:=hks; m^.ysize:=m^.oldknob*m^.yknob; i:=m^.oldknob; m^.oldknob:=oks; m^.wid:=DIGIEDITID; m^.pullconf:=fMENUXYDIGI; m^.pullyknob:=PULLMENUY; IF xw0) & (m^.hiknob<=i) THEN IF m^.hiknob IN m^.clampkb THEN keybknob(m, m^.hiknob, TRUE, 0) END; inv(m, m^.oldsub, m^.hiknob); END; END digieditor; PROCEDURE dodigi(scroll, knob, subknob:CARDINAL; caller:CARD8); (* do digi editing *) VAR radius,duptime,cd,i:CARDINAL; s,h, vv, vn, vx:ARRAY[0..CONFIGWIDTH-1] OF CHAR; from, to:CHAR; direct, cutpath:BOOLEAN; menu:pMENU; PROCEDURE appdigi(VAR s:ARRAY OF CHAR; c:CONFSET; typ:CHAR); VAR h, ss:ARRAY[0..CONFIGWIDTH-1] OF CHAR; BEGIN confstr(c, ss); LOOP Extractword(ss, h); IF h[0]=0C THEN EXIT END; Append(s, typ); Append(s, h); Append(s, " "); END; END appdigi; PROCEDURE rollport(VAR p:CHAR; s-:ARRAY OF CHAR); (* return next char in string *) BEGIN p:=s[VAL(CARDINAL, InStr(s, p)+1) MOD Length(s)] END rollport; BEGIN --WrInt(caller, 2); WrInt(scroll, 10); WrInt(knob, 10); WrInt(subknob, 10); WrStrLn(" dodigi"); IF caller=2 THEN IF subknob=5 THEN (* fold submenu *) newmenu(menu, lums.fontxsize*9+4, lums.fontysize+5, 3, bTRANSP); menu^.scroll:=knob-scroll; addline(menu, "Edit", CMDDIGIED, MINH*83+60); addline(menu, "Delete", CMDDIGIED, MINH*83+65); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END; ELSIF caller=1 THEN (* clicked fold submenu *) IF knob=1 THEN (* Edit *) confstrings(fDIGI, scroll-1, TRUE, digiedline); extractdigi(digiedline, vv, vn, vx, from, to, direct, cutpath, duptime, radius); icfg(fDIGIX, vx); icfg(fDIGINN, vn); icfg(fDIGIVIA, vv); int2cfg(fDIGIRADIUS, radius); int2cfg(fDIGITIME, duptime); ELSIF knob=2 THEN (* Delete *) configdelman( fDIGI, 3, scroll); END; ELSIF knob=1 THEN (* click from digi menue *) s:="111 "; (* default ports and mode *) cd:=0; i:=0; LOOP confstrings(fDIGI, i, TRUE, h); IF h[0]=0C THEN EXIT END; INC(i); IF StrCmp(digiedline,h) THEN (* this is the original line *) s:=h; cd:=i; END; END; s[4]:=0C; confappend(fDIGITIME, s); Append(s, " "); (* build digi config string *) confappend(fDIGIRADIUS, s); Append(s, " "); appdigi(s, fDIGIVIA, "v"); appdigi(s, fDIGINN, "n"); appdigi(s, fDIGIX, "x"); IF subknob=2 THEN digied:=FALSE; killmenuid(DIGIEDITID); ELSIF (cd=0) OR (subknob=0) THEN icfg(fDIGI, s); (* Add *) ELSE (* Replace *) Assign(digiedline, s); confreplace(fDIGI, cd-1, TRUE, s); END; ELSIF knob>=scroll THEN confstrings(fDIGI, knob-scroll-1, TRUE, s); IF subknob=0 THEN configdelman(fDIGI, 1, knob-scroll); (* toggle on/off *) ELSIF subknob=1 THEN (* change rx port *) rollport(s[0], "1234*N"); confreplace(fDIGI, knob-scroll-1, TRUE, s); ELSIF subknob=2 THEN (* change tx port *) rollport(s[1], "1234"); confreplace(fDIGI, knob-scroll-1, TRUE, s); ELSIF subknob=3 THEN (* toggle First *) s[2]:=CAST(CHAR, CAST(SET8, s[2])/SET8{1}); confreplace(fDIGI, knob-scroll-1, TRUE, s); ELSIF subknob=4 THEN (* toggle Last*) s[2]:=CAST(CHAR, CAST(SET8, s[2])/SET8{0}); confreplace(fDIGI, knob-scroll-1, TRUE, s); END; END; refresh:=TRUE; END dodigi; (* === digi === *) (* === list window === *) PROCEDURE freelist(VAR b:LISTBUFFER; from:CARDINAL); (* truncate listline buffer *) VAR bl, bo:pLISTLINE; -- len:CARDINAL; BEGIN bl:=b.listlines; bo:=NIL; WHILE (bl<>NIL) & (from>0) DO bo:=bl; bl:=bl^.next; DEC(from) END; IF bo=NIL THEN b.listlinecnt:=0; b.listlines:=NIL; ELSE bo^.next:=NIL END; WHILE bl<>NIL DO bo:=bl; bl:=bl^.next; -- len:=SIZE(bo^)-HIGH(bo^.text)+1+Length(bo^.text); DEC(debugmem.mon, bo^.len); DEALLOCATE(bo, bo^.len); IF b.listlinecnt>0 THEN DEC(b.listlinecnt) END; END; END freelist; PROCEDURE drawbutt(img:pIMAGE; x, y, xs, ys:INTEGER); VAR buttcol:PIX; i:INTEGER; BEGIN IF (xs>=0) & (ys>=0) & (x>=0) & (y>=0) & (x+xs-1<=VAL(INTEGER,HIGH(img^))) & (y+ys-1<=VAL(INTEGER,HIGH(img^[0]))) THEN buttcol.r:=200; buttcol.g:=200; buttcol.b:=200; drawsquare(img, buttcol, x+2, y+2, x+xs-2, y+ys-2); FOR i:=x+1 TO x+xs-2 DO WITH img^[i][y+1] DO r:=20; g:=20; b:=2; END; WITH img^[i][y+ys-1] DO r:=500; g:=500; b:=500; END; END; FOR i:=y+2 TO y+ys-1 DO WITH img^[x+1][i] DO r:=500; g:=500; b:=500; END; WITH img^[x+xs-1][i] DO r:=20; g:=20; b:=20; END; END; END; END drawbutt; PROCEDURE drawarrow(img:pIMAGE; x, y, size:INTEGER; dir:CHAR); VAR i,j,s,t,ii,jj:INTEGER; BEGIN s:=size DIV 2-3; FOR i:=-s TO s-1 DO IF i<=-s THEN t:=s+1 ELSE t:=i+s DIV 2 END; FOR j:=-t TO t DO IF (dir="E") OR (dir="S") THEN ii:=-i ELSE ii:=i END; IF (dir="N") OR (dir="S") THEN jj:=ii; ii:=j ELSE jj:=j END; IF (x+ii<=VAL(INTEGER, HIGH(img^))) & (y+jj<=VAL(INTEGER, HIGH(img^[0]))) & (x+ii>=0) & (y+jj>=0) THEN WITH img^[x+ii][y+jj] DO r:=600; g:=600; b:=600; END; END; END; END; END drawarrow; PROCEDURE drawclosewin(img:pIMAGE; x, y, size:INTEGER); VAR i,s:INTEGER; BEGIN s:=size DIV 3; FOR i:=-s TO s DO WITH img^[x+i][y+i] DO r:=600; g:=600; b:=600; END; WITH img^[x+i][y-i] DO r:=600; g:=600; b:=600; END; END; END drawclosewin; PROCEDURE drawmaximize(img:pIMAGE; x, y, size:INTEGER); VAR i,s:INTEGER; BEGIN s:=size DIV 2-1; FOR i:=-s TO s DO WITH img^[x+i][y-s] DO r:=600; g:=600; b:=600; END; WITH img^[x+i][y+s] DO r:=600; g:=600; b:=600; END; WITH img^[x-s][y+i] DO r:=600; g:=600; b:=600; END; WITH img^[x+s][y+i] DO r:=600; g:=600; b:=600; END; END; END drawmaximize; PROCEDURE drawnormal(img:pIMAGE; x, y, size:INTEGER); VAR i,s:INTEGER; BEGIN s:=size DIV 4; FOR i:=-s TO s DO WITH img^[x+i][y-s] DO r:=600; g:=600; b:=600; END; WITH img^[x+i][y+s] DO r:=600; g:=600; b:=600; END; END; FOR i:=-s TO s DO WITH img^[x-s][y+i] DO r:=600; g:=600; b:=600; END; WITH img^[x+s][y+i] DO r:=600; g:=600; b:=600; END; END; END drawnormal; PROCEDURE drawminimize(img:pIMAGE; x, y, size:INTEGER); VAR i,s:INTEGER; BEGIN s:=size DIV 3; FOR i:=-s TO s DO WITH img^[x+i][y-s-1] DO r:=600; g:=600; b:=600; END; END; END drawminimize; PROCEDURE limscrbar(pot, drawsize, potsize:INTEGER):INTEGER; BEGIN IF pot DIV SCRMUL+drawsize>potsize THEN pot:=(potsize-drawsize)*SCRMUL END; IF pot<0 THEN pot:=0 END; RETURN pot END limscrbar; PROCEDURE scrollbarpos(VAR start, len:CARDINAL; min, max, pot, potsize:INTEGER); VAR textsize:INTEGER; BEGIN textsize:=max-min; IF pot<0 THEN pot:=0 END; pot:=pot DIV SCRMUL; IF potsize<=0 THEN start:=0; len:=0; ELSE IF pot>potsize THEN pot:=potsize END; start:=textsize*pot DIV potsize; len:=textsize*textsize DIV potsize; IF len=textsize THEN len:=textsize; start:=0; ELSIF VAL(INTEGER, start+len)>textsize THEN start:=textsize-VAL(INTEGER, len) END; END; INC(start, min); END scrollbarpos; (* PROCEDURE starttextpos(drawsize, pot, potsize:INTEGER):CARDINAL; BEGIN pot:=pot DIV SCRMUL; IF pot+drawsize>potsize THEN pot:=potsize-drawsize END; IF pot<0 THEN pot:=0 END; RETURN pot END starttextpos; *) PROCEDURE colorfind(VAR s:ARRAY OF CHAR); (* mark text in listwin if find string *) VAR p,i,j,l:INTEGER; f:ARRAY[0..9] OF CHAR; BEGIN confstr(fFIND, f); p:=InStr(s, f); IF p>=0 THEN j:=Length(s)+2; IF j>VAL(INTEGER,HIGH(s)) THEN j:=HIGH(s) END; i:=j-2; l:=Length(f); WHILE i>=0 DO s[j]:=s[i]; DEC(j); IF i=p+l THEN s[j]:=TEXTCOLEND; DEC(j) ELSIF i=p THEN s[j]:=TEXTCOLORA; DEC(j) END; DEC(i); END; END; END colorfind; PROCEDURE cpinv(im:pIMAGE; x, y, xshift, from, to:INTEGER); (* invert marked text *) VAR x0, x1:INTEGER; BEGIN IF from0) & (x0VAL(INTEGER, HIGH(im^)) THEN x1:=HIGH(im^) END; invline(im, x0, y, x1, y+VAL(INTEGER, lums.fontysize), TRUE); END; END; END cpinv; (* PROCEDURE InstrList(a-,b-:ARRAY OF CHAR):BOOLEAN; VAR i, j:CARDINAL; BEGIN i:=0; j:=0; WHILE (i<=HIGH(b)) & (b[i]<>0C) & (j<=HIGH(a)) & (a[j]<>0C) DO IF (i>0) OR (b[0]=a[j]) THEN IF (b[i]="*") THEN IF (i>=HIGH(b)) OR (b[i+1]=0C) THEN RETURN TRUE END; (* * at end fits to rest *) IF b[i+1]=a[j] THEN INC(i,2) END; ELSIF (b[i]="?") OR (b[i]=a[j]) THEN INC(i) ELSE RETURN FALSE END; INC(j); END; RETURN (i>HIGH(b)) OR (b[i]=0C) END InstrList; *) PROCEDURE filtlist(b:LISTBUFFER; VAR blf:pLISTLINE; VAR cntsum, cntf:CARDINAL); VAR blh, bl:pLISTLINE; s:ARRAY[0..1000] OF CHAR; isicon:CHAR; BEGIN blf:=NIL; bl:=b.listlines; cntsum:=0; cntf:=0; s:="*"; Append(s, listfilt.str); Append(s,"*"); WHILE bl<>NIL DO (* filter content *) IF cmpwild(bl^.text, s) THEN IF blf=NIL THEN blf:=bl ELSE blh^.fnext:=bl END; blh:=bl; INC(cntf); END; INC(cntsum); bl:=bl^.next; END; IF blf<>NIL THEN blh^.fnext:=NIL END; END filtlist; PROCEDURE makelistwin(VAR b:LISTBUFFER); VAR m:pMENU; bl, blh, blf:pLISTLINE; xw, cnt, cntf, cntsum, lc, i, yi, xh, xch, xp, yp, x0, linehi, xs, ys:CARDINAL; col:PIX; mr,mg,mb:INT16; s,s1:ARRAY[0..1000] OF CHAR; isicon:CHAR; oks,hks,ohs:CARDINAL; BEGIN (* blf:=NIL; bl:=b.listlines; cntsum:=0; cntf:=0; s:="*"; Append(s, listfilt.str); Append(s,"*"); WHILE bl<>NIL DO (* filter content *) IF cmpwild(bl^.text, s) THEN IF blf=NIL THEN blf:=bl ELSE blh^.fnext:=bl END; blh:=bl; INC(cntf); END; INC(cntsum); bl:=bl^.next; END; IF blf<>NIL THEN blh^.fnext:=NIL END; *) filtlist(b, blf, cntsum, cntf); cnt:=cntf; IF cnt=1 THEN cnt:=2 END; (* no 3 line high window *) linehi:=lums.fontysize; confstr(b.isicon, isicon); IF isicon=iMAXIMIZED THEN xw:=mainxs(); ys:=mainys()-linehi; ELSIF isicon=iICON THEN xw:=linehi*3+4+Length(b.listwintitle)*lums.fontxsize; ys:=linehi; ELSE xw:=conf2int(b.size, 0, linehi*6+4, mainxs(), 200); ys:=conf2int(b.size, 1, linehi*5+4, mainys()-linehi, 200); --WrInt(xw, 10);WrInt(ys, 10); WrStrLn(" size"); END; IF xw>VAL(CARDINAL,xsize) THEN xw:=xsize END; IF ys>VAL(CARDINAL,ysize) THEN ys:=ysize END; i:=ys DIV linehi; IF cnt>i THEN cnt:=i END; m:=findmenuid(LISTWINID); refrmenu(m, xw, linehi, cnt+2, bTRANSP, FALSE); oks:=m^.oldknob; hks:=m^.hiknob; ohs:=m^.oldsub; m^.minnormmax:=b.isicon; m^.pullconf:=b.xy; (* store extra position for normal size list or mon *) m^.sizeconf:=b.size; (* store extra size for normal size list or mon *) IF ys>HIGH(m^.image^[0])+1 THEN ys:=HIGH(m^.image^[0])+1 END; xs:=HIGH(m^.image^)+1; m^.oldknob:=0; m^.scroll:=0; m^.fullclamp:=TRUE; m^.ysize:=ys; mr:=2;mg:=2;mb:=2; IF NOT lums.menutransp THEN (* user disabled transparency *) mr:=lums.menubackcol.r; mg:=lums.menubackcol.g; mb:=lums.menubackcol.b; END; (* IF m^.background=bTRANSP THEN mr:=30;mg:=30;mb:=30; ELSIF m^.background=bCOLOR THEN mr:=lums.menubackcol.r; mg:=lums.menubackcol.g; mb:=lums.menubackcol.b; ELSE mr:=1;mg:=1;mb:=1 END; *) FOR yp:=0 TO ys-1 DO (* fill win with background *) FOR xp:=1 TO xs-1 DO WITH m^.image^[xp][yp] DO r:=mr; g:=mg; b:=mb; END; END; END; IF ys>linehi*4 THEN IF m^.scry>0 THEN INC(m^.scry, b.newlines*linehi*SCRMUL) END; b.newlines:=0; m^.scrysize:=cntf*linehi; yp:=limscrbar(m^.scry, ys-linehi*4, m^.scrysize) DIV SCRMUL; m^.scroll:=yp; bl:=blf; (* shift text vertical *) WHILE (yp>=linehi) & (bl<>NIL) DO bl:=bl^.fnext; DEC(yp, linehi) END; blh:=bl; xch:=0; FOR i:=1 TO cnt DO (* find longest visable line length *) IF blh<>NIL THEN xp:=0; WHILE blh^.text[xp]<>0C DO INC(xp) END; IF xp>xch THEN xch:=xp END; blh:=blh^.fnext; END; END; m^.scrxsize:=xch*lums.fontxsize; x0:=limscrbar(m^.scrx, xs-linehi*3, m^.scrxsize) DIV SCRMUL; xp:=(x0+(lums.fontxsize-1)) DIV lums.fontxsize; x0:=(lums.fontxsize-x0 MOD lums.fontxsize) MOD lums.fontxsize; yp:=linehi-yp; FOR lc:=1 TO cnt DO (* text lines *) IF bl<>NIL THEN i:=0; s[0]:=0C; xh:=xp; LOOP IF i>=xh THEN IF (i-xhCHR(MAXCHAR) THEN INC(xh) END; (* do not count color switch *) IF bl^.text[i]=0C THEN EXIT END; INC(i); END; IF s[0]<>0C THEN IF (xp=0) & bl^.withport THEN col.r:=50; col.g:=50; col.b:=50; IF s[0]="1" THEN col.r:=200; col.g:=200; col.b:=0; ELSIF s[0]="2" THEN col.r:=0; col.g:=200; col.b:=400; ELSIF s[0]="3" THEN col.r:=150; col.g:=300; col.b:=50; ELSIF s[0]="4" THEN col.r:=200; col.g:=0; col.b:=500; END; drawsquare(m^.image, col, x0+2, yp, x0+(3+lums.fontxsize), yp+(linehi-1)); END; colorfind(s); wrcolor(m^.image, s, x0+2, 1000, FALSE, yp); cpinv(m^.image, x0+2, yp, xp, bl^.startcp, bl^.endcp); END; bl:=bl^.fnext; INC(yp, linehi); END; END; m^.hiknob:=hks; FOR yp:=0 TO ys-1 DO WITH m^.image^[0][yp] DO r:=300; g:=300; b:=300; END; (* left white line *) WITH m^.image^[xs-linehi-1][yp] DO r:=300; g:=300; b:=300; END; (* text end white line *) FOR xp:=xs-linehi TO xs-2 DO (* v bar background *) WITH m^.image^[xp][yp] DO r:=mr; g:=mg; b:=mb; END; END; WITH m^.image^[xs-1][yp] DO r:=20; g:=20; b:=0; END; (* black right line *) END; FOR xp:=1 TO xs-1 DO WITH m^.image^[xp][ys-1] DO r:=300; g:=300; b:=300; END; (* top white line *) FOR yp:=ys-1-linehi TO ys-2 DO IF (xp<2) OR (xp=xs-2) OR (xp+linehi>=xs) & (yp<3) THEN WITH m^.image^[xp][yp] DO r:=250; g:=250; b:=250; END; ELSE WITH m^.image^[xp][yp] DO r:=mr; g:=mg; b:=mb; END; END; END; WITH m^.image^[xp][linehi] DO r:=150; g:=150; b:=150; END; (* bottom text white line *) END; scrollbarpos(x0, xp, linehi*2, ys-linehi*2, m^.scry, m^.scrysize); drawbutt(m^.image, xs-linehi, x0, linehi, xp); scrollbarpos(x0, xp, linehi, xs-linehi*2, m^.scrx, m^.scrxsize); drawbutt(m^.image, x0, 0, xp, linehi); drawarrow(m^.image, linehi DIV 2, linehi DIV 2+1, linehi, "W"); drawarrow(m^.image, xs-linehi*2+linehi DIV 2, linehi DIV 2+1, linehi, "E"); drawarrow(m^.image, xs-linehi DIV 2-1, linehi+linehi DIV 2+1, linehi, "N"); drawarrow(m^.image, xs-linehi DIV 2-1, ys-linehi-linehi DIV 2-1, linehi, "S"); ELSE FOR yp:=1 TO ys-1 DO WITH m^.image^[0][yp] DO r:=300; g:=300; b:=300; END; (* left white line *) WITH m^.image^[xs-1][yp] DO r:=0; g:=0; b:=0; END; (* right dark line *) END; FOR xp:=1 TO xs-2 DO WITH m^.image^[xp][ys-1] DO r:=300; g:=300; b:=300; END; (* top white line *) WITH m^.image^[xp][0] DO r:=0; g:=0; b:=0; END; (* bottom white line *) END; END; drawclosewin(m^.image, xs-linehi DIV 2-1, ys-linehi DIV 2-1, linehi); IF isicon=iMAXIMIZED THEN drawnormal(m^.image, xs-linehi-linehi DIV 2-1, ys-linehi DIV 2-1, linehi); ELSE drawmaximize(m^.image, xs-linehi-linehi DIV 2-1, ys-linehi DIV 2-1, linehi) END; IF isicon=iICON THEN drawnormal(m^.image, xs-linehi*2-linehi DIV 2-1, ys-linehi DIV 2-1, linehi); ELSE drawminimize(m^.image, xs-linehi*2-linehi DIV 2-1, ys-linehi DIV 2, linehi) END; --drawclosewin(m^.image, linehi DIV 2-1, ys-linehi DIV 2-1, linehi); --drawmaximize(m^.image, linehi DIV 2-1, ys-linehi DIV 2-1, linehi); IF isicon=iICON THEN i:=0; wrcolor(m^.image, b.listwintitle, 2, 700, FALSE, i); m^.pullconf:=fMENUXYLISTMIN; ELSE yi:=ys-linehi-1; IF listwin="M" THEN s:="Clr" END; IF listwin="L" THEN IF listbuffer.sortby THEN s:="0-24" ELSE s:="A..Z" END; END; IF listfilt.str[0]<>0C THEN Append(s,TEXTCOLRED) END; Append(s, " FILTER:["); i:=listfilt.pos+Length(s); Append(s, listfilt.str); Append(s, "]"+TEXTCOLEND); wrcolor(m^.image, s, linehi, 700, FALSE, yi); s[i]:="_"; s[i+1]:=0C; (* overwrite line with underline as cursor *) WHILE i>=1 DO DEC(i); s[i]:=" " END; wrcolor(m^.image, s, linehi, 700, FALSE, yi); (* FOR i:=1 TO Length(listfilt.str) DO IF i-1=listfilt.pos THEN Append(s,TEXTCOLRED) END; Append(s, listfilt.str[i-1]); IF i-1=listfilt.pos THEN Append(s,TEXTCOLEND) END; END; Append(s, "]"); wrcolor(m^.image, s, linehi, 700, FALSE, yi); *) Assign(s, b.listwintitle); Append(s, " ("); IntToStr(cntf, 0, s1); Append(s, s1); Append(s, "/"); IntToStr(cntsum, 0, s1); Append(s, s1); Append(s, ")"); lc:=Length(s)*lums.fontxsize; IF xs>lc+linehi*6 THEN wrcolor(m^.image, s, (xs-lc) DIV 2, 700, FALSE, yi) END; END; i:=m^.oldknob; m^.oldknob:=oks; m^.wid:=LISTWINID; m^.pullyknob:=MAX(INTEGER); IF xw0) & (m^.hiknob<=i) THEN IF m^.hiknob IN m^.clampkb THEN keybknob(m, m^.hiknob, TRUE, 0) END; inv(m, m^.oldsub, m^.hiknob); END; END makelistwin; PROCEDURE closelist; BEGIN IF listwin="M" THEN configbool(fMENUMONICON, FALSE) END; (* store mon win off *) listwin:=0C; freelist(listbuffer, 0); killmenuid(LISTWINID); (* Close *) END closelist; PROCEDURE limscrbars(m:pMENU); BEGIN m^.scrx:=limscrbar(m^.scrx, m^.xsize-lums.fontysize*3, m^.scrxsize); m^.scry:=limscrbar(m^.scry, m^.ysize-lums.fontysize*4, m^.scrysize); END limscrbars; PROCEDURE sortlist(VAR root:pLISTLINE; bytime:BOOLEAN); VAR in,p,po,out:pLISTLINE; BEGIN out:=NIL; WHILE root<>NIL DO in:=root; root:=in^.next; in^.next:=NIL; IF out=NIL THEN out:=in ELSE po:=NIL; p:=out; LOOP IF (p=NIL) OR (bytime & (p^.timeNIL DO b^.endcp:=0; b^.startcp:=0; b^.markcp:=0; b:=b^.next END; END ccp; BEGIN ccp(listbuffer.listlines); ccp(monbuffer.listlines); refresh:=TRUE; (* called from event *) END clrcpmarks; PROCEDURE findtextpos(m:pMENU; xcl, ycl:CARDINAL; VAR bb, bl:pLISTLINE; VAR xch:CARDINAL); (* find line/col of x/y pixel *) VAR n:INTEGER; n1,n2:CARDINAL; BEGIN n:=m^.ysize-lums.fontysize-ycl+m^.scroll; IF n<0 THEN n:=0 END; n:=VAL(CARDINAL,n) DIV lums.fontysize; IF listwin="L" THEN bl:=listbuffer.listlines ELSIF listwin="M" THEN filtlist(monbuffer, bl, n1,n2); ELSE bl:=NIL END; bb:=bl; WHILE (n>0) & (bl<>NIL) DO DEC(n); bl:=bl^.fnext; END; n:=xcl+VAL(CARDINAL, limscrbar(m^.scrx, m^.xsize-lums.fontysize*3, m^.scrxsize)) DIV SCRMUL; IF n<0 THEN n:=0 END; xch:=VAL(CARDINAL, n) DIV lums.fontxsize; END findtextpos; PROCEDURE decodelist(VAR text:ARRAY OF CHAR; time:TIME); VAR s,t:ARRAY[0..999] OF CHAR; i,j,h:CARDINAL; col, c:CHAR; BEGIN i:=0; WHILE (i0C) DO t[i]:=text[i]; INC(i) END; (* textbuffer may not be value parameter because is allocated only till 0C not to HIGH() *) t[i]:=0C; i:=0; j:=0; LOOP (* reconstruct non-ascii *) c:=t[i]; IF c=0C THEN EXIT END; IF c=TEXTCOLBLU THEN INC(i); IF t[i]<>"<" THEN EXIT END; t[j]:=0C; FOR h:=0 TO 1 DO INC(i); c:=t[i]; IF (c>="0") & (c<="9") THEN c:=CHR(ORD(c)-ORD("0")) ELSIF (c>="A") & (c<="F") THEN c:=CHR(ORD(c)-(ORD("A")-10)) ELSE EXIT END; t[j]:=CHR(ORD(t[j])*16 + ORD(c)); END; INC(i); IF t[i]=0C THEN EXIT END; (* ">" *) INC(i); IF t[i]=0C THEN EXIT END; (* TEXTCOLEND *) ELSE t[j]:=t[i] END; INC(i); INC(j); END; t[j]:=0C; decodelistline(s, t, time); col:="m"; IF Length(s)>10 THEN textautosize(DOCKX, 0, TEXTINFOWINID, 0, col, s) END; END decodelist; PROCEDURE dolist(m:pMENU; xcl, ycl:CARDINAL); (* click on list win *) VAR isicon:CHAR; xdiv, x0, xl:CARDINAL; bl,bb:pLISTLINE; op:pOPHIST; BEGIN --WrInt(xcl, 10); WrInt(ycl, 10); WrStrLn(" cl"); limscrbars(m); confstr(m^.minnormmax, isicon); IF (isicon<>iICON) & (ycl+lums.fontysize>m^.ysize) THEN (* bottom line *) scrollbarpos(x0, xl, lums.fontysize, m^.xsize-lums.fontysize*2, m^.scrx, m^.scrxsize); IF xcl<=lums.fontysize THEN m^.scrx:=0; (* scroll max left *) ELSIF xcl<=x0 THEN INC(m^.scrx, -VAL(INTEGER,(m^.xsize-lums.fontysize*3)*SCRMUL)); (* scroll left winsize *) ELSIF xcl<=x0+xl THEN (* hit scrollbar *) ELSIF xcl+lums.fontysize*2<=m^.xsize THEN INC(m^.scrx, (m^.xsize-lums.fontysize*3)*SCRMUL); (* scroll right winsize *) ELSIF xcl+lums.fontysize<=m^.xsize THEN m^.scrx:=32000*SCRMUL; (* sroll max right *) END; ELSIF ycllums.fontysize) THEN IF listwin="M" THEN freelist(monbuffer, 0) END; (* clear buffer *) (* Clear *) IF listwin="L" THEN (* sort buffer *) sortlist(listbuffer.listlines, listbuffer.sortby); clrcpmarks; (* clear cp invers *) listbuffer.sortby:=NOT listbuffer.sortby; END; END; icfg(m^.minnormmax, isicon); END; ELSIF xcl+lums.fontysize>m^.xsize THEN (* right column *) scrollbarpos(x0, xl, lums.fontysize*2, m^.ysize-lums.fontysize*2, m^.scry, m^.scrysize); IF ycl+lums.fontysize*2>m^.ysize THEN m^.scry:=0; (* scroll max down *) ELSIF ycl<=lums.fontysize*2 THEN m^.scry:=32000*SCRMUL; (* sroll up max *) ELSIF m^.ysize-yclNIL THEN IF NOT posvalid(bl^.position) THEN (* no pos in line *) op:=oppo(bl^.call); IF op<>NIL THEN bl^.position:=op^.lastpos END; (* use last users pos *) END; IF posvalid(bl^.position) THEN setmark1(bl^.position, TRUE, MAX(INTEGER), bl^.time); click.markpos:=bl^.position; click.markpost:=bl^.time; click.markalti:=MAX(INTEGER); op:=oppo(bl^.call); IF op<>NIL THEN images(op, 0C, click.graphset); refresh:=TRUE; END; click.cmd:=CMDLISTWINLINE; END; decodelist(bl^.text, bl^.time); END; END; refresh:=TRUE; END dolist; PROCEDURE wrlist(VAR b:LISTBUFFER; s:ARRAY OF CHAR; opcall-:MONCALL; pos:POSITION; t:TIME; port:BOOLEAN); (* append a line to list window buffer *) VAR bl:pLISTLINE; end, blen, start, i:CARDINAL; BEGIN end:=0; WHILE (end0C) DO start:=end; i:=start; WHILE (end<=HIGH(s)) & (s[end]>=" ") DO s[i]:=s[end]; INC(i); INC(end) END; blen:=SIZE(bl^)-HIGH(bl^.text)+end-start+1; ALLOCATE(bl, blen); debugmem.req:=blen; INC(debugmem.mon, blen); IF bl=NIL THEN WrStrLn("menu out of memory"); wrheap; RETURN END; FILL(bl, 0C, blen); bl^.next:=b.listlines; bl^.len:=blen; bl^.call:=opcall; bl^.withport:=port; bl^.time:=t; b.listlines:=bl; i:=0; WHILE (i+startLISTMAXLEN+10 THEN freelist(b, LISTMAXLEN) END; IF s[end]<>0C THEN INC(end) END; END; END wrlist; PROCEDURE wrstrlist(s-:ARRAY OF CHAR; opcall-:MONCALL; pos:POSITION; t:TIME); BEGIN wrlist(listbuffer, s, opcall, pos, t, FALSE) END wrstrlist; PROCEDURE wrstrmon(s-:ARRAY OF CHAR; pos:POSITION); VAR isicon:CHAR; BEGIN wrlist(monbuffer, s, "", pos, 0, TRUE); IF listwin="M" THEN (* else save cpu *) confstr(fMENUMONICON, isicon); IF isicon<>iICON THEN refresh:=TRUE END; END; END wrstrmon; PROCEDURE startlist(tit, oneop:ARRAY OF CHAR); BEGIN Assign(listbuffer.listwintitle, tit); IF oneop[0]<>0C THEN textautosize(0, 0, 6, 4, "b", 'see all User, switch to "Show All"'); Append(listbuffer.listwintitle, " of "); Append(listbuffer.listwintitle, oneop); END; listbuffer.isicon:=fMENULISTICON; listbuffer.xy:=fMENUXYLIST; listbuffer.size:=fMENUSIZELIST; listbuffer.sortby:=FALSE; freelist(listbuffer, 0); killmenuid(LISTWINID); listwin:="L"; refresh:=TRUE; END startlist; PROCEDURE startmon(manual:BOOLEAN); BEGIN Assign(monbuffer.listwintitle, "Monitor"); monbuffer.isicon:=fMENUMONICON; monbuffer.xy:=fMENUXYMON; monbuffer.size:=fMENUSIZEMON; killmenuid(LISTWINID); listwin:="M"; IF manual THEN configbool(fMENUMONICON, TRUE) END; (* store mon win on *) refresh:=TRUE; END startmon; PROCEDURE setcp(m:pMENU; x, y:CARDINAL; start:BOOLEAN); (* copy & paste marking *) VAR bl, bb:pLISTLINE; xl, in:CARDINAL; BEGIN findtextpos(m, x, y, bb, bl, xl); IF bl<>NIL THEN IF start THEN (* klick *) clrcpmarks; bl^.markcp:=xl+1; ELSE (* pull *) in:=0; REPEAT (* IF bb=bl THEN IF in=0 THEN bb^.startcp:=xl; bb^.endcp:=Length(bb^.text); in:=1; ELSIF in=1 THEN bb^.startcp:=0; bb^.endcp:=xl; in:=2 END; END; IF bb^.markcp>0 THEN IF in=0 THEN bb^.startcp:=bb^.markcp-1; bb^.endcp:=Length(bb^.text); in:=1; ELSIF in=1 THEN bb^.startcp:=0; bb^.endcp:=bb^.markcp-1; in:=2 END; END; *) IF bb^.markcp>0 THEN IF bb=bl THEN (* one line *) IF bb^.markcp>xl THEN bb^.startcp:=xl; bb^.endcp:=bb^.markcp-1 ELSE bb^.startcp:=bb^.markcp-1; bb^.endcp:=xl END; in:=2; ELSIF in=0 THEN bb^.startcp:=0; bb^.endcp:=bb^.markcp-1; in:=1; ELSIF in=1 THEN bb^.startcp:=bb^.markcp-1; bb^.endcp:=Length(bb^.text); in:=2 END; ELSIF bb=bl THEN IF in=0 THEN (* marker above *) bb^.startcp:=0; bb^.endcp:=xl; in:=1; ELSE (* marker below *) bb^.startcp:=xl; bb^.endcp:=Length(bb^.text); in:=2 END; ELSIF in<>1 THEN bb^.endcp:=0; ELSE bb^.startcp:=0; bb^.endcp:=Length(bb^.text); END; bb:=bb^.next; UNTIL bb=NIL; END; END; END setcp; PROCEDURE WhatPull(m:pMENU; x, y:CARDINAL):CHAR; VAR sx0, sxl, sy0, syl:CARDINAL; BEGIN IF m^.wid=LISTWINID THEN scrollbarpos(sx0, sxl, lums.fontysize, m^.xsize-lums.fontysize*2, m^.scrx, m^.scrxsize); scrollbarpos(sy0, syl, lums.fontysize*2, m^.ysize-lums.fontysize*2, m^.scry, m^.scrysize); INC(sxl, sx0); INC(syl, sy0); -- limscrolls(m); --WrInt(x, 10); WrInt(y, 10); WrInt(sx0, 10); WrInt(sxl, 10); --WrInt(sy0, 10); WrInt(syl, 10); WrInt(m^.scrx, 10); WrInt(m^.scrxsize, 10); WrStrLn("wp"); limscrbars(m); -- m^.scrx:=limscrbar(m^.scrx, m^.xsize-lums.fontysize*3, m^.scrxsize); -- m^.scry:=limscrbar(m^.scry, m^.ysize-lums.fontysize*4, m^.scrysize); IF m^.ysize<=lums.fontysize THEN RETURN 0C END; (* icon *) IF (y+lums.fontysize>m^.ysize) & (sx0<=x) & (sxl>=x) THEN RETURN "H" END; IF (x+lums.fontysize>m^.xsize) & (sy0<=m^.ysize-y) & (syl>=m^.ysize-y) THEN RETURN "V" END; IF (y+lums.fontysize>m^.ysize) & (x+lums.fontysize>m^.xsize) THEN RETURN "B" END; IF x+lums.fontysize>m^.xsize THEN RETURN "E" END; IF y+lums.fontysize>m^.ysize THEN RETURN "S" END; IF (x=lums.fontysize THEN setcp(m, x, y, TRUE); cpendx:=x; cpendy:=y; RETURN "C" END; (* c/p *) sethand(cPULL4); -- RETURN 0C; ELSIF m^.wid=PANOWINID THEN IF (y+lums.fontysize>m^.ysize) & (x+lums.fontysize>m^.xsize) THEN RETURN "B" END; IF x+lums.fontysize>m^.xsize THEN RETURN "E" END; IF y+lums.fontysize>m^.ysize THEN RETURN "S" END; IF (x0 THEN INC(m^.scrx, dx*VAL(INTEGER, SCRMUL*m^.scrxsize DIV (m^.xsize-lums.fontysize*3))); refresh:=TRUE; END; RETURN TRUE END; IF pullmenuwhat="V" THEN IF dy<>0 THEN DEC(m^.scry, dy*VAL(INTEGER, SCRMUL*m^.scrysize DIV (m^.ysize-lums.fontysize*4))); refresh:=TRUE; END; RETURN TRUE END; IF pullmenuwhat="C" THEN (* copy & paste *) INC(cpendx, dx); INC(cpendy, dy); setcp(m, cpendx, cpendy, FALSE); IF cpendy+VAL(INTEGER, lums.fontysize)>VAL(INTEGER,m^.ysize) THEN (* scroll while cp *) DEC(m^.scry, lums.fontysize*SCRMUL); ELSIF cpendy<=VAL(INTEGER, lums.fontysize)THEN INC(m^.scry, lums.fontysize*SCRMUL) END; refresh:=TRUE; RETURN TRUE END; IF (pullmenuwhat="S") OR (pullmenuwhat="E") OR (pullmenuwhat="U") OR (pullmenuwhat="B") OR (pullmenuwhat="W") OR (pullmenuwhat="N") THEN confstr(m^.minnormmax, isicon); IF (isicon<>iICON) & (isicon<>iMAXIMIZED) THEN (* was normal size *) sx:=conf2int(m^.sizeconf, 0, 40, mainxs(), 200); sy:=conf2int(m^.sizeconf, 1, 50, mainys(), 200); ELSE sx:=m^.xsize; sy:=m^.ysize; END; ok:=FALSE; IF (pullmenuwhat="S") OR (pullmenuwhat="B") THEN IF dy<>0 THEN sy:=inclim(sy, dy, 0); ok:=TRUE; END; END; IF (pullmenuwhat="E") OR (pullmenuwhat="B") THEN IF dx<>0 THEN sx:=inclim(sx, dx, 0); ok:=TRUE; END; ELSIF pullmenuwhat="W" THEN IF dx<>0 THEN sx:=inclim(sx, -dx, 0); movewin(m, dx, 0); ok:=TRUE; END; ELSIF pullmenuwhat="N" THEN IF dy<>0 THEN sy:=inclim(sy, -dy, 0); movewin(m, 0, dy); ok:=TRUE; END; END; IF pullmenuwhat="U" THEN IF dy<>0 THEN sy:=inclim(sy, -dy, 0); movewin(m, 0, dy); ok:=TRUE; END; IF dx<>0 THEN sx:=inclim(sx, -dx, 0); movewin(m, dx, 0); ok:=TRUE; END; END; IF ok THEN IF ORD(m^.sizeconf)>0 THEN saveXYtocfg(m^.sizeconf, sx, sy) END; IF ORD(m^.minnormmax)>0 THEN icfg(m^.minnormmax, 0C) END; (* set normal size *) refresh:=TRUE; END; RETURN TRUE; END; RETURN FALSE END Scrollbars; PROCEDURE whichmenu(px, py:CARDINAL; VAR m:pMENU; VAR knob, subknob, xpos, ypos:CARDINAL); VAR pm:pMENU; BEGIN --WrInt(px, 5); WrInt(py, 5); WrStrLn(" m"); m:=NIL; pm:=menus; knob:=0; WHILE pm<>NIL DO WITH pm^ DO --WrInt(nowx, 5); WrInt(nowy, 5); WrStrLn(" now"); IF drawn & (px>nowx) & (pxnowy+1) & (py0) THEN knob:=(nowy+ysize-py) DIV yknob+1; --WrInt(knob, 5); WrInt(ysize, 5); WrStrLn(" knb"); m:=pm; xpos:=px-nowx; ypos:=py-nowy; END; END; pm:=pm^.next; END; IF knob>MAXKNOBS THEN knob:=MAXKNOBS END; subknob:=0; IF (m<>NIL) & ((knob>0) OR m^.fullclamp) THEN WHILE (subknob<=HIGH(m^.subk[0])) & (m^.subk[knob-1][subknob]>0) & (xpos>m^.subk[knob-1][subknob]) DO INC(subknob) END; focuswid:=m^.wid; ELSE focuswid:=0 END; --WrInt(subknob, 5); WrLn; END whichmenu; PROCEDURE listcursmove(m:pMENU; VAR ch:CHAR); VAR cc:CHAR; knob, subknob, xpos, ypos, i:CARDINAL; mouseontop:BOOLEAN; pm:pMENU; BEGIN --WrInt(ORD(ch), 5); WrLn; cc:=ch; whichmenu(xmouse.x, xmouse.y, pm, knob, subknob, xpos, ypos); --WrInt(knob,10);WrInt(subknob,10); WrInt(xpos,10); WrInt(ypos,10); WrStrLn("k,sk,x,y"); mouseontop:=yposLength(listfilt.str) THEN listfilt.pos:=Length(listfilt.str) END; IF listfilt.pos>HIGH(listfilt.str) THEN listfilt.pos:=HIGH(listfilt.str) END; IF (cc>=" ") & (cc<177C) & (ypos<=lums.fontysize+2) THEN IF listfilt.pos>=Length(listfilt.str) THEN Append(listfilt.str, cc) ELSE FOR i:=HIGH(listfilt.str) TO listfilt.pos+1 BY -1 DO listfilt.str[i]:=listfilt.str[i-1] END; listfilt.str[listfilt.pos]:=cc END; INC(listfilt.pos); ELSIF mouseontop & (cc=CURSLEFT) THEN IF listfilt.pos>0 THEN DEC(listfilt.pos) END; ELSIF mouseontop & (cc=CURSRIGHT) THEN INC(listfilt.pos); ELSIF mouseontop & (cc=CURSHOME) THEN listfilt.pos:=0; ELSIF mouseontop & (cc=CURSEND) THEN listfilt.pos:=Length(listfilt.str); ELSIF cc=CURSBS THEN IF listfilt.pos>0 THEN DEC(listfilt.pos); Delstr(listfilt.str, listfilt.pos, 1); END; ELSIF cc=CURSDEL THEN Delstr(listfilt.str, listfilt.pos, 1); ELSE ch:=cc END; cc:=ch; ch:=0C; -- IF listlinecnt>0 THEN limscrbars(m); -- m^.scrx:=limscrbar(m^.scrx, m^.xsize-lums.fontysize*3, m^.scrxsize); -- m^.scry:=limscrbar(m^.scry, m^.ysize-lums.fontysize*4, m^.scrysize); CASE cc OF CURSLEFT :INC(m^.scrx, -VAL(INTEGER,lums.fontxsize)*SCRMUL); |CURSRIGHT :INC(m^.scrx, VAL(INTEGER,lums.fontxsize)*SCRMUL); |CURSUP, CMDFZOOMIN :INC(m^.scry, lums.fontysize*SCRMUL); |CURSDOWN, CMDFZOOMOUT :INC(m^.scry, -VAL(INTEGER, lums.fontysize*SCRMUL)); |CURSPAGEUP :INC(m^.scry, (m^.ysize-lums.fontysize*4)*SCRMUL); |CURSPAGEDOWN:INC(m^.scry, -VAL(INTEGER, (m^.ysize-lums.fontysize*4)*SCRMUL)); |CURSHOME :m^.scrx:=0; |CURSEND :m^.scrx:=32000*SCRMUL; ELSE ch:=cc END; (* give key back if not known here *) refresh:=TRUE; -- END; END listcursmove; PROCEDURE listwincursors(m:pMENU; x, y:CARDINAL); VAR sx0, sxl, sy0, syl:CARDINAL; BEGIN scrollbarpos(sx0, sxl, lums.fontysize, m^.xsize-lums.fontysize*2, m^.scrx, m^.scrxsize); scrollbarpos(sy0, syl, lums.fontysize*2, m^.ysize-lums.fontysize*2, m^.scry, m^.scrysize); INC(sxl, sx0); INC(syl, sy0); --WrInt(sy0, 10); WrInt(syl, 10); WrInt(m^.ysize-y, 10); WrLn; IF x<=lums.fontysize THEN IF ym^.xsize) & ((sy0>m^.ysize-y) OR (sylm^.ysize THEN sethand(cPULLRIGHTDOWN) ELSIF x+PULLFRAME>m^.xsize THEN sethand(cPULLRIGHT) END; ELSIF y<=PULLFRAME THEN sethand(cPULLUP) ELSIF (y+PULLFRAME>m^.ysize) & ((sx0>x) OR (sxlVAL(CARDINAL,xsize) THEN xw:=xsize END; IF ys>VAL(CARDINAL,ysize) THEN ys:=ysize END; --WrInt(xw, 10);WrInt(ys, 10); WrStrLn("x y"); m:=findmenuid(PANOWINID); refrmenu(m, xw, ys, 1, bCOLOR, TRUE); --WrInt(ORD(new), 2); WrStrLn("imgnew"); oks:=m^.oldknob; ohs:=m^.oldsub; -- m^.minnormmax:=; ys:=HIGH(m^.image^[0])+1; xs:=HIGH(m^.image^)+1; panowin.ximg:=xs; panowin.yimg:=ys; panowin.image:=m^.image; m^.sizeconf:=fPANOSIZE; m^.pullconf:=fPANOPOS; m^.oldknob:=0; m^.fullclamp:=TRUE; m^.ysize:=ys; m^.oldknob:=oks; m^.wid:=PANOWINID; IF panowin.empty THEN Panorama(redrawimg, panowin, abo); panowin.empty:=FALSE; END; m^.pullyknob:=MAX(INTEGER); IF xwALTINVAL THEN panowin.eye:=click.markpos; panowin.horizon:=click.measurepos; panowin.angle:=conf2real(fANT2, 1, -360.0, 360.0, 45.0); panowin.flatscreen:=panowin.angle<0.0; panowin.angle:=ABS(panowin.angle); IF panowin.angle<0.01 THEN panowin.angle:=0.01 END; panowin.elevation:=conf2real(fANT2, 2, -180.0, 180.0, 0.0); panowin.yzoom:=conf2real(fANT2, 3, 0.01, 100.0, 1.0); panowin.isicon:=FALSE; panowin.on:=TRUE; panowin.empty:=TRUE; refresh:=TRUE; ELSE xerrmsg("Panorama: need altitude at Marker 1") END; ELSE xerrmsg("Panorama: need Marker 1 and 2") END; END; END startpano; PROCEDURE closepano; BEGIN panowin.on:=FALSE; killmenuid(PANOWINID); (* Close *) disposeimg(panoimage); END closepano; PROCEDURE dopano(m:pMENU; xcl, ycl:CARDINAL); (* click on panorama win *) VAR isicon:CHAR; xdiv, x0, xl:CARDINAL; BEGIN --WrInt(xcl, 10); WrInt(ycl, 10); WrStrLn(" dopano"); limscrbars(m); -- confstr(m^.minnormmax, isicon); isicon:=0C; IF (isicon<>iICON) & (ycl+lums.fontysize>m^.ysize) THEN (* bottom line *) scrollbarpos(x0, xl, lums.fontysize, m^.xsize-lums.fontysize*2, m^.scrx, m^.scrxsize); IF xcl<=lums.fontysize THEN m^.scrx:=0; (* scroll max left *) ELSIF xcl<=x0 THEN INC(m^.scrx, -VAL(INTEGER,(m^.xsize-lums.fontysize*3)*SCRMUL)); (* scroll left winsize *) ELSIF xcl<=x0+xl THEN (* hit scrollbar *) ELSIF xcl+lums.fontysize*2<=m^.xsize THEN INC(m^.scrx, (m^.xsize-lums.fontysize*3)*SCRMUL); (* scroll right winsize *) ELSIF xcl+lums.fontysize<=m^.xsize THEN m^.scrx:=32000*SCRMUL; (* sroll max right *) END; ELSIF ycllums.fontysize) THEN END; IF ORD(m^.minnormmax)>0 THEN icfg(m^.minnormmax, isicon) END; END; ELSIF xcl+lums.fontysize>m^.xsize THEN (* right column *) scrollbarpos(x0, xl, lums.fontysize*2, m^.ysize-lums.fontysize*2, m^.scry, m^.scrysize); IF ycl+lums.fontysize*2>m^.ysize THEN m^.scry:=0; (* scroll max down *) ELSIF ycl<=lums.fontysize*2 THEN m^.scry:=32000*SCRMUL; (* sroll up max *) ELSIF m^.ysize-ycl0C THEN copypaste(s) END; refresh:=TRUE; END copytoed; PROCEDURE filesetup(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=3 THEN IF sub=0 THEN configtogg(fLOGWFN) ELSE configs[fEDITLINE].title:="Log Filename"; configedit:=ORD(fLOGWFN); END; ELSIF knob=2 THEN configs[fEDITLINE].title:="Delete Log After Days"; configs[fEDITLINE].width:=4; configedit:=ORD(fLOGDAYS); END; configs[fEDITLINE].title:=configs[VAL(CONFSET, configedit)].title; copytoed; updatemenus; END filesetup; PROCEDURE knobcol(img:pIMAGE; x0, y0, xs, ys:INTEGER; c:PIX); VAR x, y:INTEGER; col:PIX; BEGIN FOR y:=y0 TO y0+ys-1 DO FOR x:=x0 TO x0+xs-1 DO IF (x<=VAL(INTEGER, HIGH(img^))) & (y<=VAL(INTEGER, HIGH(img^[0]))) THEN col:=img^[x][y]; INC(col.r, c.r); INC(col.g, c.g); INC(col.b, c.b); img^[x][y]:=col; END; END; END; END knobcol; PROCEDURE configman(button:CARDINAL; VAR keycmd:CHAR); TYPE sCONFSET=SET OF CONFSET; VAR s, s1:ARRAY[0..1000] OF CHAR; BEGIN IF button=1 THEN configedit:=0 ELSE confstr(fEDITLINE, s); confstr(VAL(CONFSET, configedit), s1); IF NOT StrCmp(s, s1) THEN configs[VAL(CONFSET, configedit)].updated:=TRUE END; AddConfLine(VAL(CONFSET, configedit), 1, s); IF VAL(CONFSET, configedit)=fFONTSIZE THEN loadfont; killallmenus; say(fontloadmsg, 6, "b") END; -- IF VAL(CONFSET, configedit) IN sCONFSET{fFONTSIZE, fANT1, fANT2, fANT3, fFRESNELL,fGEOBRIGHTNESS, fGEOCONTRAST, fARROW,fKMH,fKMHTIME,fTEMP,fWINDSYM,fRULER,fALTMIN,fCOLMAPTEXT, fCOLOBJTEXT, fCOLMENUTEXT, fCOLMENUBACK, fCOLMARK1, fCOLMARK2} IF VAL(CONFSET, configedit) IN sCONFSET{fFONTSIZE, fANT1, fANT2, fANT3, fFRESNELL, fARROW,fKMH,fKMHTIME,fTEMP,fWINDSYM,fTIMESTAMP,fRULER,fALTMIN,fCOLMAPTEXT, fCOLOBJTEXT, fCOLMENUTEXT, fCOLMENUBACK} THEN keycmd:=" " END; (* redraw all *) IF configs[VAL(CONFSET, configedit)].typ", MINH*85); addline(m, "Colour Marker 1", CMDCOLOURSGEO+">", MINH*85+5); s:="Use RAM MB ["; IntToStr(conf2int(fSRTMCACHE, 0, 0, 2000, 100), 1 ,h); Append(s,h); Append(s, "] MB"); addline(m, s, CMDCOLOURSGEO, MINH*85+8); s:="Brightness ["; IntToStr(conf2int(fGEOBRIGHTNESS, 0, 0, 100, 30), 1 ,h); Append(s,h); Append(s, "] %"); addline(m, s, CMDCOLOURSGEO, MINH*85+10); s:="Contrast ["; IntToStr(conf2int(fGEOCONTRAST, 0, 0, 10000000, 5), 1 ,h); Append(s,h); Append(s, "]"); addline(m, s, CMDCOLOURSGEO, MINH*85+15); s:="Refraction ["; rv:=conf2real(fREFRACT, 0, -10.0, 10.0, 0.0); FixToStr(rv, 3 ,h); Append(s,h); Append(s, "]"); addline(m, s, CMDCOLOURSGEO, MINH*85+18); s:="Frequency ["; rv:=conf2real(fFRESNELL, 0, 0.0, MAX(REAL), 0.0); IF rv>=MINMHZ THEN FixToStr(rv+0.0005, 4 ,h); Append(s,h) END; Append(s, "] MHz"); addline(m, s, CMDCOLOURSGEO, MINH*85+20); s:="Antenna 3 ["; nn:=conf2int(fANT3, 0, ALTINVAL, MAXANTALT, ALTINVAL); IF nn<>ALTINVAL THEN IntToStr(nn, 1 ,h); Append(s,h) END; Append(s, "] m"); addline(m, s, CMDCOLOURSGEO, MINH*85+25); s:="Antenna 2 ["; nn:=conf2int(fANT2, 0, ALTINVAL, MAXANTALT, ALTINVAL); IF nn<>ALTINVAL THEN IntToStr(nn, 1 ,h); Append(s,h) END; Append(s, "] m"); addline(m, s, CMDCOLOURSGEO, MINH*85+27); s:="Antenna 1 ["; nn:=conf2int(fANT1, 0, ALTINVAL, MAXANTALT, ALTINVAL); IF nn<>ALTINVAL THEN IntToStr(nn, 1 ,h); Append(s,h) END; IF gpsalt(fANT1) THEN Append(s, " +ALT"); END; Append(s, "] m"); addline(m, s, CMDCOLOURSGEO, MINH*85+29); s:=" | Redraw | Map On/Off"; nn:=configs[fSRTMCACHE].on; c.r:=0; c.g:=0; c.b:=0; IF nn=0 THEN s[1]:="L"; c.b:=800; c.g:=100 ELSIF nn=1 THEN s[1]:="M"; c.g:=300 ELSE s[1]:="H"; c.r:=500 END; addline(m, s, CMDRADIORANGE, MINH*85+35); knobcol(m^.image, 2, (m^.oldknob-1)*m^.yknob, lums.fontxsize*3-2, m^.yknob-1, c); m^.redrawproc:=dogeoprofil; m^.hiknob:=0; m^.notoverdraw:=TRUE; END dogeoprofil; PROCEDURE geoprofil; CONST MAXBUTT=11; VAR m:pMENU; BEGIN newmenu(m, lums.fontxsize*24+4, lums.fontysize+7, MAXBUTT, bTRANSP); dogeoprofil(m); m^.ysize:=m^.oldknob*m^.yknob; m^.oldknob:=0; END geoprofil; PROCEDURE coloureditgeo(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=1 THEN configedit:=ORD(fCOLMARK2) ELSIF knob=2 THEN configedit:=ORD(fCOLMARK1) ELSIF knob=3 THEN configedit:=ORD(fSRTMCACHE) ELSIF knob=4 THEN configedit:=ORD(fGEOBRIGHTNESS) ELSIF knob=5 THEN configedit:=ORD(fGEOCONTRAST) ELSIF knob=6 THEN configedit:=ORD(fREFRACT) ELSIF knob=7 THEN configedit:=ORD(fFRESNELL) ELSIF knob=8 THEN configedit:=ORD(fANT3) ELSIF knob=9 THEN configedit:=ORD(fANT2) ELSE configedit:=ORD(fANT1) END; configs[fEDITLINE].title:=configs[VAL(CONFSET, configedit)].title; copytoed; rdlums; updatemenus; END coloureditgeo; -- colour chooser PROCEDURE docolours(m:pMENU); BEGIN m^.oldknob:=0; addline(m, " Symbol Text", CMDCOLOURS+">", MINH*84+5); addline(m, " Object/Item Text", CMDCOLOURS+">", MINH*84+7); addline(m, " Menus Text", CMDCOLOURS+">", MINH*84+10); addline(m, " Menus Background", CMDCOLOURS+">", MINH*84+15); addline(m, " Brightness Rfpath", CMDCOLOURS, MINH*84+30); addonoff(m, " |Menu transparency", CMDCOLOURS, MINH*84+35, lums.fontxsize+2, configon(fTRANSP)); addline(m, " Font Size", CMDCOLOURS, MINH*84+40); m^.redrawproc:=docolours; m^.hiknob:=0; m^.notoverdraw:=TRUE; END docolours; (* PROCEDURE colours; VAR m:pMENU; BEGIN newmenu(m, lums.fontxsize*19+4, lums.fontysize+7, 9, bTRANSP); docolours(m); m^.ysize:=m^.oldknob*m^.yknob+1; m^.oldknob:=0; END colours; *) PROCEDURE colouredit(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=7 THEN configedit:=ORD(fFONTSIZE); ELSIF knob=6 THEN IF sub=0 THEN configtogg(fTRANSP); ELSE configedit:=ORD(fTRANSP) END; ELSIF knob=5 THEN configedit:=ORD(fLRF); ELSE configedit:=ORD(fCOLMAPTEXT)+knob-1 END; configs[fEDITLINE].title:=configs[VAL(CONFSET, configedit)].title; copytoed; rdlums; updatemenus; END colouredit; PROCEDURE ARC(re, im:REAL):REAL; CONST PI=3.1415926536; BEGIN IF (re=0.0) & (im=0.0) THEN RETURN 0.0 ELSIF ABS(re)>=ABS(im) THEN IF re>=0.0 THEN RETURN arctan(im/re) ELSIF im>=0.0 THEN RETURN PI+arctan(im/re) ELSE RETURN arctan(im/re)-PI END; ELSIF im>=0.0 THEN RETURN PI/2.0-arctan(re/im) ELSE RETURN -PI/2.0-arctan(re/im) END; END ARC; PROCEDURE normcol(m:CARDINAL; VAR r,g,b:CARDINAL); (* make color tripple to max luma *) VAR h:CARDINAL; BEGIN h:=r; IF g>h THEN h:=g END; IF b>h THEN h:=b END; IF h=0 THEN h:=1 END; r:=trunc(FLOAT(r*m)/FLOAT(h)+0.5); g:=trunc(FLOAT(g*m)/FLOAT(h)+0.5); b:=trunc(FLOAT(b*m)/FLOAT(h)+0.5); END normcol; PROCEDURE xytocolor(x,y:CARDINAL; VAR r,g,b, alias:CARDINAL):BOOLEAN; CONST CMUL=1000; PI=3.1415926536; VAR xa, ya, h, rr,br,gr, ra:REAL; BEGIN ra:=FLOAT(lums.fontxsize*COLOURSZ); xa:=2.0*(FLOAT(x)/ra-0.5); ya:=2.0*(FLOAT(y)/ra-0.5); ra:=sqrt(xa*xa + ya*ya); IF ra>1.0 THEN RETURN FALSE END; (* out of circle *) h:=ARC(xa, ya); IF ABS(h)<=PI/3.0 THEN rr:=(0.5-h/(PI/1.5)); br:=(0.5+h/(PI/1.5)); gr:=1.0; ELSE h:=h-PI/1.5; IF ABS(h)<=PI/3.0 THEN br:=1.0; gr:=(0.5-h/(PI/1.5)); rr:=(0.5+h/(PI/1.5)); ELSE h:=h+2.0*PI/1.5; rr:=1.0; br:=(0.5-h/(PI/1.5)); gr:=(0.5+h/(PI/1.5)); END; END; r:=trunc((1.0-rr*ra)*CMUL); g:=trunc((1.0-gr*ra)*CMUL); b:=trunc((1.0-br*ra)*CMUL); normcol(CMUL, r,g,b); h:=(1.0-ra)*3000.0; IF h<100.0 THEN alias:=trunc(h) ELSE alias:=100 END; (* how near to radius of circle *) RETURN TRUE END xytocolor; PROCEDURE docolourchoose(menu:pMENU); VAR x, y, xc, yc, xo, yo, d, rr, gg, bb, ro,go, bo, min, alias, colorsz:CARDINAL; col:COLTYP; BEGIN menu^.oldknob:=0; addline(menu, "", CMDCOLOURCLICK, MINH*84+50); ro:=conf2int(VAL(CONFSET, ORD(fCOLMAPTEXT)+menu^.scroll-1), 0, 0, 100, 0); go:=conf2int(VAL(CONFSET, ORD(fCOLMAPTEXT)+menu^.scroll-1), 1, 0, 100, 0); bo:=conf2int(VAL(CONFSET, ORD(fCOLMAPTEXT)+menu^.scroll-1), 2, 0, 100, 0); normcol(1000, ro,go,bo); colorsz:=COLOURSZ*lums.fontxsize; xo:=0; yo:=0; min:=MAX(CARDINAL); FOR y:=0 TO HIGH(menu^.image^[0]) DO FOR x:=0 TO HIGH(menu^.image^) DO WITH menu^.image^[x][y] DO IF (ycolorsz+COLOURSFRAME) OR (xcolorsz+COLOURSFRAME) THEN r:=300; g:=300; b:=300; --r:=0; g:=1; b:=TRANSPARENCE; ELSE xc:=x-COLOURSFRAME; yc:=y-COLOURSFRAME; IF xytocolor(xc, yc, rr, gg, bb, alias) THEN d:=ABS(VAL(INTEGER,rr)-VAL(INTEGER,ro)) +ABS(VAL(INTEGER,gg)-VAL(INTEGER,go)) +ABS(VAL(INTEGER,bb)-VAL(INTEGER,bo)); IF d=HIGH(menu^.image^)-1 THEN xo:=HIGH(menu^.image^)-1 END; IF yo<1 THEN yo:=1 ELSIF yo>=HIGH(menu^.image^[0])-1 THEN yo:=HIGH(menu^.image^[0])-1 END; FOR y:=yo-2 TO yo+2 DO FOR x:=xo-2 TO xo+2 DO WITH menu^.image^[x][y] DO r:=0; g:=1; b:=0 END; (* set cursor *) END; END; Colset(col, "W"); drawstri(menu^.image, configs[VAL(CONFSET, menu^.scroll-1+ORD(fCOLMAPTEXT))].title, 3, HIGH(menu^.image^[0])-5-lums.fontysize, 1000, 1, col, FALSE, FALSE); menu^.redrawproc:=docolourchoose; menu^.hiknob:=0; END docolourchoose; PROCEDURE colourchoose(knob:CARDINAL); VAR menu:pMENU; colorsz:CARDINAL; BEGIN colorsz:=COLOURSZ*lums.fontxsize; newmenu(menu, colorsz+COLOURSFRAME*2, colorsz+COLOURSFRAME*2+lums.fontysize, 1, bCOLOR); menu^.scroll:=knob; docolourchoose(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END colourchoose; PROCEDURE colourchoosegeo(knob:CARDINAL); VAR menu:pMENU; colorsz:CARDINAL; BEGIN colorsz:=COLOURSZ*lums.fontxsize; newmenu(menu, colorsz+COLOURSFRAME*2, colorsz+COLOURSFRAME*2+lums.fontysize, 1, bCOLOR); IF knob=1 THEN menu^.scroll:=1+ORD(fCOLMARK2)-ORD(fCOLMAPTEXT) ELSE menu^.scroll:=1+ORD(fCOLMARK1)-ORD(fCOLMAPTEXT) END; docolourchoose(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END colourchoosegeo; PROCEDURE setcolour(knob, cx, cy:CARDINAL); VAR r,g,b, alias:CARDINAL; s, h:ARRAY[0..100] OF CHAR; colorsz:CARDINAL; BEGIN --WrInt(knob, 10);WrInt(cx, 10); WrInt(cy, 10); colorsz:=COLOURSZ*lums.fontxsize; IF cx>=COLOURSFRAME THEN DEC(cx, COLOURSFRAME) ELSE cx:=0 END; IF cy>=COLOURSFRAME+lums.fontysize THEN DEC(cy, COLOURSFRAME+lums.fontysize) ELSE cy:=0 END; IF cx>colorsz THEN cx:=colorsz END; IF cy>colorsz THEN cy:=colorsz END; IF xytocolor(cx, colorsz-cy, r, g, b, alias) THEN g:=g DIV 10; IF g>100 THEN g:=100 END; b:=b DIV 10; IF b>100 THEN b:=100 END; r:=r DIV 10; IF r>100 THEN r:=100 END; CardToStr(r, 0, s); Append(s, " "); CardToStr(g, 0, h); Append(s, h); Append(s, " "); CardToStr(b, 0, h); Append(s, h); icfg(VAL(CONFSET, ORD(fCOLMAPTEXT)+knob-1), s); END; rdlums; updatemenus; END setcolour; -- colour chooser PROCEDURE netmenu(m:pMENU); VAR h,s:ARRAY[0..99] OF CHAR; i:CARDINAL; BEGIN m^.oldknob:=0; addonoff(m, " |Allow Gate Rf>Net", CMDONLINE, MINH*74+45, lums.fontxsize+2, configon(fALLOWGATE)); addonoff(m, " Allow Tx to Net", CMDONLINE, MINH*74+40, lums.fontxsize+2, configon(fALLOWNETTX)); addonoff(m, " Connect Server", CMDONLINE, MINH*74+35, lums.fontxsize+2, configon(fCONNECT)); addline(m, " Serverfilter", CMDONLINE, MINH*74+30); addline(m, " Server url", CMDONLINE, MINH*74+25); addline(m, " Passcode", CMDONLINE, MINH*74+20); addline(m, " Netbeacontext", CMDONLINE, MINH*74+15); addline(m, " My Position", CMDONLINE, MINH*74+10); confstr(fMYSYM, s); h:=" My Symbol "; Append(h,s); addline(m, h, CMDONLINE+">", MINH*74+5); drawsymsquare(m^.image, s[0], s[1], m^.xsize-lums.symsize DIV 2-lums.fontxsize-8, (m^.oldknob-1)*m^.yknob+m^.yknob DIV 2); confstr(fMYCALL, h); i:=0; s:=""; WHILE (i<=HIGH(h)) & (h[i]<>0C) DO IF (h[i]<=" ") OR (h[i]>=177C) THEN Append(s," ") ELSE Append(s,h[i]) END; INC(i); END; h:=" My Call "; Append(h,s); addline(m, h, CMDONLINE, MINH*74); m^.redrawproc:=netmenu; m^.hiknob:=0; m^.notoverdraw:=TRUE; END netmenu; PROCEDURE rfmenu(m:pMENU); BEGIN m^.oldknob:=0; addline(m, " Config Rx Messages", CMDRF+">", MINH*75+50); addline(m, " Beacons Shift Time", CMDRF, MINH*75+45); addline(m, " Beacons + Objects", CMDRF, MINH*75+40); addline(m, " Digipeater", CMDRF, MINH*75+37); addonoff(m, " |Monitor Headline", CMDRF, MINH*75+35, lums.fontxsize+2, configon(fWRTICKER)); addonoff(m, " |Call Check", CMDRF, MINH*75+30, lums.fontxsize+2, configon(fMUSTBECALL)); addonoff(m, " |Serial Interface2", CMDRF, MINH*75+25, lums.fontxsize+2, configon(fSERIALTASK2)); addonoff(m, " |Serial Interface1", CMDRF, MINH*75+20, lums.fontxsize+2, configon(fSERIALTASK)); addonoff(m, " |RF-Port 4", CMDRF, MINH*75+15, lums.fontxsize+2, configon(fUDP4)); addonoff(m, " |RF-Port 3", CMDRF, MINH*75+10, lums.fontxsize+2, configon(fUDP3)); addonoff(m, " |RF-Port 2", CMDRF, MINH*75+5, lums.fontxsize+2, configon(fUDP2)); addonoff(m, " |RF-Port 1", CMDRF, MINH*75, lums.fontxsize+2, configon(fUDP1)); m^.redrawproc:=rfmenu; m^.hiknob:=0; m^.notoverdraw:=TRUE; END rfmenu; PROCEDURE dorfcfg(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=2 THEN configs[fEDITLINE].title:="Beacons Time Shift (s)"; configedit:=ORD(fRFBTSHIFT); ELSIF knob=BEACONEDI THEN configs[fEDITLINE].title:="Beacons"; beaconediting:=TRUE; beaconed:=TRUE; ELSIF knob=DIGIEDI THEN configs[fEDITLINE].title:="Digi"; digied:=TRUE; ELSIF knob=5 THEN IF sub=0 THEN configtogg(fWRTICKER) ELSE configs[fEDITLINE].title:="Calls in Headline"; configedit:=ORD(fWRTICKER); END; ELSIF knob=6 THEN configtogg(fMUSTBECALL); ELSIF knob=7 THEN IF sub=0 THEN configtogg(fSERIALTASK2) ELSE configs[fEDITLINE].title:="Serial Interface2"; configedit:=ORD(fSERIALTASK2); END; ELSIF knob=8 THEN IF sub=0 THEN configtogg(fSERIALTASK) ELSE configs[fEDITLINE].title:="Serial Interface1"; configedit:=ORD(fSERIALTASK); END; ELSIF knob=RFCFGRFPORTS-3 THEN IF sub=0 THEN configtogg(fUDP4) ELSE configs[fEDITLINE].title:="RF-Port 4"; configedit:=ORD(fUDP4); END; ELSIF knob=RFCFGRFPORTS-2 THEN IF sub=0 THEN configtogg(fUDP3) ELSE configs[fEDITLINE].title:="RF-Port 3"; configedit:=ORD(fUDP3); END; ELSIF knob=RFCFGRFPORTS-1 THEN IF sub=0 THEN configtogg(fUDP2) ELSE configs[fEDITLINE].title:="RF-Port 2"; configedit:=ORD(fUDP2); END; ELSIF knob=RFCFGRFPORTS THEN IF sub=0 THEN configtogg(fUDP1) ELSE configs[fEDITLINE].title:="RF-Port 1"; configedit:=ORD(fUDP1); END; END; copytoed; updatemenus; END dorfcfg; PROCEDURE domsgmenu(m:pMENU); BEGIN m^.oldknob:=0; addline(m, " Query Keywords", CMDMSG, MINH*82); addline(m, " Msg Destination", CMDMSG, MINH*82+5); addline(m, " Msg Path", CMDMSG, MINH*82+10); addonoff(m, " Msg Popup Window", CMDMSG, MINH*82+15, lums.fontxsize+2, configon(fPOPUPMSG)); addonoff(m, " Show all SSID Msg", CMDMSG, MINH*82+20, lums.fontxsize+2, configon(fMSGALLSSID)); addonoff(m, " Show Msg to Myself", CMDMSG, MINH*82+25, lums.fontxsize+2, configon(fPASSSELFMSG)); m^.redrawproc:=domsgmenu; m^.hiknob:=0; END domsgmenu; PROCEDURE domsgcfg(knob:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=1 THEN configs[fEDITLINE].title:="Query:Action"; configedit:=ORD(fQUERYS); ELSIF knob=2 THEN configs[fEDITLINE].title:="Msg Path"; configedit:=ORD(fMSGRFDEST); configs[fEDITLINE].width:=SIZE(MONCALL); ELSIF knob=3 THEN configs[fEDITLINE].title:="Msg Path"; configedit:=ORD(fMSGPATH); ELSIF knob=4 THEN configtogg(fPOPUPMSG); ELSIF knob=5 THEN configtogg(fMSGALLSSID); ELSIF knob=6 THEN configtogg(fPASSSELFMSG); END; copytoed; updatemenus; END domsgcfg; PROCEDURE msgmenu; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*19+4, lums.fontysize+7, 10, bTRANSP); domsgmenu(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END msgmenu; PROCEDURE maploadtogg; VAR s:ARRAY[0..50] OF CHAR; BEGIN configtogg(fGETMAPS); s:="Map download "; IF configon(fGETMAPS) THEN Append(s, "On") ELSE Append(s, "Off") END; textautosize(0, 0, 6, 4, "b", s); END maploadtogg; PROCEDURE expandtogg; VAR s:ARRAY[0..50] OF CHAR; BEGIN configtogg(fALLOWEXP); s:="Allow Expand Maps "; IF configon(fALLOWEXP) THEN Append(s, "On") ELSE Append(s, "Off") END; textautosize(0, 0, 6, 4, "b", s); END expandtogg; PROCEDURE timercfg(m:pMENU); BEGIN m^.oldknob:=0; addline(m, " Local time (+-h)", CMDDOTIMERS, MINH*77+9); addline(m, " Nomove skip delay", CMDDOTIMERS, MINH*77+8); addline(m, " Animation Speed", CMDDOTIMERS, MINH*77+7); addline(m, " Duplicate lookback", CMDDOTIMERS, MINH*77+2); addline(m, " Show km/h", CMDDOTIMERS, MINH*77+3); addline(m, " Fade out time", CMDDOTIMERS, MINH*77+4); addline(m, " Full Bright time", CMDDOTIMERS, MINH*77+5); addline(m, " Data in RAM", CMDDOTIMERS, MINH*77+0); addline(m, " Objects in RAM", CMDDOTIMERS, MINH*77+1); addline(m, " Delay Start Mapload", CMDDOTIMERS, MINH*77+45); addline(m, " Net Beacon time", CMDDOTIMERS, MINH*77+6); m^.redrawproc:=timercfg; m^.hiknob:=0; m^.notoverdraw:=TRUE; END timercfg; PROCEDURE dotimers(knob:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=11 THEN configs[fEDITLINE].title:="Netbeacon time (s)"; configedit:=ORD(fNETBTIME); ELSIF knob=10 THEN configs[fEDITLINE].title:="Delay Start Mapload (s)"; configedit:=ORD(fDELAYGETMAP); ELSIF knob=9 THEN configs[fEDITLINE].title:="Objects in RAM (Min)"; configedit:=ORD(fTPURGEOBJ); ELSIF knob=8 THEN configs[fEDITLINE].title:="Data in RAM (Min)"; configedit:=ORD(fTPURGE); ELSIF knob=7 THEN configs[fEDITLINE].title:="Fullbright time (Min)"; configedit:=ORD(fTFULL); ELSIF knob=6 THEN configs[fEDITLINE].title:="Fade out time (Min)"; configedit:=ORD(fTFADE); ELSIF knob=5 THEN configs[fEDITLINE].title:="Show km/h (s)"; configedit:=ORD(fKMHTIME); ELSIF knob=4 THEN configs[fEDITLINE].title:="Dupes lookback (Min)"; configedit:=ORD(fDUPDEL); ELSIF knob=3 THEN configs[fEDITLINE].title:="Animation Speed"; configedit:=ORD(fANIMSPEED); ELSIF knob=2 THEN configs[fEDITLINE].title:="Nomove skip delay"; configedit:=ORD(fVIDEOFAST); ELSIF knob=1 THEN configs[fEDITLINE].title:="Local time (+-h)"; configedit:=ORD(fLOCALTIME); END; copytoed; updatemenus; END dotimers; PROCEDURE mapcfg(m:pMENU); BEGIN m^.oldknob:=0; addline(m, " Reset to Default", CMDRESETIMGPARMS, MINH*78+10); addline(m, " Brightness notmover", CMDDOMAP, MINH*78+15); addline(m, " Show Altitude min m", CMDDOMAP, MINH*78+20); addonoff(m, " |km/h text", CMDDOMAP, MINH*78+25, lums.fontxsize+2, configon(fKMH)); addonoff(m, " |Load Map Program", CMDDOMAP, MINH*78+50, lums.fontxsize+2, configon(fGETMAPS)); addonoff(m, " Show Temp", CMDDOMAP, MINH*78+30, lums.fontxsize+2, configon(fTEMP)); addonoff(m, " Show Windvane", CMDDOMAP, MINH*78+35, lums.fontxsize+2, configon(fWINDSYM)); addonoff(m, " Show Course Arrow", CMDDOMAP, MINH*78+40, lums.fontxsize+2, configon(fARROW)); addonoff(m, " Show Scaler", CMDDOMAP, MINH*78+45, lums.fontxsize+2, configon(fRULER)); addonoff(m, " Trackfilter", CMDDOMAP, MINH*78+55, lums.fontxsize+2, configon(fTRACKFILT)); addonoff(m, " Timestamp", CMDDOMAP, MINH*78+57, lums.fontxsize+2, configon(fTIMESTAMP)); addonoff(m, " |Show Loc of Mouse", CMDDOMAP, MINH*78+60, lums.fontxsize+2, configon(fMOUSELOC)); m^.redrawproc:=mapcfg; m^.hiknob:=0; m^.notoverdraw:=TRUE; END mapcfg; PROCEDURE resetimgparms; BEGIN initconfig1; rdlums; Setmap(0); escmenus; lums.headmenuy:=TRUE; lums.errorstep:=FALSE; lums.moving:=FALSE; posinval(click.markpos); posinval(click.measurepos); posinval(click.squerpos0); posinval(click.squerspos0); click.waysum:=0.0; say("Reset most Image/Mouse Parameters to Default", 4, "b"); END resetimgparms; PROCEDURE domap(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=2 THEN configs[fEDITLINE].title:="Brightness notmover"; configedit:=ORD(fNOMOV); ELSIF knob=3 THEN configs[fEDITLINE].title:="Show Altitude min m"; configedit:=ORD(fALTMIN); ELSIF knob=4 THEN IF sub=0 THEN configtogg(fKMH) ELSE configs[fEDITLINE].title:="km/h text"; configedit:=ORD(fKMH); END; ELSIF knob=5 THEN IF sub=0 THEN maploadtogg ELSE configs[fEDITLINE].title:="Start Maploader"; configedit:=ORD(fGETMAPS); END; ELSIF knob=6 THEN configtogg(fTEMP); ELSIF knob=7 THEN configtogg(fWINDSYM); ELSIF knob=8 THEN configtogg(fARROW); ELSIF knob=9 THEN configtogg(fRULER); ELSIF knob=10 THEN configtogg(fTRACKFILT); ELSIF knob=TIMESTAMP THEN configtogg(fTIMESTAMP); ELSIF knob=TOGGMOUSESHOW THEN IF sub=0 THEN configtogg(fMOUSELOC); IF NOT configon(fMOUSELOC) THEN killmenuid(MOUSESHOWID); mouseshowcnt:=0; ELSE mouseshowcnt:=1 END; ELSE configs[fEDITLINE].title:="show POIs from zoomlevel"; configedit:=ORD(fMOUSELOC); END; END; copytoed; updatemenus; END domap; PROCEDURE mapmove(m:pMENU); BEGIN m^.oldknob:=0; addonoff(m, " |Approx Warn km", CMDDOMOVE, MINH*79+0, lums.fontxsize+2, configon(fAPPROXY)); addonoff(m, " Zoom as have Maps", CMDDOMOVE, MINH*79+5, lums.fontxsize+2, configon(fZOOMMISS)); addonoff(m, " Expand Map ", CMDDOMOVE, MINH*79+10, lums.fontxsize+2, configon(fALLOWEXP)); addonoff(m, " Swap map move dir", CMDDOMOVE, MINH*79+15, lums.fontxsize+2, configon(fINVMOV)); addline(m, " Bell/Sound", CMDDOMOVE+">", MINH*79+17); addline(m, " Start Window x y", CMDDOMOVE, MINH*79+20); addline(m, " Center Watchcall", CMDDOMOVE, MINH*79+25); addline(m, " Default Zoom", CMDDOMOVE, MINH*79+30); addline(m, " Max Zoom", CMDDOMOVE, MINH*79+35); addline(m, " Map Move Step", CMDDOMOVE, MINH*79+40); addline(m, " Fine Zoom Step", CMDDOMOVE, MINH*79+45); m^.redrawproc:=mapmove; m^.hiknob:=0; m^.notoverdraw:=TRUE; END mapmove; PROCEDURE domapmove(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=1 THEN IF sub=0 THEN configtogg(fAPPROXY) ELSE configs[fEDITLINE].title:="Approximation Warn km"; configedit:=ORD(fAPPROXY); END; ELSIF knob=2 THEN configtogg(fZOOMMISS); ELSIF knob=3 THEN configtogg(fALLOWEXP); ELSIF knob=4 THEN configtogg(fINVMOV); ELSIF knob=6 THEN configs[fEDITLINE].title:="Start Window x y"; configedit:=ORD(fXYSIZE); ELSIF knob=7 THEN configs[fEDITLINE].title:="Center Watchcall"; configedit:=ORD(fCENTER); ELSIF knob=8 THEN configs[fEDITLINE].title:="Default Zoom"; configedit:=ORD(fDEFZOOM); ELSIF knob=9 THEN configs[fEDITLINE].title:="Max Zoom"; configedit:=ORD(fMAXZOOM); ELSIF knob=10 THEN configs[fEDITLINE].title:="Map Move Step"; configedit:=ORD(fMOVESTEP); ELSIF knob=11 THEN configs[fEDITLINE].title:="Fine Zoom Step"; configedit:=ORD(fZOOMSTEP); END; copytoed; updatemenus; END domapmove; PROCEDURE mapadd; BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; configs[fEDITLINE].title:="Mapname brightness"; configedit:=ORD(fMAPNAMES); copytoed; END mapadd; PROCEDURE mapdir; BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; configs[fEDITLINE].title:="Map directory path"; configedit:=ORD(fOSMDIR); copytoed; END mapdir; PROCEDURE maincfg(knob:CARDINAL; fromstatus:BOOLEAN); VAR menu:pMENU; BEGIN IF knob=11 THEN potis ELSE newmenu(menu, lums.fontxsize*20+4, lums.fontysize+3, 20, bTRANSP); IF fromstatus THEN setunderbar(menu, xmouse.x-10) END; IF knob=4 THEN addline(menu, " Bad Paths Ports", CMDMANFILT, MINH*73+1); -- addonoff(menu, " |Bad Paths Ports", CMDMANFILT, MINH*73+1, 7, configon(fFINGERPRINT)); addline(menu, " Raw Frame", CMDMANFILT, MINH*73+3); addline(menu, " Destination Call", CMDMANFILT, MINH*73); addline(menu, " Word in Comment", CMDMANFILT, MINH*73+5); addline(menu, " Sender of Object", CMDMANFILT, MINH*73+10); addline(menu, " Via Igate Call", CMDMANFILT, MINH*73+15); addline(menu, " Symbol Text", CMDMANFILT, MINH*73+20); ELSIF knob=5 THEN docolours(menu); ELSIF knob=MAPMOVLINE THEN mapmove(menu); ELSIF knob=MAPCFGLINE THEN mapcfg(menu); ELSIF knob=8 THEN timercfg(menu); ELSIF knob=9 THEN rfmenu(menu); ELSIF knob=10 THEN netmenu(menu); END; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.notoverdraw:=TRUE; END; END maincfg; PROCEDURE callfiltsetup(knob:CARDINAL); BEGIN clreditline; IF knob=1 THEN configs[fEDITLINE].title:="Bad Paths Ports"; configs[fEDITLINE].width:=CONFIGWIDTH; configedit:=ORD(fFINGERPRINT); copytoed; ELSIF knob=2 THEN configs[fEDITLINE].title:="Raw Frame"; configs[fEDITLINE].width:=50; configedit:=ORD(fRAWFILT); ELSIF knob=3 THEN configs[fEDITLINE].title:="Destination Call"; configs[fEDITLINE].width:=SIZE(MONCALL); configedit:=ORD(fDESTFILT); ELSIF knob=4 THEN configs[fEDITLINE].title:="Word in Comment"; configs[fEDITLINE].width:=50; configedit:=ORD(fSTRFILT); ELSIF knob=5 THEN configs[fEDITLINE].title:="Sender of Object"; configs[fEDITLINE].width:=SIZE(MONCALL); configedit:=ORD(fOBJSRCFILT); ELSIF knob=6 THEN configs[fEDITLINE].title:="Via Igate Call"; configs[fEDITLINE].width:=SIZE(MONCALL); configedit:=ORD(fIGATEFILT); ELSIF knob=7 THEN configs[fEDITLINE].title:="Call of Symbol"; configs[fEDITLINE].width:=SIZE(MONCALL); configedit:=ORD(fOPFILT); END; refresh:=TRUE; END callfiltsetup; PROCEDURE watchcallsetup; BEGIN configs[fEDITLINE].title:="Watch Call"; configs[fEDITLINE].width:=10; configedit:=ORD(fWATCH); configs[fEDITLINE].curspos:=0; clreditline; refresh:=TRUE; END watchcallsetup; PROCEDURE onlinesetup(knob, sub:CARDINAL); BEGIN configedit:=0; configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=1 THEN IF sub=0 THEN configtogg(fALLOWGATE) ELSE configs[fEDITLINE].title:="Rf Ports"; configs[fEDITLINE].width:=4; configedit:=ORD(fALLOWGATE); END; copytoed; ELSIF knob=2 THEN configtogg(fALLOWNETTX); ELSIF knob=3 THEN configtogg(fCONNECT); ELSIF knob=4 THEN configs[fEDITLINE].title:="Server Filter"; configs[fEDITLINE].width:=99; configedit:=ORD(fSERVERFILT); copytoed; ELSIF knob=ONLINESETUPURL THEN configs[fEDITLINE].title:="Server URL"; configs[fEDITLINE].width:=99; configedit:=ORD(fSERVERURL); copytoed; ELSIF knob=6 THEN configs[fEDITLINE].title:="Passcode"; configs[fEDITLINE].width:=99; configedit:=ORD(fPW); copytoed; ELSIF knob=7 THEN configs[fEDITLINE].title:="Netbeacon Text"; configs[fEDITLINE].width:=99; configedit:=ORD(fNBTEXT); copytoed; ELSIF knob=8 THEN configs[fEDITLINE].title:="My Position"; configs[fEDITLINE].width:=22; configedit:=ORD(fMYPOS); copytoed; (* ELSIF knob=9 THEN configs[fEDITLINE].title:="Symbol"; configs[fEDITLINE].width:=2; configedit:=ORD(fMYSYM); *) ELSIF knob=10 THEN configs[fEDITLINE].title:="My Call"; configs[fEDITLINE].width:=9; configedit:=ORD(fMYCALL); copytoed; END; IF (knob=1) OR (knob>3) THEN copytoed ELSE configedit:=0 END; updatemenus; END onlinesetup; PROCEDURE configdel(knob:CARDINAL); VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*7, lums.fontysize+7, 2, bTRANSP); menu^.scroll:=knob-2; addline(menu, "On/Off", CMDCONFDELMAN, MINH*76+95); addline(menu, "Edit", CMDCONFDELMAN, MINH*76+96); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END configdel; PROCEDURE testbeep(v:CONFSET); BEGIN IF configon(v) THEN beep(100, conf2int(v, 0, 20, 8000, 1000), conf2int(v, 1, 0, 5000, 250)); say("Testing beep now", 1, "b"); END; END testbeep; PROCEDURE docfgbeep(knob, sub:CARDINAL); BEGIN configs[fEDITLINE].width:=CONFIGWIDTH; IF knob=1 THEN IF sub=0 THEN configtogg(fBEEPPROX) ELSE configs[fEDITLINE].title:="Beep far/near Hz ms Hz ms"; configedit:=ORD(fBEEPPROX); END; testbeep(fBEEPPROX); ELSIF knob=2 THEN IF sub=0 THEN configtogg(fBEEPWATCH) ELSE configs[fEDITLINE].title:="Watchcall Beep Hz ms"; configedit:=ORD(fBEEPWATCH); END; testbeep(fBEEPWATCH); ELSIF knob=3 THEN IF sub=0 THEN configtogg(fBEEPMSG) ELSE configs[fEDITLINE].title:="Message Beep rx/ack Hz ms Hz ms"; configedit:=ORD(fBEEPMSG); END; testbeep(fBEEPMSG); END; copytoed; updatemenus; END docfgbeep; PROCEDURE cfgbeep(m:pMENU); BEGIN m^.oldknob:=0; addonoff(m, " |Approxy Beep", CMDDOBEEP, MINH*80+10, lums.fontxsize+2, configon(fBEEPPROX)); addonoff(m, " |Watchcall Beep", CMDDOBEEP, MINH*80+15, lums.fontxsize+2, configon(fBEEPWATCH)); addonoff(m, " |Message Beep", CMDDOBEEP, MINH*80+20, lums.fontxsize+2, configon(fBEEPMSG)); m^.redrawproc:=cfgbeep; m^.ysize:=m^.oldknob*m^.yknob; m^.hiknob:=0; END cfgbeep; PROCEDURE configbeep; VAR m:pMENU; BEGIN newmenu(m, lums.fontxsize*17+4, lums.fontysize+7, 3, bTRANSP); cfgbeep(m); m^.oldknob:=0; END configbeep; PROCEDURE configeditor; CONST YPOS=240; MLINES=2; (* static menu lines *) VAR m:pMENU; xw, cnt, i, xp:CARDINAL; s, ss:ARRAY[0..200] OF CHAR; fn:FILENAME; cmd:ARRAY[0..1] OF CHAR; ph,pl:pCONFLINE; onof, more:BOOLEAN; --test:REAL; oks,hks,ohs:CARDINAL; BEGIN cnt:=0; pl:=NIL; IF configedit<=HIGH(configs) THEN pl:=configs[VAL(CONFSET, configedit)].lines END; ph:=pl; WHILE ph<>NIL DO INC(cnt); ph:=ph^.next END; i:=mainys() DIV (lums.fontysize+5); IF i>=MAXKNOBS THEN i:=MAXKNOBS END; IF ii THEN cnt:=i END; xw:=lums.fontxsize*67; IF xw>VAL(CARDINAL,xsize) THEN xw:=xsize END; m:=findmenuid(CONFIGEDITID); refrmenu(m, xw, lums.fontysize+5, cnt+MLINES, bCOLOR, FALSE); oks:=m^.oldknob; hks:=m^.hiknob; ohs:=m^.oldsub; m^.oldknob:=0; IF cnt=cLIST; --IF configedit=ORD(fWATCH) THEN more:=FALSE END; onof:=isbool(configs[VAL(CONFSET, configedit)].typ); IF more THEN cmd:=CMDCONFIGDEL+">" ELSE cmd:=" " END; i:=xw DIV lums.fontxsize; WHILE cnt>0 DO IF onof THEN s:=MOP0+" " ELSE s:=MOP0+" " END; m^.scroll:=cnt; Append(s, pl^.line); IF configedit=ORD(fWATCH) THEN Append(s," "); s[12]:=0C; cmd:=CMDWATCHDO; Append(s, "|"); IF ODD(pl^.active) THEN Append(s, " +") ELSE Append(s, " ") END; Append(s, "Beep |"); IF ODD(pl^.active DIV 2) THEN Append(s, " +") ELSE Append(s, " ") END; Append(s, "Focus |"); IF ODD(pl^.active DIV 4) THEN Append(s, " +") ELSE Append(s, " ") END; Append(s, "Log |"); Assign(fn, pl^.line); makelogfn(fn); IF guesssize(fn, ss)<0 THEN ss[0]:=0C END; rightbound(ss, 7); Append(s, ss); Append(s, " | Edit | Delete"); -- Append(s, " Log | Edit | Delete"); END; IF (i>3) & (Length(s)>=i) THEN s[i-3]:=0C; Append(s, "...") END; addline(m, s, cmd, MINH*58); IF onof THEN onoff(m, 8, pl^.active>0) END; pl:=pl^.next; DEC(cnt); END; m^.hiknob:=hks; m^.wid:=CONFIGEDITID; m^.ysize:=m^.oldknob*m^.yknob; i:=m^.oldknob; m^.oldknob:=oks; m^.pullconf:=fMENUXYEDIT; m^.pullyknob:=PULLMENUY; IF xw0) & (m^.hiknob<=i) THEN IF m^.hiknob IN m^.clampkb THEN keybknob(m, m^.hiknob, TRUE, 0) END; inv(m, m^.oldsub, m^.hiknob); END; END configeditor; PROCEDURE watchdo(knob, sub:CARDINAL); VAR pl:pCONFLINE; s, s1:SET8; fn, h:FILENAME; ok:BOOLEAN; BEGIN DEC(knob, 2); conflineno(fWATCH, knob-1, TRUE, pl); IF pl<>NIL THEN IF sub<>6 THEN dellog:=0 END; IF (sub>=1) & (sub<=3) THEN s:=SET8{sub-1}; s1:=CAST(SET8, pl^.active); s:=s/s1; pl^.active:=CAST(CARD8, s); (* toggle 3 bits *) ELSIF sub=4 THEN Assign(fn, pl^.line); makelogfn(fn); IF guesssize(fn, h)>=0 THEN (* there is a logfile *) dellog:=knob; say("Delele Logfile ? Click 'Delete'", 0, "r"); END; ELSIF sub=5 THEN configdelman(fWATCH, 2, knob) (* move to editor *) ELSIF sub=6 THEN IF dellog=knob THEN Assign(fn, pl^.line); makelogfn(fn); ok:=FALSE; IF fn[0]<>0C THEN Erase(fn, ok) END; IF ok THEN h:="["; Append(h, fn); Append(h, "] deleted"); ELSE h:="cannot delete ["; Append(h, fn); Append(h, "]") END; say(h, 0, "r"); ELSIF dellog=0 THEN configdelman(fWATCH, 3, knob) (* delete watch line *) ELSE say("logfile not deleted", 4, "r") END; dellog:=0; END; END; refresh:=TRUE; END watchdo; PROCEDURE configmain(m:pMENU); BEGIN m^.oldknob:=0; addonoff(m, " |Save Config", CMDMAINCFG, MINH*70, lums.fontxsize+4, configon(fAUTOSAVE)); addline(m, " Reload Config", CMDMAINCFG, MINH*70+5); addline(m, " Watch Calls", CMDMAINCFG, MINH*70+10); addline(m, " Callfilters", CMDMAINCFG+">", MINH*70+15); addline(m, " Colours, Font", CMDMAINCFG+">", MINH*70+17); addline(m, " Map Moving", CMDMAINCFG+">", MINH*70+20); addline(m, " Map Parameter", CMDMAINCFG+">", MINH*70+25); addline(m, " Timers", CMDMAINCFG+">", MINH*70+30); addline(m, " Rf-Ports", CMDMAINCFG+">", MINH*70+35); addline(m, " Online", CMDMAINCFG+">", MINH*70+40); addline(m, " Brightness", CMDMAINCFG+">", MINH*70+45); m^.redrawproc:=configmain; m^.hiknob:=0; END configmain; PROCEDURE configmenu2; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*15, lums.fontysize+7, 20, bTRANSP); configmain(menu); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; setunderbar(menu, 0); menu^.wid:=249; menu^.notoverdraw:=TRUE; END configmenu2; PROCEDURE findopl(where:CARDINAL); VAR menu:pMENU; BEGIN IF where=0 THEN killmenuid(0) END; newmenu(menu, lums.fontxsize*37+4, lums.fontysize+10, 1, bCOLOR); addline(menu, "", CMDFIND, MINH*19+90); INCL(menu^.clampkb, 1); menu^.confidx[1]:=ORD(fFIND); clampedline:=0; keybknob(menu, 1, FALSE, 0); menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.fullclamp:=TRUE; focuswid:=menu^.wid; IF where<>1 THEN findmouse:=xmouse END; (* new find *) IF where<=1 THEN menu^.x0:=findmouse.x; menu^.y0:=findmouse.y END; END findopl; PROCEDURE cntpoifiles():CARDINAL; VAR i:CARDINAL; BEGIN i:=0; WHILE (i<=HIGH(poifiles)) & (poifiles[i].count>0) DO INC(i) END; RETURN i END cntpoifiles; PROCEDURE doshowpoicategory(menu:pMENU); VAR olds, oldk:CARDINAL; i, cnt:CARDINAL; s, sc:ARRAY[0..30] OF CHAR; BEGIN cnt:=cntpoifiles(); IF cnt>0 THEN oldk:=menu^.oldknob; olds:=menu^.oldsub; menu^.oldknob:=0; FOR i:=0 TO cnt-1 DO s:=" "; Append(s, poifiles[i].name); IntToStr(poifiles[i].count, 1, sc); Append(s, "["); Append(s, sc);Append(s, "]"); addonoff(menu, s, CONFPOISYM+">", MINH*86+80, lums.fontxsize+2, poifiles[i].on); drawsymsquare(menu^.image, poifiles[i].symbol[0], poifiles[i].symbol[1], menu^.xsize-lums.symsize DIV 2-lums.fontxsize-8, (menu^.oldknob-1)*menu^.yknob+menu^.yknob DIV 2); END; INC(cnt); addline(menu, "", CONFPOISYMFIND, MINH*86+81); INCL(menu^.clampkb, cnt); menu^.confidx[cnt]:=ORD(fPOIFILTER); clampedline:=0; keybknob(menu, cnt, FALSE, 0); menu^.redrawproc:=doshowpoicategory; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=oldk; menu^.oldsub:=olds; END; END doshowpoicategory; PROCEDURE showpoicategory(folded:BOOLEAN); VAR menu:pMENU; cnt:CARDINAL; BEGIN cnt:=cntpoifiles(); IF NOT folded THEN killallmenus END; IF cnt>0 THEN newmenu(menu, lums.fontxsize*23+4, lums.fontysize+10, cnt+1, bTRANSP); IF NOT folded THEN menu^.x0:=xmouse.x; menu^.y0:=xmouse.y END; doshowpoicategory(menu); menu^.oldknob:=0; ELSIF NOT folded THEN say("No PoiFiles found", 4, "e") END; END showpoicategory; PROCEDURE fotofn; VAR menu:pMENU; BEGIN newmenu(menu, lums.fontxsize*67, lums.fontysize+7, 1, bCOLOR); addline(menu, "", SCREENSHOT, MINH*18); INCL(menu^.clampkb, 1); menu^.confidx[1]:=ORD(fFOTOFN); clampedline:=0; keybknob(menu, 1, FALSE, 0); menu^.notoverdraw:=TRUE; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.fullclamp:=TRUE; focuswid:=menu^.wid; END fotofn; PROCEDURE DirectConf; (* enter config file line syntax *) VAR menu:pMENU; BEGIN killmenuid(0); newmenu(menu, lums.fontxsize*50, lums.fontysize+7, 1, bCOLOR); addline(menu, "", DODIRECTCONF, MINH*19); INCL(menu^.clampkb, 1); menu^.confidx[1]:=ORD(fDIRECTCONF); clampedline:=0; keybknob(menu, 1, FALSE, 0); menu^.notoverdraw:=TRUE; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; menu^.fullclamp:=TRUE; focuswid:=menu^.wid; END DirectConf; PROCEDURE existslog(fname:ARRAY OF CHAR):BOOLEAN; VAR fnd,fn:FILENAME; t:TIME; BEGIN Assign(fn, fname); t:=realtime; fnd:=fn; logfndate(t, fnd); IF fn=fnd THEN RETURN Exists(fnd) END; (* no single day log *) REPEAT IF Exists(fnd) THEN RETURN TRUE END; DEC(t, 3600*24); fnd:=fn; logfndate(t, fnd); UNTIL t<1388534400; (* oldest possible file *) RETURN FALSE END existslog; PROCEDURE importlog(menu:pMENU); VAR redraw:BOOLEAN; fn:ARRAY[0..4095] OF CHAR; BEGIN redraw:=menu<>NIL; IF NOT redraw THEN newmenu(menu, lums.fontxsize*43+4, lums.fontysize+7, 6, bCOLOR); dellog:=0 END; menu^.oldknob:=0; addline(menu, " First | Back | Load | Forw | Last", CMDRDLOG, MINH*67+30); (* addline(menu, " | | |", CMDRDLOG, MINH*67+30); subicon(menu^.image, 27, midy(menu), 1, 7); subicon(menu^.image, 35, midy(menu), 1, 7); subicon(menu^.image, 92, midy(menu), 1, 7); subicon(menu^.image, 256-92, midy(menu), 2, 7); subicon(menu^.image, 256-35, midy(menu), 2, 7); subicon(menu^.image, 256-27, midy(menu), 2, 7); *) confstr(fLOGWFN, fn); IF lums.logmode THEN addline(menu, " Exit Logview | Reload Writelog", CMDRDLOG, MINH*67+20); ELSIF dellog<>0 THEN addline(menu, " Not delete Writelog| DELETE NOW!", CMDRDLOG, MINH*67+15); ELSIF existslog(fn) THEN addline(menu, " Delete Writelog | Reload Writelog", CMDRDLOG, MINH*67+15); ELSE addline(menu, MOP0+MOP3+MOP8+" Delete Writelog | Reload Writelog", CMDRDLOG, MINH*67+15) END; addline(menu, "", CMDRDLOG, MINH*67+10); INCL(menu^.clampkb, 3); menu^.confidx[3]:=ORD(fLOGFN); keybknob(menu, 3, FALSE, 0); addline(menu, "", CMDRDLOG, MINH*67+5); INCL(menu^.clampkb, 4); menu^.confidx[4]:=ORD(fLOGFIND); keybknob(menu, 4, FALSE, 0); addline(menu, "", CMDRDLOG, MINH*67); INCL(menu^.clampkb, 5); menu^.confidx[5]:=ORD(fLOGDATE); keybknob(menu, 5, FALSE, 0); IF (lums.headmenuy) & (menu^.y0NIL THEN importlog(m) END; END refrlog; PROCEDURE statuscol(img:pIMAGE; x0, xwide:INTEGER; c:PIX); VAR x, y, ym:INTEGER; col:PIX; BEGIN ym:=lums.fontysize-2; IF ym>VAL(INTEGER, HIGH(img^[0])) THEN ym:=HIGH(img^[0]) END; FOR y:=1 TO ym DO FOR x:=1 TO xwide-2 DO col:=img^[x0+x][y]; INC(col.r, c.r); INC(col.g, c.g); INC(col.b, c.b); img^[x0+x][y]:=col; END; END; END statuscol; PROCEDURE statuscoly(img:pIMAGE; x0, xw:INTEGER; tx,tr:TIME; on:BOOLEAN); PROCEDURE rt(t:TIME):REAL; BEGIN IF t>60 THEN t:=60 END; RETURN 1.0-FLOAT(t)*(1.0/60.0); END rt; VAR x, y, ym, ir, in:INTEGER; ut, ur, un, v:REAL; cn,ct,cr:PIX; BEGIN IF on THEN cn.r:=300; cn.g:=0; cn.b:=0; cr.r:=0; cr.g:=300; cr.b:=0; ct.r:=550; ct.g:=550; ct.b:=0; ELSE cn.r:=0; cn.g:=0; cn.b:=0; ct:=cn; cr:=cn END; ut:=rt(tx); ur:=rt(tr); IF ut>ur THEN un:=ut ELSE un:=ur END; (* shortest time *) IF un<>0.0 THEN ur:=ur*un/(ut+ur) END; v:=FLOAT(lums.fontysize-1); ir:=VAL(INTEGER, ur*v); in:=VAL(INTEGER, un*v); ym:=lums.fontysize-2; IF ym>VAL(INTEGER, HIGH(img^[0])) THEN ym:=HIGH(img^[0]) END; FOR y:=1 TO ym DO FOR x:=1 TO xw-2 DO WITH img^[x0+x][y] DO IF y>in THEN INC(r, cn.r); INC(g, cn.g); INC(b, cn.b); ELSIF y>ir THEN INC(r, ct.r); INC(g, ct.g); INC(b, ct.b); ELSE INC(r, cr.r); INC(g, cr.g); INC(b, cr.b) END; END; END; END; END statuscoly; PROCEDURE tcpstat; VAR s:ARRAY[0..1000] OF CHAR; BEGIN s[0]:=0C; tcpconnstat(s); say(s, 4, "b"); END tcpstat; PROCEDURE udpstat(port:CARDINAL); VAR s:ARRAY[0..1000] OF CHAR; BEGIN s[0]:=0C; udpconnstat(port, s); say(s, 4, "b"); END udpstat; PROCEDURE anywatchfollow():BOOLEAN; (* has any watchcall "follow" enabled" *) VAR j:CARDINAL; wc:ARRAY[0..99] OF CHAR; BEGIN j:=0; LOOP confstrings(fWATCH, j, TRUE, wc); IF wc[0]=0C THEN EXIT END; (* end of watchlist *) IF ODD(confflags(fWATCH, j) DIV 2) THEN RETURN TRUE END; (* watchcall with follow *) INC(j); END; RETURN FALSE END anywatchfollow; PROCEDURE statusbar; CONST KNOBS=10; XKNOBC=5; (* color field x *) VAR menu:pMENU; redraw:BOOLEAN; c:PIX; kx, osub, okn, elen, xknob, maxextralen:CARDINAL; i:CONFSET; s,e:ARRAY[0..99] OF CHAR; ch:CHAR; BEGIN maxextralen:=lums.fontxsize*14; (* dynamic message field width *) e[0]:=0C; IF lums.wxcol="R" THEN Append(e, "Rain Map"); ELSIF lums.wxcol="W" THEN Append(e, "Temp.Map"); ELSIF lums.wxcol="w" THEN Append(e, "Wx Stations"); ELSIF click.withradio THEN -- IF click.panorama THEN e:="Panorama" ELSE IF click.altimap THEN Append(e, "Geo Map") ELSE Append(e, "Radio Map") END; -- END; ELSIF click.mhop[0]<>0C THEN Append(e, click.mhop); ELSIF click.onesymbol.tab<>0C THEN Append(e, "Symbol "); Append(e, click.onesymbol.tab); Append(e, click.onesymbol.pic); ELSIF configon(fGEOPROFIL) THEN Append(e, "Geo Profile") END; elen:=Length(e)*lums.fontxsize; IF elen>0 THEN INC(elen, lums.fontxsize-2); IF elen>maxextralen THEN elen:=maxextralen END; END; xknob:=microspace(SP1+" "+SP6); menu:=findmenuid(STATUSID); redraw:=menu<>NIL; IF NOT redraw THEN newmenu(menu, xknob*KNOBS+maxextralen, lums.fontysize+1, 1, bBLACK) END; okn:=menu^.oldknob; osub:=menu^.oldsub; menu^.oldknob:=0; menu^.xsize:=xknob*KNOBS+elen; s:=MOP0+SP2+"N"+SP5+"|"+SP1+"1"+SP6+"|"+SP1+"2"+SP6+"|"+SP1+"3"+SP6+"|"+SP1+"4"+SP6+"|"+SP1; IF lums.logmode THEN ch:="L" ELSE IF lums.followwhat={} THEN IF anywatchfollow() THEN ch:="f" ELSE ch:=" " END; ELSIF lums.followwhat={FOLLOWX} THEN ch:="X"; ELSIF lums.followwhat={FOLLOWWATCH} THEN ch:="W"; ELSE ch:="*" END; END; Append(s, ch); Append(s, SP6+"|"+SP1+"M"+SP6+"|"+SP1); IF maploadpid.runs THEN ch:="d" ELSE ch:="e" END; IF configon(fGETMAPS) THEN ch:=CAP(ch) END; Append(s, ch); Append(s, SP6+"|"+SP1+"F"+SP6+"|"+SP1+"O"); IF lasttcprx=0 THEN s[2]:="X" END; IF e[0]<>0C THEN Append(s, SP5+"|"); Append(s, e) END; addline(menu, s, CMDSTATUS, MINH*STATUSHINT); statuscoly(menu^.image, 0, xknob, realtime-lasttcptx, realtime-lasttcprx, configon(fCONNECT)); kx:=0; FOR i:=fUDP1 TO fUDP4 DO statuscoly(menu^.image, xknob*(kx+1), xknob, realtime-udpsocks[kx].lastudptx, realtime-udpsocks[kx].lastudprx, configon(i)); INC(kx); END; INC(kx); c.r:=0; c.g:=0; c.b:=0; IF lums.logmode THEN c.r:=500; c.g:=300; END; statuscol(menu^.image, xknob*kx, xknob, c); INC(kx); IF msgfifo<>NIL THEN c.r:=300 ELSE c.r:=0 END; c.g:=0; c.b:=0; statuscol(menu^.image, xknob*kx, xknob, c); INC(kx); c.r:=0; c.g:=0; c.b:=0; IF isblown THEN c.r:=400 ELSIF configon(fALLOWEXP) THEN c.g:=300 END; statuscol(menu^.image, xknob*kx, xknob, c); INC(kx); IF configon(fTRACKFILT) THEN c.g:=300; c.b:=300 ELSE c.g:=0; c.b:=0 END; c.r:=0; statuscol(menu^.image, xknob*kx, xknob, c); INC(kx); IF lums.obj>0 THEN c.g:=100; c.b:=700 ELSE c.g:=0; c.b:=0 END; c.r:=0; statuscol(menu^.image, xknob*kx, xknob, c); INC(kx); IF elen>0 THEN c.r:=300; c.g:=100; c.b:=0; statuscol(menu^.image, xknob*kx,elen, c); END; menu^.wid:=STATUSID; menu^.hiknob:=0; IF NOT redraw THEN menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END; IF lums.headmenuy THEN kx:=TOOLBARX*lums.fontxsize+2 ELSE kx:=0 END; menu^.pullconf:=fMENUXYSTATUS; menu^.pullyknob:=PULLMENUY; setmenupos(menu, conf2int(fMENUXYSTATUS, 0, 0, 32767, kx), conf2int(fMENUXYSTATUS, 1, 0, 32767, 0)); menu^.oldknob:=okn; menu^.oldsub:=osub; -- menu^.y0:=0; END statusbar; PROCEDURE setsym(knob, subknob:CARDINAL; set:CONFSET; pm:pMENU; dest:CHAR); VAR s:ARRAY[0..99] OF CHAR; ns, i, j, n:CARDINAL; BEGIN IF findmenuid(OVERLAYID)=pm THEN confstr(set, s); IF (knob>=4) & (knob<=5) THEN IF subknob<=12 THEN s[0]:=CHR(ORD("a")+subknob+(5-knob)*13) END; ELSIF (knob>=2) & (knob<=3) THEN IF subknob<=12 THEN s[0]:=CHR(ORD("A")+subknob+(3-knob)*13) END; ELSIF (knob=1) & (subknob<=9) THEN s[0]:=CHR(ORD("0")+subknob) END; AddConfLine(set, 0, s); IF set=fONESYMB THEN rdonesymb(TRUE, FALSE) END; ELSE ns:=subknob+(12-knob)*16; IF set=fONESYMB THEN (* multisymbol choose *) rdonesymb(TRUE, FALSE); IF ns IN click.onesymbolset THEN EXCL(click.onesymbolset, ns) ELSE INCL(click.onesymbolset, ns) END; j:=0; FOR i:=0 TO 191 DO IF i IN click.onesymbolset THEN INC(j) END; END; n:=0; FOR i:=0 TO 191 DO n:=n DIV 2 + 8*ORD(i IN click.onesymbolset); IF i MOD 4=3 THEN IF n<10 THEN INC(n, ORD("0")) ELSE INC(n, ORD("A")-10) END; s[2+i DIV 4]:=CHR(n); n:=0; END; END; s[2+192 DIV 4]:=0C; IF j>=1 THEN s[0]:=cMULTISYMBOL; s[1]:=" "; ELSE IF ns<96 THEN s[0]:="/" ELSE s[0]:="\" END; s[1]:=CHR(32+ns MOD (6*16)); END; ns:=192; END; IF ns<192 THEN IF ns<96 THEN s[0]:="/" ELSE s[0]:="\" END; s[1]:=CHR(32+ns MOD (6*16)); s[2]:=0C; END; IF (s[1]>" ") OR (set=fONESYMB) THEN AddConfLine(set, 0, s) END; killmenuid(OVERLAYID); updatemenus; IF (s[0]="\") & (s[1]>" ") THEN overlaychoose(dest); END; END; updatemenus; END setsym; PROCEDURE downloadmenu; VAR menu:pMENU; BEGIN IF mappack.run THEN newmenu(menu, lums.fontxsize*17+4, lums.fontysize+7, 1, bCOLOR); addline(menu, "Stop Download", STOPDOWNLOAD, MINH*23); ELSE -- IF NOT configon(fGETMAPS) -- THEN textautosize(0, 0, 20, 5, "r", 'Enable "Load Map Program" in Config/Map Parameter') END; newmenu(menu, lums.fontxsize*23+4, lums.fontysize+7, 1, bCOLOR); addline(menu, "", CMDDOWNLOAD, MINH*23+1); INCL(menu^.clampkb, 1); menu^.confidx[1]:=ORD(fDOWNLOADZOOM); keybknob(menu, 1, FALSE, 0); END; menu^.ysize:=menu^.oldknob*menu^.yknob; menu^.oldknob:=0; END downloadmenu; PROCEDURE killbubble; BEGIN killmenuid(BUBBLWINID) END killbubble; PROCEDURE textbubble(pos:POSITION; s-:ARRAY OF CHAR; last:BOOLEAN); CONST H=8; MARGIN=20; VAR menu:pMENU; xw, yw, x, y, xm, ym, i:CARDINAL; xp, yp:INTEGER; xpoi, ypoi:REAL; col:COLTYP; BEGIN IF NOT posvalid(pos) OR (mapxy(pos, xpoi, ypoi)<0) THEN RETURN END; IF redrawimg=NIL THEN WrStrLn(s); RETURN END; (* no graphical window open *) i:=0; xw:=MARGIN+3; WHILE (i<=HIGH(s)) & (s[i]<>0C) DO INC(xw, charwidth(s[i])); (* x size of text *) INC(i); END; yw:=lums.fontysize+H; xp:=VAL(INTEGER, xpoi)-1; yp:=VAL(INTEGER, ypoi)+VAL(INTEGER, yw)-1; IF (xp<=0) OR (xp+VAL(INTEGER, xw)>VAL(INTEGER, mainxs())) OR (yp<=0) OR (yp+VAL(INTEGER, yw)>VAL(INTEGER, mainys())) THEN RETURN END; allocmenu(menu, xw, yw, FALSE); xm:=HIGH(menu^.image^); ym:=HIGH(menu^.image^[0]); menu^.xsize:=xm+1; menu^.ysize:=ym+1; menu^.wid:=BUBBLWINID; menu^.background:=bTRANSP; menu^.x0:=xp; menu^.y0:=mainys()-VAL(CARDINAL, yp); menu^.nohilite:=sMENULINES{0..MAXKNOBS}; FOR y:=0 TO menu^.ysize-1 DO FOR x:=0 TO menu^.xsize-1 DO WITH menu^.image^[x][y] DO IF (y=H) & (x>=H) OR (x0.0) OR (NOT poioff & (initzoom>=conf2int(fMOUSELOC, 0, MINZOOM, MAXZOOM, 9))) THEN POIname(pos, s, info) END; (* no pois on mouse over menu *) IF dist<>0.0 THEN (* pos from panorama *) pos:=pos1; (* not lock to POI on panorama *) FixToStr(dist, 4, h); Append(h, "km"); IF s[0]<>0C THEN Append(s, " ") END; Append(s, h); END; IF alt>-20000 THEN IntToStr(alt, 0, h); Append(h, "m NN"); IF s[0]<>0C THEN Append(s, " ") END; Append(s, h); END; IF s[0]<>0C THEN click.bubblpos:=pos; click.lastpoi:=FALSE; Assign(click.bubblstr, s); Assign(click.bubblinfo, info); -- textbubble(pos, s, FALSE); END; END; END mouseshow; PROCEDURE knoblamp(menu:pMENU; knob:CARDINAL); VAR typ:CHAR; i:CARDINAL; BEGIN typ:=menu^.cmds[knob]; FOR i:=1 TO HIGH(menu^.cmds) DO IF typ=menu^.cmds[i] THEN onoffm(menu^.image, 6, (i-1)*(menu^.yknob)+menu^.yknob DIV 2, i=knob) END; END; END knoblamp; PROCEDURE hidemenu(menu:pMENU; on:BOOLEAN); VAR m:pMENU; BEGIN m:=menus; WHILE (m<>NIL) & (m<>menu) DO m^.hidden:=on; m:=m^.next END; END hidemenu; PROCEDURE appbar; BEGIN IF lums.headmenuy & (findmenuid(TOOLBARID)=NIL) THEN toolbar END; -- IF findmenuid(STATUSID)=NIL THEN statusbar(NIL) ELSE refrstatus; END; END appbar; PROCEDURE resizecursors(m:pMENU; px, py:CARDINAL); BEGIN IF m^.wid=LISTWINID THEN listwincursors(m, px, py); ELSIF m^.wid=PANOWINID THEN listwincursors(m, px, py); WITH panowin DO hover:=TRUE; hx:=px; hy:=py; mx:=xmouse.x; my:=xmouse.y; END; --WrInt(px,10); WrInt(py,10); WrStrLn(" pan"); END; END resizecursors; PROCEDURE hilitemenu(px, py:CARDINAL; kbdch:CHAR; pm:pMENU):BOOLEAN; (* pm=NIL is find menu with x,y else use kbd up/down *) VAR knob, subknob, posx, posy, ki:CARDINAL; c:CHAR; s:ARRAY[0..20] OF CHAR; BEGIN IF pm=NIL THEN whichmenu(px, py, pm, knob, subknob, posx, posy); IF (pm<>NIL) & NOT (knob IN pm^.clampkb) THEN clampedline:=0 END; ELSE knob:=pm^.oldknob; subknob:=pm^.oldsub; ki:=knob; IF kbdch=CURSDOWN THEN LOOP (* find next text line *) IF ki=0 THEN EXIT END; DEC(ki); IF ki IN pm^.clampkb THEN knob:=ki; EXIT END; END; ELSIF kbdch=CURSUP THEN LOOP IF ki>=MAXKNOBS THEN EXIT END; INC(ki); IF ki IN pm^.clampkb THEN knob:=ki; EXIT END; END; END; END; IF pm<>NIL THEN --WrInt(knob, 5);WrInt(subknob, 5); WrStrLn(" y"); poioff:=TRUE; killbubble; starthint(pm^.helpindex[knob]+subknob, FALSE); IF (pm^.cmds[knob]<>0C) & ((knob<>pm^.oldknob) OR (subknob<>pm^.oldsub)) THEN --WrInt(knob, 5); WrInt(pm^.oldknob, 5);WrStrLn("km"); killmenus(pm^.next); pm^.next:=NIL; IF pm^.submen[knob] THEN c:=pm^.cmds[knob]; IF c="c" THEN mapchoose; -- ELSIF c=">" THEN potis; ELSIF c="i" THEN infos; ELSIF c="F" THEN findopl(3); ELSIF c="C" THEN showpoicategory(TRUE); ELSIF c="K" THEN confstr(fCLICKMAP, s); IF (s[0]=CMDCENTERMOUSE) OR (s[0]="X") OR (s[0]="Y") OR (s[0]="2") THEN mapclick ELSE nextclick END; ELSIF c=CMDONCLICK THEN IF knob=1 THEN hoverclick; ELSIF knob=2 THEN mapclick; ELSIF knob=3 THEN symbolclick(TEXTCLICK, fCLICKTEXT); ELSIF knob=4 THEN symbolclick(SYMCLICK, fCLICKSYM); ELSIF knob=5 THEN wxclick; ELSIF knob=6 THEN trackclick; END; ELSIF c=TOOLSMENU THEN toolsmenu; ELSIF c=FILEMENU THEN filemenu; ELSIF c=LISTMENU THEN listmen; ELSIF c=CMDSPECIALMAP THEN specialmap; ELSIF c=HELPMENU THEN helpmenu; ELSIF c=FOTOFN THEN fotofn; -- ELSIF c=DODIRECTCONF THEN DoDirectConf; ELSIF c=FILERDLOG THEN importlog(NIL); -- ELSIF c=CONFIGM THEN configmenu; ELSIF c=CONFIGM2 THEN configmenu2; ELSIF c=CMDMANMSG THEN managemsg(pm^.scroll, knob); ELSIF c=CMDADDBEACON THEN managebeacon(pm^.scroll, knob, subknob, TRUE); ELSIF c=CMDDIGILINE THEN dodigi(pm^.scroll, knob, subknob, 2); ELSIF c=CMDMAINCFG THEN maincfg(knob, FALSE); ELSIF c=CMDCONFIGDEL THEN configdel(knob); ELSIF c=CMDONLINE THEN symchoose(CONFSYM); ELSIF c=CONFONESYM THEN IF subknob>0 THEN symchoose(CHOOSEONESYM) END; ELSIF c=CONFPOISYM THEN poinameline:=knob; symchoose(CHOOSECONFPOISYM); ELSIF c=CMDDOMOVE THEN IF knob=5 THEN configbeep END; ELSIF c=CMDRF THEN msgmenu; ELSIF c=CMDCOLOURS THEN colourchoose(knob); ELSIF c=CMDGEOPROFIL THEN geoprofil; ELSIF c=CMDCOLOURSGEO THEN colourchoosegeo(knob); END; END; WITH pm^ DO IF hiknob>0 THEN (* undo old hilite *) inv(pm, oldsub, hiknob); IF hiknob IN clampkb THEN keybknob(pm, hiknob, FALSE, 0) END; END; oldknob:=knob; oldsub:=subknob; hiknob:=knob; IF hiknob IN clampkb THEN keybknob(pm, hiknob, TRUE, 0) END; inv(pm, oldsub, hiknob); END; hidemenu(NIL, FALSE); RETURN TRUE ELSE resizecursors(pm, posx, posy) END; RETURN FALSE ELSE poioff:=FALSE END; starthint(0, FALSE); RETURN FALSE END hilitemenu; PROCEDURE printhint; CONST HINTFN="hints.txt"; EOL="|"; VAR s:ARRAY[0..1000] OF CHAR; buf:ARRAY[0..32767] OF CHAR; p, len, w, m, my:INTEGER; n:CARDINAL; fd:File; c:CHAR; BEGIN IF pulling OR zooming THEN RETURN END; IF hintnum=MINH*STATUSHINT THEN tcpstat; ELSIF (hintnum>=MINH*STATUSHINT+1) & (hintnum<=MINH*STATUSHINT+1+HIGH(udpsocks)) THEN udpstat(hintnum-(MINH*STATUSHINT+1)) END; IF (hinttime+HINTDELAY<=realtime) & (hintnum>=MINH) THEN hintmouse:=xmouse; fd:=OpenRead(HINTFN); IF FdValid(fd) THEN p:=0; len:=0; w:=0; m:=0; LOOP IF p>=len THEN len:=RdBin(fd, buf, SIZE(buf)); IF len<=0 THEN EXIT END; p:=0; END; c:=buf[p]; IF m=0 THEN IF c=EOL THEN m:=1; n:=0; w:=0; END; ELSIF m=1 THEN IF (c>="0") & (c<="9") THEN IF n<100000 THEN n:=10*n+ORD(c)-ORD("0") END; ELSE m:=2 END; ELSIF n=hintnum THEN IF (c>=" ") OR (c=LF) THEN IF c=EOL THEN EXIT END; IF w0) & (s[w-1]<=" ") DO DEC(w); s[w]:=0C END; (* remove trailing junk *) my:=xmouse.y-20; IF my<1 THEN my:=1 END; IF w>0 THEN textautosize(xmouse.x+10, my, HINTWINID, MINHINTTIME+Length(s) DIV HINTREADSPEED, "h", s) END; hinton:=TRUE; refresh:=TRUE; Close(fd); hintnum:=0; ELSE WrStrLn(HINTFN+" not found") END; END; END printhint; PROCEDURE closewxwins; VAR wi:WXSET; BEGIN FOR wi:=MIN(WXSET) TO MAX(WXSET) DO killmenuid(WXWINID+ORD(wi)) END; END closewxwins; PROCEDURE closehint; BEGIN IF hinton THEN killmenuid(HINTWINID); hinton:=FALSE; refresh:=TRUE END; starthint(0, FALSE); IF hoveropen THEN killmenuid(HOVERINFOWINID); closewxwins; hoveropen:=FALSE; refresh:=TRUE; END; END closehint; (* PROCEDURE knoboff(k:CARDINAL; m:pMENU); BEGIN WITH configs[VAL(CONFSET, k)] DO IF bool THEN IF lines<>NIL THEN lines^.active:=FALSE END; fillconf(m, FALSE); END; END; END knoboff; *) PROCEDURE FindClampMenu():pMENU; VAR pm:pMENU; BEGIN pm:=menus; (* go thru menu chain till a clamp window *) WHILE (pm<>NIL) & ((pm^.wid<>focuswid) OR NOT ((pm^.fullclamp) OR (pm^.oldknob IN pm^.clampkb))) DO pm:=pm^.next END; RETURN pm END FindClampMenu; PROCEDURE rotatehist(v:CONFSET; up:BOOLEAN); VAR s, s1:ARRAY[0..CONFIGWIDTH] OF CHAR; p0,p1:pCONFLINE; i,n:CARDINAL; BEGIN i:=0; conflineno(v, 0, TRUE, p0); IF p0<>NIL THEN Assign(s, p0^.line); LOOP (* rotate lines up/down *) INC(i); conflineno(v, i, TRUE, p1); IF p1<>NIL THEN IF up THEN p0^.line:=p1^.line; p0:=p1; ELSE Assign(s1, p1^.line); Assign(p1^.line, s); s:=s1; END; ELSE Assign(p0^.line, s); EXIT END; END; END; conflineno(v, 0, TRUE, p0); (* clear same content lines *) IF p0<>NIL THEN i:=1; LOOP conflineno(v, i, TRUE, p1); IF p1=NIL THEN EXIT END; IF StrCmp(p0^.line, p1^.line) THEN p1^.line[0]:=0C END; INC(i); END; END; i:=0; n:=0; LOOP (* count empty lines *) conflineno(v, i, TRUE, p0); IF p0=NIL THEN EXIT END; IF p0^.line[0]=0C THEN INC(n) END; INC(i); END; i:=0; LOOP (* del empty lines till 1 *) conflineno(v, i, TRUE, p0); IF (p0=NIL) OR (n<=1) THEN EXIT END; IF p0^.line[0]=0C THEN configdelman(v, 3, i+1); DEC(n) ELSE INC(i) END; END; i:=0; LOOP (* count lines *) conflineno(v, i, TRUE, p0); IF p0=NIL THEN EXIT END; INC(i); END; IF (n=0) & (i<10) THEN (* make new empty line *) AddConfLine(v, 0, " "); conflineno(v, 0, TRUE, p0); IF p0<>NIL THEN p0^.line[0]:=0C END; END; conflineno(v, 0, TRUE, p0); IF (p0<>NIL) & (p0^.line[0]=0C) THEN configs[v].curspos:=0 END; END rotatehist; PROCEDURE kbtomenu(VAR ch:CHAR); (* if keystroke to window return 0C *) VAR pm:pMENU; i,j,le,idx,eot:CARDINAL; uml:ARRAY[0..9] OF CHAR; BEGIN lums.moded:=TRUE; pm:=FindClampMenu(); IF pm=NIL THEN RETURN END; IF pm^.wid=LISTWINID THEN listcursmove(pm, ch); RETURN END; j:=MAX(CARDINAL); i:=0; LOOP IF i IN pm^.clampkb THEN IF j>MAXKNOBS THEN j:=i ELSE EXIT END; (* more than 1 menue lines *) END; INC(i); IF i>MAXKNOBS THEN IF j<=MAXKNOBS THEN pm^.oldknob:=j END; (* exact 1 menu line so autofocus it *) EXIT END; END; clampedline:=pm^.oldknob; (* mousemove does not change menu line *) IF (ch=CURSUP) OR (ch=CURSDOWN) THEN IF hilitemenu(0, 0, ch, pm) THEN ch:=0C; clampedline:=pm^.oldknob; refresh:=TRUE; ELSIF pm^.confidx[pm^.oldknob]=ORD(fFIND) THEN (* rotate in history lines *) rotatehist(fFIND, ch=CURSUP); ch:=0C; END; END; -->line editor uml[0]:=ch; uml[1]:=0C; Umlaut(uml); WHILE uml[0]>0C DO ch:=uml[0]; idx:=pm^.confidx[pm^.oldknob]; IF idx<=HIGH(configs) THEN WITH configs[VAL(CONFSET,idx)] DO IF lines=NIL THEN icfg(VAL(CONFSET,idx), " ") END; WITH lines^ DO eot:=0; WHILE (eot<=HIGH(line)) & (line[eot]<>0C) DO INC(eot) END; i:=eot; WHILE i<=HIGH(line) DO line[i]:=" "; INC(i) END; le:=HIGH(line); IF (width>0) & (le>width) THEN le:=width END; IF le=0 THEN le:=1 END; IF curspos>=le THEN curspos:=le-1 END; IF (ch=CURSLEFT) OR (ch=CMDFZOOMOUT) THEN IF curspos>0 THEN DEC(curspos) END; ELSIF (ch=CURSRIGHT) OR (ch=CMDFZOOMIN) THEN INC(curspos); IF curspos>=le THEN curspos:=le-1 END; ELSIF ch=CURSHOME THEN curspos:=0; ELSIF ch=CURSCLRLINE THEN curspos:=0; line[0]:=0C; overtype:=FALSE; ELSIF ch=CURSEND THEN curspos:=eot; ELSIF ch=CURSINS THEN overtype:=NOT overtype; IF line[curspos]<=" " THEN WHILE (curspos>0) & (line[curspos-1]<=" ") DO DEC(curspos) END; END; ELSIF ch=CURSBS THEN IF curspos>0 THEN -- knoboff(idx, pm); FOR i:=curspos TO le-1 DO line[i-1]:=line[i] END; line[le-1]:=" "; DEC(curspos); END; ELSIF ch=CURSDEL THEN -- knoboff(idx, pm); FOR i:=curspos+1 TO le-1 DO line[i-1]:=line[i] END; line[le-1]:=" "; END; IF curspos>=le THEN curspos:=le-1 END; IF (ch>=" ") & (ch<177C) THEN -- knoboff(idx, pm); IF NOT overtype THEN FOR i:=le-1 TO curspos+1 BY -1 DO line[i]:=line[i-1] END; END; line[curspos]:=ch; IF curspos0) & (line[i]=" ") DO line[i]:=0C; DEC(i) END; IF line[i]=" " THEN line[i]:=0C END; line[le]:=0C; END; IF (idx=ORD(fRBCOMMENT))OR (idx=ORD(fRBPATH)) THEN beaconlen END; (* make universal *) END; END; Delstr(uml, 0, 1); END; -->line editor keybknob(pm, pm^.oldknob, TRUE, 0); refresh:=TRUE; IF (ch=CURSENTER) OR (ch=NL) THEN ch:=pm^.cmds[pm^.oldknob] (*; WrInt(ORD(ch), 1);WrStrLn(":Enter");*) ELSE ch:=0C END; END kbtomenu; PROCEDURE op2watch(add:BOOLEAN); VAR s:ARRAY[0..99] OF CHAR; op:pOPHIST; BEGIN op:=selop(); IF op<>NIL THEN AddConfLine(fWATCH, ORD(add), op^.call); Assign(s, op^.call); IF add THEN Append(s, " added to Watchlist") ELSE Append(s, " disabled in Watchlist")END; say(s, 4, "b"); END; END op2watch; PROCEDURE deletop; VAR s:ARRAY[0..99] OF CHAR; BEGIN IF click.entries>0 THEN WITH click.table[click.selected] DO IF opf<>NIL THEN Assign(s, opf^.call); IF testdelwaypoint() THEN delwaypoint(opf, pff0); pff:=pff0; IF pff0<>NIL THEN textinfo(3, FALSE); Append(s, " waypoint"); ELSE click.entries:=0; click.mhop[0]:=0C; END; ELSE opf^.sym.tab:=DELETSYM; opf^.sym.pic:=0C; IF opf^.call=click.mhop THEN click.mhop[0]:=0C; END; click.entries:=0; lastpurge:=0; (* start a purge *) END; Append(s, " Deleted"); say(s, 4, "r"); END; END; IF click.entries=0 THEN killallmenus END; END; END deletop; PROCEDURE redrawpop(mainimg:pIMAGE); (* join map and menus and write pixels to screen *) VAR a, xbufa:ADDRESS; inca, x,y, xof, yof, xm, xl, ym, yym, xbufxsize, xbufysize:CARDINAL; menu:pMENU; img:pIMAGE; rh, gh, bh, rm, gm, bm:CARD16; transp:BOOLEAN; BEGIN IF mainimg=NIL THEN RETURN END; getscreenbuf(xbufa, xbufxsize, xbufysize, inca); img:=mainimg; xof:=0; yof:=0; xm:=HIGH(img^); ym:=HIGH(img^[0]); transp:=FALSE; IF panowin.on THEN startpano; makepanwin END; IF listwin="M" THEN makelistwin(monbuffer) ELSIF listwin="L" THEN makelistwin(listbuffer) ELSIF configon(fMENUMONICON) THEN startmon(FALSE); makelistwin(monbuffer) END; IF sndmsg THEN (*configedit:=0;*) sendmsg; END; IF nextmsg<>0 THEN msgpop END; IF beaconediting THEN beaconeditor END; IF configedit<>0 THEN configeditor END; IF digied THEN digieditor END; appbar; statusbar; menu:=menus; WHILE menu<>NIL DO IF (menu^.timeout>0) & (menu^.timeoutNIL) & menu^.hidden DO menu:=menu^.next END; WHILE img<>NIL DO FOR y:=0 TO ym DO IF y+yof a:=ADDADR(xbufa, ((y+yof)*xbufxsize + xof)*inca); <* ELSIF TARGET_FAMILY="WIN32" THEN *> a:=ADDADR(xbufa, ((xbufysize-1-(y+yof))*xbufxsize + xof)*BYTEPIXEL); -- WHILE CAST(CARDINAL, a) MOD 4<>0 DO a:=ADDADR(a, 1); END; <* END *> yym:=ym-y; xl:=xm+1; IF xl+xof>=xbufxsize THEN IF xbufxsize>=xof THEN xl:=xbufxsize-xof ELSE xl:=0 END; END; x:=0; WHILE xTRANSPARENCE THEN rh:=r; gh:=g; bh:=b; IF transp & (bh>0) THEN WITH mainimg^[x+xof][HIGH(mainimg^[0])-(y+yof)] DO rm:=r; gm:=g; bm:=b; IF rm>=lums.menubackcol.r THEN rm:=lums.menubackcol.r END; IF gm>=lums.menubackcol.g THEN gm:=lums.menubackcol.g END; IF bm>=lums.menubackcol.b THEN bm:=lums.menubackcol.b END; INC(rh, rm DIV 2); INC(gh, gm DIV 2); INC(bh, bm DIV 2); END; END; IF bh>=WHITELEVEL THEN bh:=WHITELEVEL-1 END; IF rh>=WHITELEVEL THEN rh:=WHITELEVEL-1 END; IF gh>=WHITELEVEL THEN gh:=WHITELEVEL-1 END; (* IF mainwin.bitperpixel<=16 THEN xbuf016^[a]:=CAST(XPIX16, gammalut[rh].r+gammalut[gh].g+gammalut[bh].b); ELSE xbuf032^[a]:=CAST(XPIX32, gammalut[rh].r+gammalut[gh].g+gammalut[bh].b) END; *) <* IF TARGET_FAMILY="UNIX" THEN *> IF inca=4 THEN PUT(a, CAST(XPIX32, gammalut[rh].r+gammalut[gh].g+gammalut[bh].b)); a:=ADDADR(a, 4); ELSE PUT(a, CAST(XPIX16, gammalut[rh].r+gammalut[gh].g+gammalut[bh].b)); a:=ADDADR(a, 2); END; ELSE a:=ADDADR(a, inca); <* ELSIF TARGET_FAMILY="WIN32" THEN *> PUT(a, gammalut[bh]); a:=ADDADR(a, 1); PUT(a, gammalut[gh]); a:=ADDADR(a, 1); PUT(a, gammalut[rh]); a:=ADDADR(a, BYTEPIXEL-2); ELSE a:=ADDADR(a, BYTEPIXEL); <* END *> END; END; -- END; INC(x); END; END; END; IF menu<>NIL THEN WITH menu^ DO img:=image; xof:=x0; yof:=y0; IF (*(yof<>0) &*) (wid=0) & (yof0 THEN xm:=xsize-1 ELSE xm:=HIGH(img^) END; IF ysize>0 THEN ym:=ysize-1 ELSE ym:=HIGH(img^[0]) END; IF (xof+xm>xbufxsize) & (xmxbufxsize THEN IF xm>xbufxsize THEN xof:=0 ELSE xof:=xbufxsize-xm END; END; IF yof+ym>xbufysize THEN IF ym>xbufysize THEN yof:=0 ELSE yof:=xbufysize-ym END; END; nowx:=xof; nowy:=yof; transp:=(background=bTRANSP) & lums.menutransp; drawn:=TRUE; END; menu:=menu^.next; ELSE img:=NIL END; END; rgbtoscreen; refresh:=FALSE; END redrawpop; PROCEDURE redraw(img:pIMAGE); BEGIN redrawimg:=img; redrawpop(redrawimg); END redraw; PROCEDURE Pullmenu(wid:CARDINAL; dx, dy:INTEGER); VAR pm:pMENU; BEGIN --WrInt(dx, 10); WrInt(dy, 10); WrLn; pm:=findmenuid(wid); IF (pm<>NIL) & (ORD(pm^.pullconf)>0) & NOT Scrollbars(pm, dx, dy) THEN movewin(pm, dx, dy); refresh:=TRUE; END; END Pullmenu; PROCEDURE wxraw(set:CONFSET; sw:CHAR); VAR s:ARRAY[0..99] OF CHAR; r:INTEGER; BEGIN confstr(set, s); r:=InStr(s, sw); IF r<0 THEN Append(s, sw) ELSE Delstr(s, r, 1) END; icfg(set, s); END wxraw; PROCEDURE listusermsg; VAR op:pOPHIST; BEGIN op:=selop(); IF op<>NIL THEN startlist("Messages", op^.call); listtyps("T", FALSE, op^.call); (* bulletins + messages *) END; END listusermsg; PROCEDURE setmarks(marker1, frommap:BOOLEAN); VAR pf:pFRAMEHIST; BEGIN IF frommap THEN (* take position from last click *) IF posvalid(click.clickpos) THEN IF marker1 THEN setmark1(click.clickpos, TRUE, MAX(INTEGER), 0); ELSE click.measurepos:=click.clickpos END; END; ELSE (* take position and alt from clicked object *) IF click.entries>0 THEN pf:=click.table[click.selected].pff0; IF marker1 THEN setmarkalti(pf, click.table[click.selected].opf, TRUE); ELSIF (pf<>NIL) & posvalid(pf^.vardat^.pos) THEN click.measurepos:=pf^.vardat^.pos ELSIF click.table[click.selected].opf<>NIL THEN click.measurepos:=click.table[click.selected].opf^.lastpos END; END; END; END setmarks; PROCEDURE setpoisym(line, knob, subknob:CARDINAL); VAR ns:CARDINAL; BEGIN IF (line>0) & (line<=HIGH(poifiles)+1) THEN WITH poifiles[line-1] DO ns:=subknob+(12-knob)*16; IF ns>=96 THEN symbol[0]:="\" ELSE symbol[0]:="/" END; symbol[1]:=CHR(32+ns MOD 96); END; END; updatemenus; END setpoisym; PROCEDURE mouseleft(mousx, mousy:INTEGER); VAR menu:pMENU; knob, subknob, potx, poty:CARDINAL; c:CHAR; BEGIN IF mousx<0 THEN mousx:=0 END; IF mousy<0 THEN mousy:=0 END; -- actmenu:=NIL; -- refresh:=FALSE; starthint(0, FALSE); killbubble; whichmenu(mousx, mousy, menu, knob, subknob, potx, poty); --WrInt(ORD(menu<>NIL), 2); WrInt(knob, 10); WrInt(potx, 10); WrInt(poty, 10);WrStrLn(" pxy"); IF menu=NIL THEN click.x:=mousx; click.y:=mainys()-VAL(CARDINAL,mousy); click.selected:=0; --WrInt(click.entries, 10);WrStrLn(" ent"); IF (click.cmd="A") OR (click.cmd=CMDANIMATE1) OR (click.cmd=CMDANIMATEMENU) OR (click.cmd=CMDVIDEO) THEN IF click.cmd<>CMDVIDEO THEN abortpop END; click.cmd:=CMDANIMATEMENU; refresh:=TRUE; ELSIF click.x<=5 THEN click.cmd:=CURSLEFT; ELSIF click.y<=5 THEN click.cmd:=CURSDOWN ELSIF click.x>VAL(INTEGER, mainxs()-5) THEN click.cmd:=CURSRIGHT ELSIF click.y>VAL(INTEGER, mainys()-5) THEN click.cmd:=CURSUP ELSE refresh:=TRUE; click.dryrun:=TRUE; END; ELSE --WrInt(menu^.wid, 1); WrStrLn("=wid"); --WrInt(knob, 10); WrInt(potx, 10); WrStrLn(" kl"); -- beaconimported[0]:=0C; keybknob(menu, knob, TRUE, potx); c:=menu^.cmds[knob]; --WrInt(ORD(c), 5); WrInt(subknob, 5);WrStrLn(" cmd1"); IF menu^.wid=LISTWINID THEN dolist(menu, potx, poty); ELSIF menu^.wid=PANOWINID THEN dopano(menu, potx, poty); --WrInt(ORD(c), 5); WrInt(subknob, 5);WrStrLn(" cmd"); ELSIF c=CMDLISTWINLINE THEN click.cmd:=c; ELSIF c=CMDCLICKWATCH THEN click.cmd:=c; ELSIF c="?" THEN knoblamp(menu, knob); click.selected:=click.entries-knob; click.cmd:=" "; updatemenus; ELSIF c=CMDFPS THEN potimove(menu, potx, POTIFPS); refresh:=TRUE; ELSIF c=DOPOTIS THEN potimove(menu, potx, knob); click.cmd:=" "; refresh:=TRUE; ELSIF c="e" THEN killmenus(menu^.next); menu^.next:=NIL; IF subknob=1 THEN lums.errorstep:=NOT lums.errorstep; ELSE textinfo(ORD(subknob>0), FALSE) END; click.cmd:="e"; click.dryrun:=FALSE; updatemenus; hidemenu(menu, TRUE); refresh:=TRUE; ELSIF (c="b") OR (c="s") OR (c="w") OR (c="p") OR (c="d") OR (c="j") OR (c="r") OR (c="l") OR (c="h") OR (c="n") OR (c="f") OR (c="g") THEN images(selop(), c, sWXSET{}); (* IF c="n" THEN INCL(click.graphset, wAHIST); ELSIF c="s" THEN INCL(click.graphset, wSHIST); ELSIF c="b" THEN INCL(click.graphset, wBHIST) ; WrStrLn("wBH") END; *) refresh:=TRUE; ELSIF c=CURSUP THEN IF subknob=0 THEN click.cmd:=CURSBS; ELSIF subknob=1 THEN click.cmd:=CURSUP ELSE click.cmd:=0C; killallmenus; END; click.dryrun:=FALSE; refresh:=TRUE; ELSIF c=CURSLEFT THEN IF subknob=0 THEN click.cmd:=CURSLEFT; ELSIF subknob=1 THEN click.cmd:=CMDCENTER ELSE click.cmd:=CURSRIGHT END; click.dryrun:=FALSE; refresh:=TRUE; ELSIF c=CURSDOWN THEN IF subknob=0 THEN click.cmd:="-"; ELSIF subknob=1 THEN click.cmd:=CURSDOWN ELSE click.cmd:="+" END; click.dryrun:=FALSE; refresh:=TRUE; ELSIF c="0" THEN IF subknob=0 THEN click.watchmhop:=TRUE ELSE click.cmd:=c; killallmenus END; ELSIF c=CMD1USER THEN IF subknob=0 THEN -- IF click.mhop[0]=0C THEN click.cmd:=CMD1USER ELSE click.watchmhop:=TRUE END; click.cmd:=CMD1USER; ELSE click.cmd:=CMD1USERRF END; killallmenus; ELSIF c=CMDANIMATE1 THEN click.cmd:=CMDANIMATE1; killallmenus; ELSIF c=CMDHEARD THEN IF subknob=0 THEN click.cmd:=CMDMH; killallmenus; ELSE msgtoobj; refresh:=TRUE; END; ELSIF (c="A") OR (c=CMDANIMATEMENU) THEN click.cmd:="A"; killallmenus; ELSIF c="o" THEN click.cmd:=c; ELSIF c="Q" THEN click.cmd:=c; quit:=TRUE; ELSIF c=10C THEN click.cmd:=c; ELSIF c="X" THEN click.cmd:=c; ELSIF c="Y" THEN click.cmd:=c; ELSIF c="~" THEN click.cmd:=c; ELSIF c=CMDZOOMTOMARKS THEN click.cmd:=c; ELSIF c=":" THEN click.cmd:=c; ELSIF c=3C THEN click.cmd:=c; killallmenus; ELSIF c=CMDRESETIMGPARMS THEN click.cmd:=c; ELSIF c="1" THEN IF subknob=0 THEN click.cmd:="1" ELSIF subknob=1 THEN click.cmd:="2" ELSIF subknob=2 THEN click.cmd:="3" ELSE click.cmd:="4" END; ELSIF c="F" THEN click.cmd:=c; killallmenus; ELSIF c="O" THEN click.cmd:=c; ELSIF c="m" THEN click.cmd:=c; killallmenus; ELSIF c=CMDFIND THEN click.cmd:=c; ELSIF c=DODIRECTCONF THEN DoDirectConf; (* ELSIF c="W" THEN click.cmd:=c; ELSIF c=CMDRAIN THEN click.cmd:="w"; *) ELSIF c="W" THEN click.cmd:=" "; IF knob=4 THEN lums.wxcol:="W" ELSE lums.wxcol:="R" END; click.mhop[0]:=0C; click.onesymbol.tab:=0C; click.withradio:=FALSE; ELSIF c=CMDRAIN THEN click.cmd:=" "; IF knob=3 THEN lums.wxcol:="w" ELSE lums.wxcol:=0C END; click.mhop[0]:=0C; click.onesymbol.tab:=0C; click.withradio:=FALSE; ELSIF c=SCREENSHOT THEN click.cmd:=c; -- ELSIF c="s" THEN click.cmd:=c; ELSIF c=CMDRADIORANGE THEN IF subknob=0 THEN configs[fSRTMCACHE].on:=(configs[fSRTMCACHE].on+1) MOD 3; updatemenus; rdlums; ELSIF subknob=1 THEN click.cmd:=" "; refresh:=TRUE ELSE click.cmd:=CMDRADIORANGE END; ELSIF c=CMDVIDEO THEN click.cmd:=c; ELSIF c=CMDRDLOG THEN click.cmd:=CMDRDLOG; rdlums; IF knob=1 THEN click.cmdatt:=CHR(subknob+1) ELSIF knob=2 THEN IF lums.logmode THEN click.cmdatt:=CHR(subknob+6); ELSIF subknob=0 THEN IF dellog<>0 THEN dellog:=0; click.cmdatt:=11C; ELSE dellog:=1; click.cmdatt:=10C END; ELSIF dellog<>0 THEN dellog:=0; click.cmdatt:=12C; ELSE click.cmdatt:=7C END; ELSE click.cmdatt:=0C; click.cmd:=" " END; -- actmenu:=menu; ELSIF c=CMDFZOOMOUT THEN click.cmd:=CMDFZOOMOUT; ELSIF c=CMDFZOOMIN THEN click.cmd:=CMDFZOOMIN; ELSIF c=CMDDOWNLOAD THEN click.cmd:=CMDDOWNLOAD; ELSIF c=MAPCLICK THEN IF knob=1 THEN icfg(fCLICKMAP, CMDCENTERMOUSE) ELSIF knob=2 THEN icfg(fCLICKMAP, "X"); ELSIF knob=3 THEN icfg(fCLICKMAP, "Y"); ELSIF knob=4 THEN icfg(fCLICKMAP, "2"); ELSIF knob=5 THEN icfg(fCLICKMAP, "m"); ELSE icfg(fCLICKMAP, "") END; killallmenus; refresh:=TRUE; ELSIF c=SYMCLICK THEN IF knob=1 THEN toggcfg(fCLICKSYM,"Y","AC+CFGHEARD+X" +CMD1USER+CMD1USERRF); ELSIF knob=2 THEN toggcfg(fCLICKSYM,"X","AC+CFGHEARD+Y" +CMD1USER+CMD1USERRF); ELSIF knob=3 THEN toggcfg(fCLICKSYM,"C","uA+CFGHEARD+XY"+CMD1USER+CMD1USERRF); ELSIF knob=4 THEN toggcfg(fCLICKSYM,CFGRAWDECODED,"AC"); ELSIF knob=5 THEN toggcfg(fCLICKSYM,"A",""); ELSIF knob=6 THEN toggcfg(fCLICKSYM,CMD1USER,"AC+CFGHEARD+XY"+CMD1USERRF); ELSIF knob=7 THEN toggcfg(fCLICKSYM,CMD1USERRF,"uAC+CFGHEARD+XY"+CMD1USER); ELSIF knob=8 THEN toggcfg(fCLICKSYM,CFGHEARD,"uAC+CFGHEARD+XY"+CMD1USER+CMD1USERRF); ELSIF knob=9 THEN toggcfg(fCLICKSYM,"b","AC+CFGHEARD+XY" +CMD1USER+CMD1USERRF); ELSIF knob=10 THEN toggcfg(fCLICKSYM,"s","AC+CFGHEARD+XY"+CMD1USER+CMD1USERRF); ELSIF knob=11 THEN toggcfg(fCLICKSYM,"n","AC+CFGHEARD+XY"+CMD1USER+CMD1USERRF); ELSIF knob=12 THEN icfg(fCLICKSYM, ""); END; symbolonoff(menu, SYMCLICK, fCLICKSYM); refresh:=TRUE; ELSIF c=TEXTCLICK THEN IF knob=1 THEN toggcfg(fCLICKTEXT,"Y","AC"+CFGHEARD+"X" +CMD1USER+CMD1USERRF); ELSIF knob=2 THEN toggcfg(fCLICKTEXT,"X","AC"+CFGHEARD+"Y" +CMD1USER+CMD1USERRF); ELSIF knob=3 THEN toggcfg(fCLICKTEXT,"C","uA"+CFGHEARD+"XY" +CMD1USER+CMD1USERRF); ELSIF knob=4 THEN toggcfg(fCLICKTEXT,CFGRAWDECODED,"AC"); ELSIF knob=5 THEN toggcfg(fCLICKTEXT,"A",""); ELSIF knob=6 THEN toggcfg(fCLICKTEXT,CMD1USER,"AC"+CFGHEARD+"XY"+CMD1USERRF); ELSIF knob=7 THEN toggcfg(fCLICKTEXT,CMD1USERRF,"uAC"+CFGHEARD+"XY"+CMD1USER); ELSIF knob=8 THEN toggcfg(fCLICKTEXT,CFGHEARD,"uAC"+CFGHEARD+"XY"+CMD1USER+CMD1USERRF); ELSIF knob=9 THEN toggcfg(fCLICKTEXT,"b","AC"+CFGHEARD+"XY"+CMD1USER+CMD1USERRF); ELSIF knob=10 THEN toggcfg(fCLICKTEXT,"s","AC"+CFGHEARD+"XY"+CMD1USER+CMD1USERRF); ELSIF knob=11 THEN toggcfg(fCLICKTEXT,"n","AC"+CFGHEARD+"XY"+CMD1USER+CMD1USERRF); ELSIF knob=12 THEN icfg(fCLICKTEXT, ""); END; symbolonoff(menu, TEXTCLICK, fCLICKTEXT); refresh:=TRUE; ELSIF c=WXCLICK THEN (* IF knob=1 THEN wxraw(fCLICKWXSYM, "C"); ELSIF knob=2 THEN wxraw(fCLICKWXSYM, CMD1USER); ELSIF knob=3 THEN wxraw(fCLICKWXSYM, CMD1USERRF); ELSIF knob=4 THEN wxraw(fCLICKWXSYM, CFGHEARD); ELSIF knob=5 THEN wxraw(fCLICKWXSYM, "b"); *) IF knob=1 THEN wxraw(fCLICKWXSYM, CFGRAWDECODED); ELSIF knob=2 THEN toggwx(fCLICKWXSYM, wFINEDUST); ELSIF knob=3 THEN toggwx(fCLICKWXSYM, wSIEV); ELSIF knob=4 THEN toggwx(fCLICKWXSYM, wLUMI); ELSIF knob=5 THEN toggwx(fCLICKWXSYM, wRAIN); ELSIF knob=6 THEN toggwx(fCLICKWXSYM, wWINDDIR); ELSIF knob=7 THEN toggwx(fCLICKWXSYM, wWIND); ELSIF knob=8 THEN toggwx(fCLICKWXSYM, wHYG); ELSIF knob=9 THEN toggwx(fCLICKWXSYM, wBARO); ELSIF knob=10 THEN toggwx(fCLICKWXSYM, wTEMP); ELSIF knob=11 THEN icfg(fCLICKWXSYM, ""); END; wxonoff(menu); refresh:=TRUE; ELSIF c=HOVERCLICK THEN IF knob=1 THEN wxraw(fHOVERSET, CFGRAWDECODED); ELSIF knob=2 THEN toggwx(fHOVERSET, wFINEDUST); ELSIF knob=3 THEN toggwx(fHOVERSET, wSIEV); ELSIF knob=4 THEN toggwx(fHOVERSET, wLUMI); ELSIF knob=5 THEN toggwx(fHOVERSET, wRAIN); ELSIF knob=6 THEN toggwx(fHOVERSET, wWINDDIR); ELSIF knob=7 THEN toggwx(fHOVERSET, wWIND); ELSIF knob=8 THEN toggwx(fHOVERSET, wHYG); ELSIF knob=9 THEN toggwx(fHOVERSET, wBARO); ELSIF knob=10 THEN toggwx(fHOVERSET, wTEMP); ELSIF knob=11 THEN icfg(fHOVERSET, ""); END; hoveronoff(menu); refresh:=TRUE; ELSIF c=TRACKCLICK THEN IF knob=1 THEN toggcfg(fCLICKTRACK,CMDDELWAYPOINT,"A"+CMD1USERRF); ELSIF knob=2 THEN toggcfg(fCLICKTRACK,"n",CMDDELWAYPOINT+"A"+CMD1USERRF); ELSIF knob=3 THEN toggcfg(fCLICKTRACK,"s",CMDDELWAYPOINT+"A"+CMD1USERRF); ELSIF knob=4 THEN toggcfg(fCLICKTRACK,"A","bsun"+CMDDELWAYPOINT+CMD1USERRF); ELSIF knob=5 THEN toggcfg(fCLICKTRACK,CMD1USER,CMDDELWAYPOINT+CMD1USERRF); ELSIF knob=6 THEN toggcfg(fCLICKTRACK,CMD1USERRF,CFGRAWDECODED+CMDDELWAYPOINT+CMD1USER); ELSIF knob=7 THEN toggcfg(fCLICKTRACK,"b",CMDDELWAYPOINT+"A"+CMD1USERRF); ELSIF knob=8 THEN toggcfg(fCLICKTRACK,CFGRAWDECODED,CMDDELWAYPOINT+"A"+CMD1USERRF); ELSIF knob=9 THEN icfg(fCLICKTRACK, ""); END; -- killallmenus; trackonoff(menu, TRACKCLICK, fCLICKTRACK); refresh:=TRUE; ELSIF c=ADDWATCH THEN op2watch(TRUE); updatemenus; ELSIF c=DELWATCH THEN op2watch(FALSE); updatemenus; ELSIF c=CURSDEL THEN (*killallmenus;*) deletop; click.cmd:=" "; updatemenus; refresh:=TRUE; ELSIF c=TOOLBAR THEN killallmenus; refresh:=TRUE; IF subknob=0 THEN filemenu ELSIF subknob=1 THEN configmenu2 ELSIF subknob=2 THEN click.entries:=0; click.selected:=0; mainpop; ELSIF subknob=3 THEN toolsmenu ELSIF subknob=4 THEN helpmenu END; ELSIF c=TOOLOFF THEN lums.headmenuy:=FALSE; killallmenus; refresh:=TRUE; ELSIF c=TOOLON THEN lums.headmenuy:=TRUE; killallmenus; refresh:=TRUE; ELSIF (c=FILEMENU) & lums.headmenuy THEN filemenu; refresh:=TRUE; ELSIF (c=HELPMENU) & lums.headmenuy THEN helpmenu; refresh:=TRUE; ELSIF c=CONFSYM THEN setsym(knob, subknob, fMYSYM, menu, c); ELSIF c=CONFBSYM THEN setsym(knob, subknob, fRBSYMB, menu, c); ELSIF c=CHOOSEONESYM THEN setsym(knob, subknob, fONESYMB, menu, c); rdonesymb(TRUE, FALSE); -- click.onesymbol.tab:=0C; (* redraw *) -- click.cmd:="s"; click.cmd:=" "; ELSIF c=CONFONESYM THEN IF subknob=0 THEN click.cmd:="s" END; ELSIF c=CHOOSECONFPOISYM THEN setpoisym(poinameline, knob, subknob); ELSIF c=CONFPOISYM THEN IF knob-1<=HIGH(poifiles) THEN poifiles[knob-1].on:=NOT poifiles[knob-1].on; updatemenus; END; ELSIF c=CONFPOISYMFIND THEN click.cmd:=CONFPOISYMFIND; ELSIF c=CMDRELOADMAP THEN reloadmap:=TRUE; click.cmd:=" "; ELSIF c=CMDMAPCHOOSE THEN IF knob=1 THEN click.cmd:="7"; ELSIF knob=2 THEN click.cmd:="8"; ELSIF knob=3 THEN click.cmd:="9"; -- ELSIF knob=4 THEN click.cmd:="6"; ELSE Setmap(knob-1); click.cmd:=" "; END; ELSIF c=DOWNLOADMAP THEN killmenus(menu^.next); menu^.next:=NIL; downloadmenu; refresh:=TRUE; ELSIF c=STOPDOWNLOAD THEN mappack.run:=FALSE; textautosize(0, 0, 6, 0, "b", "Download Stopped"); refresh:=TRUE; click.cmd:=" "; ELSIF c=CMDSTARTDOWNLOAD THEN mappack.zoom:=0; mappack.donecnt:=0; mappack.run:=TRUE; textautosize(0, 0, 6, 0, "b", "Download Start"); refresh:=TRUE; click.cmd:=" "; ELSIF c=MSGOK THEN click.cmd:=" "; IF subknob=0 THEN nextmsg:=0; killmenuid(MSGPOPID); ELSIF subknob=1 THEN nextmsg:=ABS(nextmsg)+1; killmenuid(MSGPOPID); ELSIF subknob=2 THEN killmenuid(MSGPOPID); reply; ELSIF subknob=3 THEN delmsgfifo; ELSIF subknob=4 THEN zoomtoitem(ABS(nextmsg)) END; refresh:=TRUE; ELSIF c=CMDSTATUS THEN IF Shift THEN killallmenus; IF subknob=0 THEN onlinesetup(ONLINESETUPURL, 0); ELSIF subknob<=4 THEN dorfcfg(RFCFGRFPORTS+1-subknob, 1); -- maincfg(8, TRUE) ELSIF subknob=6 THEN sndmsg:=TRUE; ELSIF subknob=7 THEN maincfg(MAPMOVLINE, TRUE) END; ELSE IF subknob=0 THEN configtogg(fCONNECT); updatemenus; ELSIF subknob=1 THEN configtogg(fUDP1); ELSIF subknob=2 THEN configtogg(fUDP2); ELSIF subknob=3 THEN configtogg(fUDP3); ELSIF subknob=4 THEN configtogg(fUDP4); ELSIF subknob=5 THEN IF lums.logmode THEN click.cmd:=CMDRDLOG; click.cmdatt:=6C; ELSE click.cmd:=CMDFOLLOW END; ELSIF subknob=6 THEN IF nextmsg=0 THEN nextmsg:=1 END; click.cmd:=" "; ELSIF subknob=7 THEN IF configon(fGETMAPS)=configon(fALLOWEXP) THEN expandtogg; click.cmd:=" "; ELSE maploadtogg END; ELSIF subknob=8 THEN configtogg(fTRACKFILT); click.cmd:=" "; ELSIF subknob=9 THEN click.cmd:="O"; ELSIF subknob=10 THEN lums.wxcol:=0C; click.withradio:=FALSE; click.cmd:="0"; END; END; refresh:=TRUE; ELSIF c=CMDSENDMSG THEN IF knob=1 THEN IF subknob=0 THEN makemsg(TRUE); ELSIF subknob=1 THEN makemsg(FALSE); ELSE sndmsg:=FALSE END; killmenuid(SENDMSGID); ELSIF knob=4 THEN setmsgport(subknob); END; refresh:=TRUE; ELSIF c=CMDDOMSG THEN deltxmsg(knob, menu^.scroll); killallmenus; refresh:=TRUE; ELSIF c=CMDCONFDELMAN THEN configdelman(VAL(CONFSET, configedit), knob, menu^.scroll); ELSIF c=CMDMANFILT THEN callfiltsetup(knob); ELSIF c=CMDRF THEN dorfcfg(knob, subknob); ELSIF c=CMDMSG THEN domsgcfg(knob); ELSIF c=CMDDOTIMERS THEN dotimers(knob); ELSIF c=CMDDOMAP THEN domap(knob, subknob); ELSIF c=CMDMAPDIR THEN mapdir; ELSIF c=CMDDOBEEP THEN docfgbeep(knob, subknob); ELSIF c=CMDDOMOVE THEN domapmove(knob, subknob); ELSIF c=CMDGEOPROFIL THEN (* IF subknob=0 THEN configtogg(fGEOPROFIL) ELSE configs[fEDITLINE].title:="Ant1[m] Ant2[m] Wavelen[mm]"; configs[fEDITLINE].width:=CONFIGWIDTH; configedit:=ORD(fGEOPROFIL); END; copytoed; updatemenus; *) configtogg(fGEOPROFIL); updatemenus; click.cmd:=" "; refresh:=TRUE; ELSIF c=CMDMAINCFG THEN IF knob=1 THEN IF subknob=0 THEN configtogg(fAUTOSAVE); updatemenus; ELSE saveconfig END; ELSIF knob=2 THEN loadconfig(TRUE); configedit:=0; ELSIF knob=3 THEN watchcallsetup; END; refresh:=TRUE; ELSIF c=CMDONLINE THEN onlinesetup(knob, subknob); ELSIF c=CMDFILE THEN filesetup(knob, subknob); ELSIF c=CMDCONFIG THEN configedit:=knob; refresh:=TRUE; ELSIF c=CMDCONFIGMAN THEN configman(subknob, click.cmd); ELSIF c=CMDSAVETRACK THEN savetrack; ELSIF c=CMDCOMPOMSG THEN sndmsg:=TRUE; refresh:=TRUE; ELSIF c=LISTINGS THEN IF knob=8 THEN startlist("Objects", click.mhop);listtyps("O", subknob=1, click.mhop); ELSIF knob=7 THEN startlist("Wx Stations", 0C); listtyps("W", subknob=1, click.mhop); ELSIF knob=6 THEN startlist("Moving Stations", 0C); listtyps("D", subknob=1, click.mhop); ELSIF knob=5 THEN startlist("No Position", 0C); listtyps("N", subknob=1, click.mhop); ELSIF knob=4 THEN IF subknob>=5 THEN startmon(TRUE) ELSE monconfig(subknob) END; ELSIF knob=3 THEN startlist("Messages", click.mhop); listtyps("M", FALSE, click.mhop); ELSIF knob=2 THEN startlist("Bulletins", click.mhop); listtyps("B", FALSE, click.mhop); ELSIF knob=1 THEN click.cmd:=CMDINTERNSTAT; END; ELSIF c=LISTDEBUG THEN startlist("Lines", 0C); listop(subknob=1); ELSIF c=LISTUSERMSGS THEN listusermsg; ELSIF c=SETMARKERS THEN setmarks(subknob=0, FALSE); click.cmd:=" "; ELSIF c=SETMARKERSMAP THEN IF subknob=0 THEN setmarks(TRUE, TRUE); ELSIF subknob=3 THEN setmarks(FALSE, TRUE); ELSIF subknob=1 THEN posinval(click.markpos); click.waysum:=0.0; posinval(click.squerpos0); posinval(click.squerspos0); ELSE posinval(click.measurepos) END; click.cmd:=" "; ELSIF c=CMDMAPADD THEN mapadd; ELSIF c=CMDHELPTEXT THEN IF knob=1 THEN startcheckvers ELSE helptext(0, 0, 0, 0, "index") END; ELSIF c=CMDDOHELP THEN helptext(knob, subknob, potx, poty, ""); ELSIF c=CMDADDBEACON THEN managebeacon(menu^.scroll, knob, subknob, FALSE); ELSIF c=CMDDOBEACON THEN dobeacon(menu^.scroll, knob); ELSIF c=CMDDIGILINE THEN dodigi(menu^.scroll, knob, subknob, 0); ELSIF c=CMDDIGIED THEN dodigi(menu^.scroll, knob, subknob, 1); ELSIF c=CMDWATCHDO THEN watchdo(knob, subknob); ELSIF c=CMDCOLOURCLICK THEN setcolour(menu^.scroll, potx, poty); click.cmd:=" "; ELSIF c=CMDCOLOURS THEN colouredit(knob, subknob); ELSIF c=CMDCOLOURSGEO THEN coloureditgeo(knob, subknob); ELSIF c=CMDCLONE THEN (*killallmenus;*) importbeacon; ELSIF c=CMDPOLIGON THEN IF subknob=0 THEN click.insreplaceline:=NOT click.insreplaceline; poligonmenu; ELSE modmultiline(subknob) END; END; END; END mouseleft; PROCEDURE keychar(ch:CHAR; ispasted, movecmd:BOOLEAN); BEGIN -- IF movecmd THEN click.cmd:=ch; RETURN END; killbubble; closehint; IF ch=CURSESC THEN escmenus END; kbtomenu(ch); --WrInt(ORD(ch),1);WrStrLn(":menu"); IF ch<>0C THEN clampedline:=0 END; IF ispasted THEN ch:=0C END; (* not pasted text as shortcuts *) --WrInt(ORD(ch), 1); WrStrLn("kbd"); IF ch="R" THEN click.cmd:=CMDRADIORANGE ELSIF ch=CMDRADIORANGE THEN ch:=0C ELSIF ch=CMDENTEROK THEN configman(0, click.cmd) ELSIF ch="r" THEN (* toggle radio path *) configtogg(fGEOPROFIL); sayonoff("Geoprofile", configon(fGEOPROFIL)); click.cmd:=" "; refresh:=TRUE; -- ELSIF (ch<>"b") & (ch<>"m") & (ch<>"f") & (ch<>"u") & (ch<>"d") & (ch<>"p") -- & (ch<>"s") & (ch<>"h") THEN click.cmd:=CAP(ch) ELSE click.cmd:=ch END; ELSIF ch="X" THEN click.cmd:=CMDSETMARK1LOCK; ELSIF ch="Y" THEN click.cmd:=CMDSETMARK2LOCK; ELSIF NOT IsInStr("bcdfhlmpsu", ch) THEN click.cmd:=CAP(ch) ELSE click.cmd:=ch END; IF (click.cmd=">") OR (click.cmd="<") THEN IF click.entries>0 THEN killallmenus; textinfo(ORD(click.cmd="<"), TRUE); click.dryrun:=FALSE; images(click.table[click.selected].opf, 0C, click.graphset*sWXSET{wSHIST, wAHIST}); refresh:=TRUE; END; ELSIF click.cmd=CURSDEL THEN IF beaconediting & beaconed & ismultiline(TRUE) THEN modmultiline(MULTILINEDEL) ELSE deletop END; click.cmd:=" "; refresh:=TRUE; ELSIF (click.cmd=CURSINS) & beaconediting & beaconed THEN click.insreplaceline:=NOT click.insreplaceline; ELSIF click.cmd="B" THEN IF beaconediting THEN beaconediting:=FALSE; killmenuid(BEACONEDITID); (* Close beacon *) ELSE dorfcfg(BEACONEDI, 0) END; (* open beacon editor *) ELSIF click.cmd="D" THEN IF digied THEN digied:=FALSE; killmenuid(DIGIEDITID); ELSE dorfcfg(DIGIEDI, 0) END; ELSIF click.cmd="M" THEN IF sndmsg THEN sndmsg:=FALSE; killmenuid(SENDMSGID) ELSE sndmsg:=TRUE END; refresh:=TRUE; click.cmd:=" "; ELSIF (click.cmd="F") OR (click.cmd=CHR(ORD("F")-64)) THEN findopl(0); ELSIF click.cmd="C" THEN showpoicategory(FALSE); ELSIF click.cmd="u" THEN IF listwin<>"M" THEN startmon(TRUE) ELSE closelist END; ELSIF click.cmd="P" THEN IF panowin.on THEN closepano ELSE startpano END; ELSIF click.cmd="d" THEN maploadtogg; ELSIF click.cmd="p" THEN domap(TOGGMOUSESHOW, 0); (* toggle show loc of mouse *) ELSIF click.cmd="T" THEN domap(TIMESTAMP, 0); (* toggle timestamp *) ELSIF click.cmd=FOTOFN THEN fotofn; ELSIF click.cmd=DIRECTCONF THEN DirectConf; ELSIF click.cmd=DODIRECTCONF THEN DoDirectConf; END; END keychar; PROCEDURE getstartxysize(VAR newx, newy:INTEGER); BEGIN newx:=conf2int(fXYSIZE, 0, MINXSIZE, MAXXSIZE, DEFAULTXSIZE); newy:=conf2int(fXYSIZE, 1, MINYSIZE, MAXYSIZE, DEFAULTYSIZE); END getstartxysize; PROCEDURE resizewin(newx, newy:INTEGER; f11:BOOLEAN); BEGIN IF f11 THEN IF maximized THEN getstartxysize(newx, newy); (* maximized off *) maximized:=FALSE; ELSE maximized:=TRUE END; END; IF (redrawimg=NIL) OR ((VAL(INTEGER, mainxs())<>newx) OR (VAL(INTEGER, mainys())<>newy)) THEN newxsize:=newx; newysize:=newy; IF newxsizeMAXXSIZE THEN newxsize:=MAXXSIZE END; IF newysizeMAXYSIZE THEN newysize:=MAXYSIZE END; IF f11 THEN setxwinsize(newxsize, newysize) END; END; --WrInt(newxsize, 10); WrInt(newysize, 10); WrStrLn(" newxy1"); -- refresh:=TRUE; -- redrawpop(redrawimg); END resizewin; PROCEDURE refreshwin; BEGIN redraw(redrawimg) END refreshwin; PROCEDURE copypastelist; PROCEDURE cpbytes(bi:pLISTLINE; test:BOOLEAN; VAR cnt:CARDINAL); VAR i, j, start, end:CARDINAL; BEGIN WHILE bi<>NIL DO end:=bi^.endcp; i:=0; j:=end; WHILE (i=CHR(MAXCHAR) THEN INC(end) END; INC(i); END; start:=bi^.startcp; i:=0; j:=start; WHILE (i=CHR(MAXCHAR) THEN INC(start) END; INC(i); END; --WrInt(bi^.startcp, 6);WrInt(bi^.endcp, 6); WrInt(start, 6); WrInt(end, 6); WrInt(cnt, 6); WrStrLn(""); IF end>0 THEN IF bi^.text[end]=0C THEN (* new line *) IF test THEN INC(cnt) ELSE DEC(cnt); cutbuffer.text^[cnt]:=LF; END; END; WHILE end>start DO DEC(end); IF bi^.text[end]NIL THEN len:=0; cpbytes(bb, TRUE, len); IF len>0 THEN alloccutbuf(len); cpbytes(bb, FALSE, len); cutpaste; END; END; END; END copypastelist; PROCEDURE pulloff; BEGIN pullmenuwid:=0; sethand(cOFF); pulling:=FALSE; copypastelist; END pulloff; PROCEDURE limmouse(VAR x, y:INTEGER); BEGIN IF x<0 THEN x:=0 ELSIF x>VAL(INTEGER, mainxs()) THEN x:=VAL(INTEGER, mainxs()) END; IF y<0 THEN y:=0 ELSIF y>VAL(INTEGER, mainys()) THEN y:=VAL(INTEGER, mainys()) END; END limmouse; PROCEDURE startpull(x, y:INTEGER; middlbutt:BOOLEAN); VAR pm:pMENU; knob, subknob, posx, posy:CARDINAL; BEGIN killbubble; whichmenu(x, y, pm, knob, subknob, posx, posy); IF (pm<>NIL) & (ORD(pm^.pullconf)>0) & ((middlbutt OR (posy<=pm^.pullyknob))) THEN saveXYtocfg(pm^.pullconf, pm^.nowx, pm^.nowy); pullmenuwid:=pm^.wid; pullmenux:=x; pullmenuy:=y; pullmenuwhat:=WhatPull(pm, posx, posy); END; -- findpullmenu(x, y); IF (pm=NIL) OR middlbutt & (pullmenuwid=0) THEN pullmap(x, y, click.x, TRUE); (* start pulling *) ELSIF pullmenuwid<>0 THEN (*sethand(cPULL4);*) pulling:=TRUE END; END startpull; PROCEDURE setzoom(x1, y1:INTEGER); BEGIN click.zoomtox:=x1; click.zoomtoy:=y1; zooming:=TRUE; click.cmd:=" "; (* start makeimage *) END setzoom; PROCEDURE setclick(x, y:INTEGER); BEGIN limmouse(x, y); click.x:=x; click.y:=VAL(INTEGER, mainys())-y; END setclick; PROCEDURE mouseleftdown(x, y:INTEGER); BEGIN setclick(x, y); IF pulling THEN pulloff END; leftbutton:=TRUE; zooming:=FALSE; IF (clampedline<>0) & hilitemenu(x, y, 0C, NIL) THEN refresh:=TRUE END; END mouseleftdown; PROCEDURE mousemiddle(x, y:INTEGER); BEGIN clampedline:=0; limmouse(x, y); startpull(x, y, TRUE); END mousemiddle; PROCEDURE mouserightdown(x, y:INTEGER); BEGIN setclick(x, y); IF pulling THEN pulloff END; rightbutton:=TRUE; refresh:=TRUE; END mouserightdown; PROCEDURE mousemove(x, y:INTEGER); VAR mvd:INTEGER; BEGIN limmouse(x, y); IF NOT pulling THEN sethand(cOFF) END; IF pulling THEN (* goon pulling *) IF pullmenuwid<>0 THEN Pullmenu(pullmenuwid, x-pullmenux, y-pullmenuy); pullmenux:=x; pullmenuy:=y; ELSE pullmap(x, y, click.x, FALSE); click.cmd:=" "; (* start makeimage *) END; ELSIF zooming THEN setzoom(x, VAL(INTEGER, mainys())-y); ELSIF leftbutton OR rightbutton THEN IF Shift OR rightbutton THEN mvd:=STARTPULLZOOM ELSIF leftbutton THEN mvd:=STARTPULLMOVE END; IF (ABS(x-click.x)>mvd) OR (ABS(VAL(INTEGER, mainys())-y-click.y)>mvd) THEN (* moved a little *) IF Shift OR rightbutton THEN setzoom(x, VAL(INTEGER, mainys())-y); ELSIF leftbutton THEN startpull(click.x, VAL(INTEGER, mainys())-click.y, FALSE) END; END; ELSE (* move only *) xmouse.x:=x; xmouse.y:=y; IF hintmouse.x=0 THEN hintmouse:=xmouse END; (* from tooltipps *) IF ABS(hintmouse.x-xmouse.x)+ABS(hintmouse.y-xmouse.y)>HINTJITTER THEN closehint END; IF (clampedline=0) & hilitemenu(x, y, 0C, NIL) THEN refresh:=TRUE END; IF (hinttime<>realtime) & configon(fMOUSELOC) THEN mouseshowcnt:=1 END; tracenew.winevent:=1; END; END mousemove; PROCEDURE mouserelease; BEGIN IF pulling THEN pulloff; ELSIF zooming THEN click.cmd:=CMDZOOMSQUARE; ELSIF leftbutton THEN mouseleft(click.x, VAL(INTEGER, mainys())-click.y); ELSIF rightbutton THEN killbubble; IF FindClampMenu()<>NIL THEN paste ELSE click.cmd:=CURSBS END; (* right button release: paste or back in history *) END; killbubble; leftbutton:=FALSE; rightbutton:=FALSE; zooming:=FALSE; pullmenuwid:=0; END mouserelease; PROCEDURE showexitcode(name:ARRAY OF CHAR; c:INTEGER); VAR s,h:ARRAY[0..99] OF CHAR; BEGIN c:=c DIV 256; Assign(s, name); IntToStr(c, 1, h); Append(s, h); -- IF (c=255) OR (c=9) THEN Append(s, " (no executable file found)") END; say(s, 6, "e"); END showexitcode; PROCEDURE checkserial(VAR pid:PROCESSHANDLE; cfg:CONFSET); BEGIN IF pid.runs THEN CheckProg(pid); IF NOT pid.runs THEN showexitcode("Serial Interface exits with ", pid.exitcode); configbool(cfg, FALSE); updatemenus; ELSIF NOT configon(cfg) THEN StopProg(pid) END; END; END checkserial; PROCEDURE timerevent; VAR h,s:ARRAY[0..200] OF CHAR; BEGIN IF mouseshowcnt>0 THEN DEC(mouseshowcnt); IF mouseshowcnt=0 THEN mouseshow(xmouse.x, xmouse.y); refresh:=TRUE; END; END; tcpjobs; printhint; MapPackageJob(FALSE); IF maploadpid.runs THEN CheckProg(maploadpid); IF NOT maploadpid.runs THEN refresh:=TRUE; IF maploadpid.exitcode<>0 THEN confstr(fGETMAPS, s); (* maploader program name *) h:="Maploader ("; Append(h,s); Append(h,") exits with "); showexitcode(h, maploadpid.exitcode); END; END; END; checkserial(serialpid, fSERIALTASK); checkserial(serialpid2, fSERIALTASK2); IF refresh THEN refreshwin END; END timerevent; PROCEDURE wrheap; BEGIN WrStr("heapusage screenbuf:"); WrInt(debugmem.screens, 1); WrStr(" mondata:"); WrInt(debugmem.mon, 1); WrStr(" menus:"); WrInt(debugmem.menus, 1); WrStr(" requested:"); WrInt(debugmem.req, 1); debugmem.req:=0; WrLn; END wrheap; PROCEDURE initmenus; BEGIN overtype:=FALSE; redrawimg:=NIL; listwin:=0C; FILL(ADR(listbuffer), 0C, SIZE(listbuffer)); FILL(ADR(monbuffer), 0C, SIZE(monbuffer)); msgfifo:=NIL; click.graphset:=sWXSET{}; -- cornermenu:=NIL; menus:=NIL; -- actmenu:=NIL; hinttime:=0; mouseshowcnt:=0; -- locpop:=NIL; -- hintcnt:=0; -- keybfocus:=NIL; -- autoclick:=0C; -- menucnt:=0; panoimage:=NIL; poioff:=FALSE; lums.headmenuy:=TRUE; pulling:=FALSE; zooming:=FALSE; leftbutton:=FALSE; rightbutton:=FALSE; sndmsg:=FALSE; panowin.on:=FALSE; beaconed:=FALSE; digied:=FALSE; configedit:=0; beaconediting:=FALSE; dellog:=0; pullmenuwid:=0; clampedline:=0; hoveropen:=FALSE; -- clampedline:=0; -- FILL(ADR(menupullpos), 0C, SIZE(menupullpos)); checkversion.runs:=FALSE; Setmap(0); END initmenus; END useri.