home *** CD-ROM | disk | FTP | other *** search
- /* $VER: FinalWaver 1.02 (10.02.95) by NDY's */
-
- /* Main [1.0] */
- OPTIONS RESULTS
- SIGNAL ON ERROR
- SIGNAL ON SYNTAX
- CALL init
- CALL locale
- CALL chosenobjs
- CALL options
- CALL point
- IF txt>0 THEN
- CALL textblock
- ELSE
- CALL bodytext
- CALL wave
- CALL group
- CALL bye
-
- PROC init: /* Initialization [1.02] */
- /* Vars needed by "bye" / "ERROR" */
- errtext='"%t" "(#%n) in line %l" "" "Ok" "" ""'
- objs=0
- deci=""
- et=""
- /* Open library */
- library="rexxmathlib.library"
- lib=Show("l",library)
- IF ~lib THEN lib=AddLib(library,0,-30,0)
- IF ~lib | test=1 THEN
- DO
- ShowMessage 1 1 replacepat(nolib,"%y",library)
- CALL bye(14)
- END
- clip="FWaver.def"
- default=GetClip(clip)
- spc=0.2 /* Space factor */
- RETURN
- PROC locale: /* Language specific strings [1.01] */
- test=0 /* test 1/2/3/6/10/20/100/200 with new languages, 0 = no test */
- lang=getlanguage()
- info='FinalWaver 1.01 by NDY''s'
- /* IF default='' THEN default='(put your defaults here and uncomment this line)' */
- IF lang="deutsch" THEN /* German */
- DO
- errtext='"FinalWaver-Fehler:" "%t" "in Zeile %l (Fehlernummer %n)" "Ok" "" ""'
- input='"%i" "Wellen und Höhe eingeben (? für Hilfe)" "%d"'
- help.0='"Syntax (Argumente optional): [Wn] [A±n|An] [?]" "W: Anzahl Sinuswellen. Voreinstellung: 1" "A: Amplidude, - spiegelt die Welle. Voreinst.: 1"'
- helpbutton='"Letzte Seite" "Zurück" "Nächste Seite"'
- helppages=1
- fwerrtext.10='Befehl gescheitert'
- fwerrtext.20='Ungültige Argumente'
- fwerrtext.100='Befehl unbekannt'
- fwerrtext.200='Kann fwarexx.library nicht öffnen'
- nolib='"FinalWaver-Fehler:" "Konnte ''%y'' nicht öffnen!" "" "Ok" "" ""'
- END
- ELSE /* Default: English */
- DO
- errtext='"FinalWaver failed:" "%t" "in line %l (errornumber %n)" "Ok" "" ""'
- input='"%i" "Enter waves and height (? for help)" "%d"'
- help.0='"Syntax (arguments optional): [Wn] [A±n|An] [?]" "W: Number of sinewaves. Default: 1" "A: Amplitude, - flips the wave. Default: 1"'
- helpbutton='"Previous" "Back" "Next"'
- helppages=1
- fwerrtext.10='Instruction failed'
- fwerrtext.20='Invalid arguments'
- fwerrtext.100='Unknown instruction'
- fwerrtext.200='Couldn''t open fwarexx.library'
- nolib='"FinalWaver failed:" "Couldn''t open ''%y''" "" "Ok" "" ""'
- END
- input=replacepat(input,"%i",info)
- IF test>5 THEN
- DO
- RC=test
- IF test=6 THEN SIGNAL SYNTAX
- SIGNAL ERROR
- END
- RETURN
- PROC chosenobjs: /* Selected objects [1.0] */
- /* Selected objects */
- txt=0
- oval=0
- len=0
- FirstObject "SELECTED"
- o=RESULT
- IF o~=0 THEN
- DO
- cnt=0
- DO UNTIL o=0
- obj.cnt=o
- NextObject o "SELECTED"
- o=RESULT
- cnt=cnt+1
- END
- /* Search textblock */
- DO i=0 TO cnt-1 WHILE txt=0
- GetObjectType obj.i
- IF RESULT=7 THEN txt=obj.i
- END
- END
- /* Selected text */
- IF txt=0 THEN
- DO
- Status "PARAPOS"
- pos=RESULT
- IF Words(pos)=4 THEN
- DO
- Extract
- text=RESULT
- MoveToPara Word(pos,1) Word(pos,2)
- len=Length(text)
- END
- ELSE
- DO
- MoveToPara Word(pos,1) 0
- Status "PARACHARS"
- len=RESULT
- text=""
- END
- END
- IF len=0 & txt=0 THEN CALL bye(0)
- RETURN
- PROC options: /* Input [1.0] */
- about=0
- DO UNTIL about=-1 & test~=3
- RequestText replacepat(input,"%d",default)
- /* Help */
- IF Pos("?",RESULT)>0 | test=3 THEN
- DO
- default=replacepat(RESULT,"?","")
- about=0
- DO UNTIL RESULT=2
- ShowMessage 2 0 help.about helpbutton
- about=(about+RESULT-2+helppages)//helppages
- END
- END
- ELSE
- about=-1
- END
- RESULT=replacepat(RESULT,",",".")
- PARSE UPPER VAR RESULT "W" waves " ","A" amp " "
- CALL SetClip(clip,Upper(RESULT))
- /* Verify and set defaults (x||"0": ± -> ±0) */
- IF ~Datatype(waves,"N") | waves="" THEN waves=1
- waves=Max(waves,1)
- IF amp="-" THEN amp=-1
- IF ~Datatype(amp,"N") | amp="" THEN amp=1
- RETURN
- PROC point: /* Decimal point [1.0] */
- /* Use decimal point */
- GetDocItemPrefs "DECIMAL"
- deci=RESULT
- DocItemPrefs "DECIMAL PERIOD"
- RETURN
- PROC textblock: /* Process textblock [1.02] */
- spcs=0
- /* Examine textblock */
- GetTextBlockText txt
- text=RESULT
- text=rembad(text)
- len=Length(text)
- GetObjectTypeSpecs txt "SIZE LEADING WIDTH OBLIQUE POSITION CASE STYLE COLOR FONT"
- PARSE VAR RESULT size lead wid obl pos case st col font
- TextBlockTypePrefs "SIZE" size "LEADING" lead "WIDTH" wid "OBLIQUE" obl "POSITION" pos "CASE" case "STYLE" st "COLOR" col "FONT" font
- GetObjectCoords txt
- PARSE VAR RESULT page xx yy txtw h
- RETURN
- PROC bodytext: /* Process selected text [1.02] */
- /* Get page size */
- GetPageSetup "WIDTH HEIGHT"
- PARSE VAR RESULT w h
- Status 'PAGE "INSERT"'
- page=RESULT
- xx=w/2
- yy=h/2
- txtw=0
- /* Remove CR at the end */
- IF C2X(Right(text,1))="0A" THEN
- DO
- len=len-1
- text=Left(text,len)
- END
- text=rembad(text)
- /* Create textobjects */
- DO i=1 TO len
- IF text>"" THEN
- x=SubStr(text,i,1)
- ELSE
- DO
- Extract
- x=RESULT
- END
- Cursor "RIGHT"
- specs=gettexttypespecs()
- TextBlockTypePrefs specs
- IF Verify(x,'";= ',"M") THEN x='"'||x||'"'
- objs=objs+1
- DrawTextBlock page xx yy x
- obj.objs=RESULT
- Redraw
- /* Save size & number */
- GetObjectCoords obj.objs
- PARSE VAR RESULT x x x objw.objs objh.objs
- txtw=txtw+objw.objs
- END
- RETURN
- PROC wave: /* Wave it! [1.02] */
- PI=3.141593
- angstep=waves*2*PI/txtw
- wspc=txtw/len*spc
- txtw=txtw+wspc*(len-1)
- wdone=0
- f=0
- o=0
- nr=0
- DO n=1 TO len
- char=SubStr(text,n,1)
- IF txt>0 THEN
- DO
- /* Draw and get size */
- IF Verify(char,'";= ',"M") THEN char='"'||char||'"'
- objs=objs+1
- DrawTextBlock page xx yy char
- obj.objs=RESULT
- Redraw
- GetObjectCoords obj.objs
- cw=Word(RESULT,4)
- ch=h
- END
- ELSE
- DO
- /* Number and size saved before */
- nr=nr+1
- cw=objw.nr
- ch=objh.nr
- o=obj.nr
- END
- wdone=wdone+cw+wspc
- f=angstep*wdone
- x=xx+wdone-cw/2
- y=yy+amp*Sin(f)-ch/2
- /* Centre char on the oval */
- SetObjectCoords o page x y cw ch
- SetObjectRotation o Trunc(Atan(Cos(f))/PI*180+360)//360
- END
- RETURN
- PROC group: /* Group objects [1.0] */
- /* Group chars */
- SelectObject
- DO n=1 TO objs
- SelectObject obj.n "MULTIPLE"
- END
- Group
- objs=0
- Redraw
- RETURN
- PROC bye: /* CALL bye(returnvalue) You MUST use this instead of EXIT! [1.0] */
- PARSE ARG errnr
- /* Restore decimal delimitter */
- IF deci~="" THEN DocItemPrefs "DECIMAL" deci
- IF lib=1 THEN CALL RemLib(library)
- IF objs~=0 THEN
- DO n=1 TO objs
- DeleteObject obj.n
- END
- EXIT errnr
- RETURN
- PROC SYNTAX: /* SYNTAX & ERROR handling [1.0] */
- et=ErrorText(RC)
- ERROR:
- line=SIGL
- nr=RC
- IF et="" THEN et=fwerrtext.nr
- IF nr>5 THEN ShowMessage 1 1 replacepat(replacepat(replacepat(errtext,"%n",nr),"%l",line),"%t",et)
- CALL bye(nr)
- RETURN
- PROC rembad: PROCEDURE /* newstr=rembad(str) [1.0] */
- /* Replace unprintable characters by spaces */
- PARSE ARG t
- bad=XRange("00"x,"1F"x)||XRange("7F"x,"9F"x)
- i=Verify(t,bad,"m")
- l=Length(t)
- DO WHILE i>0
- t=Left(t,i-1) Right(t,l-i)
- i=Verify(t,bad,"m")
- END
- RETURN t
- PROC replacepat: PROCEDURE /* newstr=replacepat(str,pat,replc) [1.0] */
- /* Replace all occurences of a pattern in a string by another one */
- PARSE ARG str,pat,replc
- p=Pos(pat,str)
- DO WHILE p>0
- str=Left(str,p-1)||replc||SubStr(str,p+Length(pat))
- p=Pos(pat,str)
- END
- RETURN str
- PROC getlanguage: PROCEDURE /* language=getlanguage() [1.01] */
- /* Get preferred language */
- ok=Open(prefs,"ENV:Language","R")
- IF ok THEN
- DO
- language=ReadLn(prefs)
- CALL Close(prefs)
- END
- RETURN language
- PROC gettexttypespecs: PROCEDURE /* specs=gettexttypespecs() [1.0] */
- Status "FONTSIZE"
- p="SIZE" RESULT
- Status "FONTLEADING"
- p=p "LEADING" RESULT
- Status "FONTWIDTH"
- p=p "WIDTH" RESULT
- Status "FONTOBLIQUE"
- p=p "OBLIQUE" RESULT
- Status "FONTPOSITION"
- p=p "POSITION" RESULT
- Status "FONTCASE"
- p=p "CASE" RESULT
- Status "FONTSTYLE"
- p=p "STYLE" RESULT
- Status "FONTCOLOR"
- p=p "COLOR" RESULT
- Status "FONTNAME"
- p=p "FONT" RESULT
- RETURN p
- PROC dump: PROCEDURE /* CALL dump(var[,infostr]) [1.0] */
- /* Dump a variable, %v in infostring determines it's place (debug-only) */
- PARSE ARG v,info
- IF info="" THEN info="%v"
- ShowMessage 1 1 '"'||replacepat(info,"%v",v)||'" "" "" "Ok" "" ""'
- RETURN
-