[796] | 1 | TMGXGF ;SFISC/VYD - Graphics Functions ;11/06/2002 11:10
|
---|
| 2 | ;;8.0;KERNEL;**269**;5/5/07 by kt
|
---|
| 3 | ;
|
---|
| 4 | PREP ;prepair graphics environment
|
---|
| 5 | D PREP^XGSETUP
|
---|
| 6 | D CLRCLIP ;"//kt 5/5/07 added
|
---|
| 7 | Q
|
---|
| 8 | ;
|
---|
| 9 | ;
|
---|
| 10 | IOXY(R,C) ;cursor positioning R:row, C:col
|
---|
| 11 | D ADJRC
|
---|
| 12 | ;"//kt 5/6/07 modification.
|
---|
| 13 | ;"Although this XGF system allows for off-screen coordinates, the underlying
|
---|
| 14 | ;" M systems will not. So trying to position cursor to (-4,-5) MUST result
|
---|
| 15 | ;" in cursor being put at (0,0). This may be worked around by not depending
|
---|
| 16 | ;" on the current $X,$Y for writing etc. Instead, always specify coordinates.
|
---|
| 17 | S:R<0 R=0 ;"//kt
|
---|
| 18 | S:C<0 C=0 ;"//kt
|
---|
| 19 | d CLIOXY^TMGXGS(R,C,"")
|
---|
| 20 | S $Y=R,$X=C
|
---|
| 21 | Q
|
---|
| 22 | ;
|
---|
| 23 | ;
|
---|
| 24 | SAY(R,C,S,A) ;coordinate output instead of WRITE
|
---|
| 25 | D ADJRC
|
---|
| 26 | ;"//kt 5/6/07 mod. Clipping to occur in CLIOXY^TMGXGS()
|
---|
| 27 | ;"S:C+$L(S)>IOM S=$E(S,1,IOM-C) ;truncate if longer than screen
|
---|
| 28 | I $L($G(A)) S A=$$UP^XLFSTR(A) D SAY^TMGXGS(R,C,S,$S($$ATRSYNTX(A):A,1:"")) I 1
|
---|
| 29 | E D SAY^TMGXGS(R,C,S)
|
---|
| 30 | Q
|
---|
| 31 | ;
|
---|
| 32 | ;
|
---|
| 33 | VSAY(R,C,S,A) ;coordinate output instead of WRITE: Vertical write ;"//kt added 5/10/07
|
---|
| 34 | D ADJRC
|
---|
| 35 | I $L($G(A)) S A=$$UP^XLFSTR(A) D VSAY^TMGXGS(R,C,S,$S($$ATRSYNTX(A):A,1:"")) I 1
|
---|
| 36 | E D VSAY^TMGXGS(R,C,S)
|
---|
| 37 | Q
|
---|
| 38 | ;
|
---|
| 39 | ;
|
---|
| 40 | SAYU(R,C,S,A) ;coordinate output w/ underline instead of WRITE
|
---|
| 41 | D ADJRC
|
---|
| 42 | I $L($G(A)) S A=$$UP^XLFSTR(A) D SAYU^TMGXGS(R,C,S,$S($$ATRSYNTX(A):A,1:"")) I 1
|
---|
| 43 | E D SAYU^TMGXGS(R,C,S)
|
---|
| 44 | Q
|
---|
| 45 | ;
|
---|
| 46 | ;
|
---|
| 47 | ADJRC ;adjust row and column R and C are assumed to exist
|
---|
| 48 | S R=$S($G(R)="":$Y,1:R),C=$S($G(C)="":$X,1:C) ;use current coords if none are passed
|
---|
| 49 | ;"//kt 5/6/07 modified. NOTE: it seems that code was written to allow coords
|
---|
| 50 | ;" to be specified as relative to $X,$Y. E.g. SAY(+4,-2,'HELLO').
|
---|
| 51 | ;" I must remove this functionality so that I can allow specifying coordinates that
|
---|
| 52 | ;" are offscreen. Thus if the left-hand part of a window is a bit off the left
|
---|
| 53 | ;" side of the screen, then C will be -2 etc.
|
---|
| 54 | ;"S:"+-"[$E(R) R=$Y+$S(R="+":1,R="-":-1,1:R) ;increment/decrement
|
---|
| 55 | ;"S:"+-"[$E(C) C=$X+$S(C="+":1,C="-":-1,1:C)
|
---|
| 56 | ;"S R=$S(R<0:0,1:R\1),C=$S(C<0:0,1:C\1) ;make sure only pos int
|
---|
| 57 | ;"//kt modified line below
|
---|
| 58 | S R=R\1,C=C\1 ;"make sure only integer values (clipping will occur in CLIOXY())
|
---|
| 59 | Q
|
---|
| 60 | ;
|
---|
| 61 | ;
|
---|
| 62 | SETA(XGATR) ;set screen attribute(s) regardless of previous state
|
---|
| 63 | ;XGATR=1 char when converted to binary represents all new attr
|
---|
| 64 | N XGOLDX,XGOLDY
|
---|
| 65 | S XGOLDX=$X,XGOLDY=$Y ;save $X $Y
|
---|
| 66 | W $$SET^XGSA(XGATR)
|
---|
| 67 | S $X=XGOLDX,$Y=XGOLDY ;restore $X $Y
|
---|
| 68 | Q
|
---|
| 69 | ;
|
---|
| 70 | ;
|
---|
| 71 | CHGA(XGATR) ;change screen attribute(s) w/ respect to previous state
|
---|
| 72 | ;XGNEWATR=string of attr to change eg. "B0U1" or "E1"
|
---|
| 73 | N XGOLDX,XGOLDY,XGSYNTX,XGACODE,%
|
---|
| 74 | S XGATR=$$UP^XLFSTR(XGATR) ;make sure all attr codes are in upper case
|
---|
| 75 | D:$$ATRSYNTX(XGATR)
|
---|
| 76 | . S XGOLDX=$X,XGOLDY=$Y ;save $X $Y
|
---|
| 77 | . W $$CHG^XGSA(XGATR)
|
---|
| 78 | . S $X=XGOLDX,$Y=XGOLDY ;restore $X $Y
|
---|
| 79 | Q
|
---|
| 80 | ;
|
---|
| 81 | ;
|
---|
| 82 | ATRSYNTX(XGATR) ;check attribute code syntax
|
---|
| 83 | ;proper attr is 1 or more (char from {BIRGUE} concat w/ 1 or 0)
|
---|
| 84 | N XGSYNTX,%
|
---|
| 85 | S XGSYNTX=$S($L(XGATR)&($L(XGATR)#2=0):1,1:0) ;even # of chars
|
---|
| 86 | F %=1:2:$L(XGATR) S:"B1B0I1I0R1R0G1G0U1U0E1"'[$E(XGATR,%,%+1) XGSYNTX=0
|
---|
| 87 | Q XGSYNTX
|
---|
| 88 | ;
|
---|
| 89 | ;
|
---|
| 90 | RESTORE(S) ;restore screen region TOP,LEFT,BOTTOM,RIGHT,SAVE ROOT
|
---|
| 91 | D RESTORE^TMGXGSW(S) Q
|
---|
| 92 | K @S
|
---|
| 93 | ;
|
---|
| 94 | ;
|
---|
| 95 | SAVE(T,L,B,R,S) ;save screen region TOP,LEFT,BOTTOM,RIGHT,SAVE ROOT
|
---|
| 96 | D SAVE^TMGXGSW(T,L,B,R,S) Q
|
---|
| 97 | ;
|
---|
| 98 | ;
|
---|
| 99 | WIN(T,L,B,R,S) ;put up a window TOP,LEFT,BOTTOM,RIGHT[,SAVE ROOT]
|
---|
| 100 | ;window style is not yet implemented
|
---|
| 101 | I $L($G(S)) D WIN^TMGXGSW(T,L,B,R,S) I 1
|
---|
| 102 | E D WIN^TMGXGSW(T,L,B,R)
|
---|
| 103 | Q
|
---|
| 104 | ;
|
---|
| 105 | ;
|
---|
| 106 | FRAME(T,L,B,R) ;put a frame without clearing the inside TOP,LEFT,BOTTOM,RIGHT
|
---|
| 107 | D FRAME^TMGXSBOX(T,L,B,R) Q
|
---|
| 108 | ;
|
---|
| 109 | ;
|
---|
| 110 | CLEAR(T,L,B,R) ;clear screen portion TOP,LEFT,BOTTOM,RIGHT
|
---|
| 111 | D CLEAR^TMGXSBOX(T,L,B,R) Q
|
---|
| 112 | ;
|
---|
| 113 | ;
|
---|
| 114 | CLEAN ;clean up and destroy graphics environment
|
---|
| 115 | D CLEAN^XGSETUP Q
|
---|
| 116 | ;
|
---|
| 117 | ;
|
---|
| 118 | INITKB(XGTRM) ;initialize keyboard
|
---|
| 119 | ;turn escape processing on, turn on passed terminators (if any)
|
---|
| 120 | D INIT^XGKB($G(XGTRM)) Q
|
---|
| 121 | ;
|
---|
| 122 | ;
|
---|
| 123 | READ(XGCHARS,XGTO) ;read the keyboard
|
---|
| 124 | ;XGCHARS:number of chars to read, XGTO:timeout
|
---|
| 125 | ;"//kt 5/5/07 modified to allow putting characters back.
|
---|
| 126 | new TMGRESLT set TMGRESLT=""
|
---|
| 127 | if ($get(TMGWCBUF)="")&($get(TMGWXGRT)="") do
|
---|
| 128 | . set TMGRESLT=$$READ^XGKB($G(XGCHARS),$G(XGTO))
|
---|
| 129 | else do
|
---|
| 130 | . set TMGRESLT=$get(TMGWCBUF) set TMGWCBUF=""
|
---|
| 131 | . set XGRT=$get(TMGWXGRT) set TMGWXGRT=""
|
---|
| 132 | quit TMGRESLT
|
---|
| 133 | ;
|
---|
| 134 | ;
|
---|
| 135 | UNREAD(XGCHARS,XGRT) ;"//kt 5/5/07 added.
|
---|
| 136 | ;Purpose: to put characters back into read stream after a READ
|
---|
| 137 | ; Note: may only be called once before a subsequent READ, or will overwrite
|
---|
| 138 | ;Input: XGCHARS -- the character(s) to put back into stream
|
---|
| 139 | ; XGRT -- the command characters to put back into stream (i.e. XGRT)
|
---|
| 140 | set TMGWCBUF=XGCHARS
|
---|
| 141 | set TMGWXGRT=XGRT
|
---|
| 142 | quit
|
---|
| 143 | ;
|
---|
| 144 | ;
|
---|
| 145 | RESETKB ;reset keyboard(escape processing off, terminators off)
|
---|
| 146 | D EXIT^XGKB Q
|
---|
| 147 | ;
|
---|
| 148 | ;
|
---|
| 149 | SETCLIP(T,L,B,R) ;"//kt 5/5/07 added
|
---|
| 150 | ;Pupose: define a clipping area. XGF writes clipped to area
|
---|
| 151 | ;Input: TOP,LEFT,BOTTOM,ROGHT
|
---|
| 152 | set TMGCLT=+$get(T),TMGCLL=$get(L)
|
---|
| 153 | set TMGCLB=+$get(B),TMGCLR=$get(R)
|
---|
| 154 | quit
|
---|
| 155 | ;
|
---|
| 156 | ;
|
---|
| 157 | CLRCLIP ;"//kt 5/5/07 added
|
---|
| 158 | ;Pupose: clear clipping area.
|
---|
| 159 | set TMGCLT=0,TMGCLL=0
|
---|
| 160 | set TMGCLB=IOSL-1,TMGCLR=IOM-1
|
---|
| 161 | quit |
---|