| [796] | 1 | TMGWGOJ ;TMG/kst/OO Graphic Object ;04/18/07
 | 
|---|
 | 2 |          ;;1.0;TMG-LIB;**1**;04/18/07
 | 
|---|
 | 3 |  
 | 
|---|
 | 4 |  ;"Kevin Toppenberg MD
 | 
|---|
 | 5 |  ;"GNU General Public License (GPL) applies
 | 
|---|
 | 6 |  ;"------------------------------------------
 | 
|---|
 | 7 |  ;"Object oriented window object setup code below
 | 
|---|
 | 8 |  ;"------------------------------------------
 | 
|---|
 | 9 |  
 | 
|---|
 | 10 | Constructor(instanceName)  ;"Module MUST have 'Constructor' procedure
 | 
|---|
 | 11 |         ;"Purpose -- A constructor for object Window
 | 
|---|
 | 12 |         ;"Input: instanceName -- the NAME of the type of the object to be defined.
 | 
|---|
 | 13 |         ;"              This should be a variable (global or otherwise) of the object.
 | 
|---|
 | 14 |         ;"Note: This function should NOT be called directly, but instead is called
 | 
|---|
 | 15 |         ;"              via new^TMGOOL
 | 
|---|
 | 16 |         ;"Result: none <--- REQUIRED TO NOT RETURN A RESULT
 | 
|---|
 | 17 |  
 | 
|---|
 | 18 |         ;"Here we define the default values for vars and functions.
 | 
|---|
 | 19 |  
 | 
|---|
 | 20 |         ;"----------------All constructors should copy this format --------------------
 | 
|---|
 | 21 |         new TMGthis set TMGthis=instanceName
 | 
|---|
 | 22 |  
 | 
|---|
 | 23 |         ;"do inheritFrom^TMGOOL(instanceName,"TMGWSCR")
 | 
|---|
 | 24 |  
 | 
|---|
 | 25 |         ;"Examples of use: PROCEDURES/FUNCTIONS
 | 
|---|
 | 26 |         ;"Note: to evoke a procedure/function, use this format:
 | 
|---|
 | 27 |         ;"  do proc^TMGOOL(instanceName,"SET TOP",MyTopVar),!
 | 
|---|
 | 28 |         ;"  set MyTop=$$fn^TMGOOL(instanceName,"GET TOP")
 | 
|---|
 | 29 |  
 | 
|---|
 | 30 |         ;"---------------------------------------------------------
 | 
|---|
 | 31 |         ;"register PROCEDURES/FUNCTIONS
 | 
|---|
 | 32 |         do regFn^TMGOOL(TMGthis,"PAINT","Paint^TMGWGOJ()")
 | 
|---|
 | 33 |         do regFn^TMGOOL(TMGthis,"MOVE TO","MoveTo^TMGWGOJ(Top,Left)") ;"note parameter variables are placeholders
 | 
|---|
 | 34 |         do regFn^TMGOOL(TMGthis,"SET TLBR","setTLBR^TMGWGOJ(Top,Left,Bottom,Right)") ;"note parameter variables are placeholders
 | 
|---|
 | 35 |         do regFn^TMGOOL(TMGthis,"SET TLHW","setTLHW^TMGWGOJ(Top,Left,Height,Width)") ;"note parameter variables are placeholders
 | 
|---|
 | 36 |         do regFn^TMGOOL(TMGthis,"MOVE OBJ","MoveObj^TMGWGOJ(cmdKey)")
 | 
|---|
 | 37 |         do regFn^TMGOOL(TMGthis,"RESIZE OBJ","ResizeObj^TMGWGOJ(flags,cmdKey)")
 | 
|---|
 | 38 |         do regFn^TMGOOL(TMGthis,"CLIP TO PARENT","ClipToParent^TMGWGOJ(TMGthis)")
 | 
|---|
 | 39 |  
 | 
|---|
 | 40 |         do regFn^TMGOOL(TMGthis,"GET SCREEN","GetScrn^TMGWGOJ()")
 | 
|---|
 | 41 |         do regFn^TMGOOL(TMGthis,"ACCEPT CHILD","AcceptChild^TMGWGOJ(Child)")
 | 
|---|
 | 42 |         do regFn^TMGOOL(TMGthis,"SET FOCUSED","setFocused^TMGWGOJ(child)")
 | 
|---|
 | 43 |         do regFn^TMGOOL(TMGthis,"IS FOCUSED","IsFocused^TMGWGOJ(child)")
 | 
|---|
 | 44 |         do regFn^TMGOOL(TMGthis,"GET FOCUSED","getFocused^TMGWGOJ()")
 | 
|---|
 | 45 |         do regFn^TMGOOL(TMGthis,"UNFOCUS CURRENT FOCUSED","UnfocusCur^TMGWGOJ()")
 | 
|---|
 | 46 |         do regFn^TMGOOL(TMGthis,"FLUSH SCREEN SAVE","FlushScrnSave^TMGWGOJ()")
 | 
|---|
 | 47 |         do regFn^TMGOOL(TMGthis,"FLUSH MOUSE SAVE","FlushMouseBuffer^TMGWGOJ()")
 | 
|---|
 | 48 |         do regFn^TMGOOL(TMGthis,"CONTAINS COORDS","Contains^TMGWGOJ(LOC)")
 | 
|---|
 | 49 |         do regFn^TMGOOL(TMGthis,"GET CONTAINED","GetContained^TMGWGOJ(LOC)")
 | 
|---|
 | 50 |         do regFn^TMGOOL(TMGthis,"CONVERT TO FRAME","Conv2Frame^TMGWGOJ(LOC,TargetFrame)")
 | 
|---|
 | 51 |  
 | 
|---|
 | 52 |         ;"---------------------------------------------------------------------
 | 
|---|
 | 53 |         ;"Register Event Handlers
 | 
|---|
 | 54 |         do regEvent^TMGOOL(TMGthis,"MSG","HandleMsg^TMGWGOJ(cmdKey)")
 | 
|---|
 | 55 |         do regEvent^TMGOOL(TMGthis,"ALPHA KEY","HandleAlpha^TMGWGOJ(key)")
 | 
|---|
 | 56 |         do regEvent^TMGOOL(TMGthis,"CLICK","HandleClick^TMGWGOJ(LOC)")
 | 
|---|
 | 57 |         do regEvent^TMGOOL(TMGthis,"FRAME CLICK","FmClick^TMGWGOJ(LOC,Flags)")
 | 
|---|
 | 58 |         do regEvent^TMGOOL(TMGthis,"SHIFT-CLICK","HandleSClick^TMGWGOJ(LOC)")
 | 
|---|
 | 59 |         do regEvent^TMGOOL(TMGthis,"MOVE REQUEST","HndlMMove^TMGWGOJ(cmdKey)")
 | 
|---|
 | 60 |         do regEvent^TMGOOL(TMGthis,"LOOSING FOCUS","") ;"<--- implement later
 | 
|---|
 | 61 |  
 | 
|---|
 | 62 |         ;"---------------------------------------------------------------------
 | 
|---|
 | 63 |         ;"Register Properties
 | 
|---|
 | 64 |  
 | 
|---|
 | 65 |         do regProp^TMGOOL(TMGthis,"LOC","","","$$getLOC^TMGWGOJ")  ;"actually holds T,L,W,H,S,F below
 | 
|---|
 | 66 |         do regProp^TMGOOL(TMGthis,"TOP",0,"setTop^TMGWGOJ","$$getTop^TMGWGOJ")
 | 
|---|
 | 67 |         do regProp^TMGOOL(TMGthis,"LEFT",0,"setLeft^TMGWGOJ","$$getLeft^TMGWGOJ")
 | 
|---|
 | 68 |         do regProp^TMGOOL(TMGthis,"WIDTH",10,"setWidth^TMGWGOJ","$$getWidth^TMGWGOJ")
 | 
|---|
 | 69 |         do regProp^TMGOOL(TMGthis,"HEIGHT",10,"setHeight^TMGWGOJ","$$getHeight^TMGWGOJ")
 | 
|---|
 | 70 |         do regProp^TMGOOL(TMGthis,"ALIGN","NONE","","","NONE^TOP^LEFT^BOTTOM^RIGHT")
 | 
|---|
 | 71 |  
 | 
|---|
 | 72 |         do regProp^TMGOOL(TMGthis,"FRAME","SOLID","","","NONE^SOLID^SIZABLE")
 | 
|---|
 | 73 |         do regProp^TMGOOL(TMGthis,"NEEDS REPAINT",0,"","$$getNeedsRepaint^TMGWGOJ","0^1")
 | 
|---|
 | 74 |         do regProp^TMGOOL(TMGthis,"RESIZING FLAGS","","","","^[TBLR]")  ;"current resizing mode
 | 
|---|
 | 75 |         do regProp^TMGOOL(TMGthis,"TITLE","")  ;"default null title
 | 
|---|
 | 76 |         do regProp^TMGOOL(TMGthis,"PARENT","","setParent^TMGWGOJ","$$getParent^TMGWGOJ")
 | 
|---|
 | 77 |         do regProp^TMGOOL(TMGthis,"STATE",0,"setState^TMGWGOJ","$$getState^TMGWGOJ","SELECTED^0")
 | 
|---|
 | 78 |         do regProp^TMGOOL(TMGthis,"FOCUSED",0,"","","0^1")
 | 
|---|
 | 79 |         do regProp^TMGOOL(TMGthis,"LAST DRAW","")
 | 
|---|
 | 80 |         do regProp^TMGOOL(TMGthis,"SCREEN","")
 | 
|---|
 | 81 |  
 | 
|---|
 | 82 |         ;"---------------------------------------------------------------------
 | 
|---|
 | 83 |         ;"Optional initialization of some instance-specific variables.
 | 
|---|
 | 84 |  
 | 
|---|
 | 85 |         ;"--------------------------------------------------------------------------------
 | 
|---|
 | 86 |         ;"Startup code here...
 | 
|---|
 | 87 |  
 | 
|---|
 | 88 |         quit
 | 
|---|
 | 89 |  
 | 
|---|
 | 90 |  
 | 
|---|
 | 91 | Destructor(instanceName)  ;"Module MUST have 'Destructor' procedure
 | 
|---|
 | 92 |         ;"Purpose:  A destructor for object Widget
 | 
|---|
 | 93 |         ;"              any needed clean up code would go here first.
 | 
|---|
 | 94 |         ;"Input: instanceName -- the name of the object instance to be deleted.
 | 
|---|
 | 95 |         ;"              This should be the value returned from defWidget
 | 
|---|
 | 96 |         ;"Note: Don't actually delete the object here.  Just perform code needed to
 | 
|---|
 | 97 |         ;"              save the object variables etc.  Anything neeed before the object
 | 
|---|
 | 98 |         ;"              is deleted by delete^TMGOOL
 | 
|---|
 | 99 |  
 | 
|---|
 | 100 |         ;"-----------------
 | 
|---|
 | 101 |  
 | 
|---|
 | 102 |         ;" Here I put code that needs to be called before destruction of the object.
 | 
|---|
 | 103 |  
 | 
|---|
 | 104 |         ;"-----------------
 | 
|---|
 | 105 |  
 | 
|---|
 | 106 |         ;"Here I delete any children (and they can delete their children)
 | 
|---|
 | 107 |         new num set num=""
 | 
|---|
 | 108 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)  do
 | 
|---|
 | 109 |         . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 110 |         . if child="" quit
 | 
|---|
 | 111 |         . do delete^TMGOOL(child)
 | 
|---|
 | 112 |  
 | 
|---|
 | 113 |         quit
 | 
|---|
 | 114 |  
 | 
|---|
 | 115 |  
 | 
|---|
 | 116 |  ;"------------------------------------------
 | 
|---|
 | 117 |  ;"Object member functions below
 | 
|---|
 | 118 |  ;"------------------------------------------
 | 
|---|
 | 119 |  
 | 
|---|
 | 120 |  ;"Note: A variable (with global scope) TMGthis is available as a 'this' pointer (this instance)
 | 
|---|
 | 121 |  ;"Note: ALL members must have QUIT xx  (even if xx is meaningless, as in a procedure)
 | 
|---|
 | 122 |  
 | 
|---|
 | 123 | Paint()
 | 
|---|
 | 124 |         ;"Purpose: To paint the current window (and all children windows)
 | 
|---|
 | 125 |         ;"Input: instanceName -- the name/ref of this instance
 | 
|---|
 | 126 |  
 | 
|---|
 | 127 |         new T,L,H,W,B,R,LOC
 | 
|---|
 | 128 |         new scrap set scrap=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 129 |         set scrap=$$Conv2Frame(.LOC,"SCREEN")
 | 
|---|
 | 130 |         set T=+$get(LOC("TOP")),L=+$get(LOC("LEFT"))
 | 
|---|
 | 131 |         set B=+$get(LOC("BOTTOM")),R=+$get(LOC("RIGHT"))
 | 
|---|
 | 132 |  
 | 
|---|
 | 133 |         if $data(@TMGthis@("screen save")) do
 | 
|---|
 | 134 |         . do CLRCLIP^TMGXGF
 | 
|---|
 | 135 |         . do RESTORE^TMGXGF($name(@TMGthis@("screen save")))
 | 
|---|
 | 136 |         . ;"note: tell children to flush their saved screens."
 | 
|---|
 | 137 |         . new num set num=""
 | 
|---|
 | 138 |         . for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)  do
 | 
|---|
 | 139 |         . . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 140 |         . . if child="" quit
 | 
|---|
 | 141 |         . . do proc^TMGOOL(child,"FLUSH SCREEN SAVE")
 | 
|---|
 | 142 |  
 | 
|---|
 | 143 |         new selected,focused
 | 
|---|
 | 144 |         set selected=($$getProp^TMGOOL(TMGthis,"STATE")="SELECTED")
 | 
|---|
 | 145 |         ;"new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 146 |         ;"set focused=$$fn^TMGOOL(parent,"IS FOCUSED",TMGthis)
 | 
|---|
 | 147 |         set focused=$$fn^TMGOOL(TMGthis,"IS FOCUSED")
 | 
|---|
 | 148 |         new rflags set rflags=$$getProp^TMGOOL(TMGthis,"RESIZING FLAGS")
 | 
|---|
 | 149 |  
 | 
|---|
 | 150 |         do proc^TMGOOL(TMGthis,"CLIP TO PARENT",TMGthis)
 | 
|---|
 | 151 |  
 | 
|---|
 | 152 |         if selected do CHGA^TMGXGF("I1")
 | 
|---|
 | 153 |         do WIN^TMGXGF(T,L,B,R,$name(@TMGthis@("screen save")))
 | 
|---|
 | 154 |         if (rflags'="") do
 | 
|---|
 | 155 |         . do CHGA^TMGXGF("R1")
 | 
|---|
 | 156 |         . do FRAME^TMGXGF(T,L,B,R)
 | 
|---|
 | 157 |         . do CHGA^TMGXGF("R0")
 | 
|---|
 | 158 |         else  if ('selected)&(focused) do
 | 
|---|
 | 159 |         . do CHGA^TMGXGF("I1")
 | 
|---|
 | 160 |         . do FRAME^TMGXGF(T,L,B,R)
 | 
|---|
 | 161 |         if (selected)!(focused) do CHGA^TMGXGF("I0")
 | 
|---|
 | 162 |  
 | 
|---|
 | 163 |         if rflags'="" do  ;"goto P2
 | 
|---|
 | 164 | PMV     . new msg set msg=" ["
 | 
|---|
 | 165 |         . if rflags="T" set msg=msg_"MOVING"
 | 
|---|
 | 166 |         . else  set msg=msg_"RESIZING"
 | 
|---|
 | 167 |         . set msg=msg_". Press ENTER to stop] "
 | 
|---|
 | 168 |         . set W=+$get(LOC("WIDTH"))
 | 
|---|
 | 169 |         . set msg=$extract(msg,1,W-1)
 | 
|---|
 | 170 |         . do SAY^TMGXGF(T+1,L+1,msg,"")
 | 
|---|
 | 171 |         . do setProp^TMGOOL($$GetScrn(),"NEEDS REPAINT",1) ;"flag full screen repaint needed next time
 | 
|---|
 | 172 |  
 | 
|---|
 | 173 |         ;"Here I paint any children (and they can paint their children)
 | 
|---|
 | 174 |         new num set num=""
 | 
|---|
 | 175 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)  do
 | 
|---|
 | 176 | X2      . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 177 |         . if child="" quit
 | 
|---|
 | 178 |         . do proc^TMGOOL(child,"PAINT")
 | 
|---|
 | 179 |  
 | 
|---|
 | 180 | P2
 | 
|---|
 | 181 |         do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",0)  ;"flag as painted.
 | 
|---|
 | 182 |  
 | 
|---|
 | 183 |         quit 0
 | 
|---|
 | 184 |  
 | 
|---|
 | 185 |  
 | 
|---|
 | 186 | MoveObj(cmdKey)
 | 
|---|
 | 187 |         ;"Purpose: To move (drag) the object based on mouse movement
 | 
|---|
 | 188 |         ;"Input: cmdKey.  PASS BY REFERENCE.  An array with following structure
 | 
|---|
 | 189 |         ;"          cmdKey="xxx"  <--- ignored
 | 
|---|
 | 190 |         ;"          cmdKey("DELTA","TOP") <-- delta Y
 | 
|---|
 | 191 |         ;"          cmdKey("DELTA","LEFT") <-- delta X
 | 
|---|
 | 192 |         ;"Output: returns result in cmdKey('RESULT'):  -1=failure, 1=success
 | 
|---|
 | 193 |  
 | 
|---|
 | 194 |         new T,L,LOC,PLOC,dT,dL,csrT,csrL
 | 
|---|
 | 195 |         new result set result=0
 | 
|---|
 | 196 |         new scrap set scrap=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 197 |  
 | 
|---|
 | 198 |         set dT=+$get(cmdKey("DELTA","TOP")),dL=+$get(cmdKey("DELTA","LEFT"))
 | 
|---|
 | 199 |         set csrT=+$get(cmdKey("GLOBAL COORDS","TOP"))
 | 
|---|
 | 200 |         set csrL=+$get(cmdKey("GLOBAL COORDS","LEFT"))
 | 
|---|
 | 201 |         new PT,PL,PB,PR
 | 
|---|
 | 202 |         do getPCoords(TMGthis,.PT,.PL,.PB,.PR)  ;"get parent coordinates (in SCREEN frame of refernce)
 | 
|---|
 | 203 |         if (dT<0)&(csrT<PT) set result=-1
 | 
|---|
 | 204 |         if (dT>0)&(csrT>PB) set result=-1
 | 
|---|
 | 205 |         if (dL<0)&(csrL<PL) set result=-1
 | 
|---|
 | 206 |         if (dL>0)&(csrL>PR) set result=-1
 | 
|---|
 | 207 |         if result=-1 goto MOL2
 | 
|---|
 | 208 |  
 | 
|---|
 | 209 |         set T=$get(LOC("TOP"))+dT
 | 
|---|
 | 210 |         set L=$get(LOC("LEFT"))+dL
 | 
|---|
 | 211 |         set result=$$fn^TMGOOL(TMGthis,"MOVE TO",.T,.L)
 | 
|---|
 | 212 | MOL2
 | 
|---|
 | 213 |         if result>0 do
 | 
|---|
 | 214 |         . new scrap set scrap=$$FlushMouseBuffer()
 | 
|---|
 | 215 |         . do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",1) ;"flag repaint of entire screen
 | 
|---|
 | 216 |         . set cmdKey("RESULT")=1
 | 
|---|
 | 217 |         else  do
 | 
|---|
 | 218 |         . set cmdKey("RESULT")=-1
 | 
|---|
 | 219 |         quit result
 | 
|---|
 | 220 |  
 | 
|---|
 | 221 |  
 | 
|---|
 | 222 | ResizeObj(flags,cmdKey)
 | 
|---|
 | 223 |         ;"Purpose: to resize the object based on mouse movement.
 | 
|---|
 | 224 |         ;"Input:  flags
 | 
|---|
 | 225 |         ;"         "T" if on top of frame ; <--- shouldn't be called here with just T
 | 
|---|
 | 226 |         ;"         "B" if on bottom of frame
 | 
|---|
 | 227 |         ;"         "L" if on left of frame
 | 
|---|
 | 228 |         ;"         "R" if on right of frame
 | 
|---|
 | 229 |         ;"         "TL","TR","BL","BR" for the corners
 | 
|---|
 | 230 |         ;"        cmdKey.  PASS BY REFERENCE.  An array with following structure
 | 
|---|
 | 231 |         ;"          cmdKey="xxx"  <--- ignored
 | 
|---|
 | 232 |         ;"          cmdKey("DELTA","TOP") <-- delta Y
 | 
|---|
 | 233 |         ;"          cmdKey("DELTA","LEFT") <-- delta X
 | 
|---|
 | 234 |         ;"Results: none
 | 
|---|
 | 235 |         ;"Output: cmdKey("RESULT")=-1 if failure
 | 
|---|
 | 236 |  
 | 
|---|
 | 237 |         new T,L,W,H,LOC
 | 
|---|
 | 238 |         new scrap set scrap=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 239 |         set T=$get(LOC("TOP")),L=$get(LOC("LEFT"))
 | 
|---|
 | 240 |         set H=$get(LOC("HEIGHT")),W=$get(LOC("WIDTH"))
 | 
|---|
 | 241 |         new dX,dY
 | 
|---|
 | 242 |         set dX=$get(cmdKey("DELTA","LEFT"))
 | 
|---|
 | 243 |         set dY=$get(cmdKey("DELTA","TOP"))
 | 
|---|
 | 244 |  
 | 
|---|
 | 245 |         if flags["T" do
 | 
|---|
 | 246 |         . set T=T+dY
 | 
|---|
 | 247 |         . set H=H-dY
 | 
|---|
 | 248 |         if flags["L" do
 | 
|---|
 | 249 |         . set L=L+dX
 | 
|---|
 | 250 |         . set W=W-dX
 | 
|---|
 | 251 |         if flags["B" do
 | 
|---|
 | 252 |         . set H=H+dY
 | 
|---|
 | 253 |         if flags["R" do
 | 
|---|
 | 254 |         . set W=W+dX
 | 
|---|
 | 255 |  
 | 
|---|
 | 256 |         new success set success=$$setTLHW(T,L,H,W)
 | 
|---|
 | 257 |         if success=0 do
 | 
|---|
 | 258 | RO1     . set cmdKey("RESULT")=-1  ;"failure signal.
 | 
|---|
 | 259 |         else  new scrap set scrap=$$FlushMouseBuffer()
 | 
|---|
 | 260 |  
 | 
|---|
 | 261 |         quit 0
 | 
|---|
 | 262 |  
 | 
|---|
 | 263 |  
 | 
|---|
 | 264 | MoveTo(Top,Left)
 | 
|---|
 | 265 |         ;"Purpose: position object
 | 
|---|
 | 266 |         ;"Results: 1 if change made, 0 if not change made
 | 
|---|
 | 267 |         new result set result=0
 | 
|---|
 | 268 |         new LOC set LOC=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 269 |         if $get(LOC("TOP"))'=Top do
 | 
|---|
 | 270 |         . do setProp^TMGOOL(TMGthis,"TOP",.Top)
 | 
|---|
 | 271 |         . if $$getProp^TMGOOL(TMGthis,"TOP")'=Top quit  ;" set failed
 | 
|---|
 | 272 |         . set result=1
 | 
|---|
 | 273 |         if $get(LOC("LEFT"))'=Left do
 | 
|---|
 | 274 |         . do setProp^TMGOOL(TMGthis,"LEFT",.Left)
 | 
|---|
 | 275 |         . if $$getProp^TMGOOL(TMGthis,"LEFT")'=Left quit  ;" set failed
 | 
|---|
 | 276 |         . set result=1
 | 
|---|
 | 277 |         ;"do setProp^TMGOOL(TMGthis,"TOP",.Top)
 | 
|---|
 | 278 |         ;"do setProp^TMGOOL(TMGthis,"LEFT",.Left)
 | 
|---|
 | 279 |         quit result
 | 
|---|
 | 280 |  
 | 
|---|
 | 281 |  
 | 
|---|
 | 282 | AcceptChild(Child)
 | 
|---|
 | 283 |         ;"Purpose: to add a child to list of managed children
 | 
|---|
 | 284 |         ;"Input: Child -- name/ref of child to add
 | 
|---|
 | 285 |  
 | 
|---|
 | 286 |         ;"Note: this num will be used as a 'z-order'.  Can reorder later
 | 
|---|
 | 287 |         new num set num=""
 | 
|---|
 | 288 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'=num)
 | 
|---|
 | 289 |         set num=$order(@TMGthis@("CHILDREN",num),-1) ;"get last used number
 | 
|---|
 | 290 |         set num=num+1
 | 
|---|
 | 291 |         set @TMGthis@("CHILDREN",num,Child)=""
 | 
|---|
 | 292 |         quit 0
 | 
|---|
 | 293 |  
 | 
|---|
 | 294 |  
 | 
|---|
 | 295 | FlushScrnSave()
 | 
|---|
 | 296 |         ;"Purpose: To flush the saved text from under this window
 | 
|---|
 | 297 |         kill @TMGthis@("screen save")
 | 
|---|
 | 298 |         quit 0
 | 
|---|
 | 299 |  
 | 
|---|
 | 300 |  
 | 
|---|
 | 301 | Contains(LOC)
 | 
|---|
 | 302 |         ;"Purpose: To see if some coordinates are located inside this window
 | 
|---|
 | 303 |         ;"Input: LOC -- a location array.  Pass by reference
 | 
|---|
 | 304 |         ;"        LOC("TOP")=top
 | 
|---|
 | 305 |         ;"        LOC("LEFT")=left
 | 
|---|
 | 306 |         ;"              Coordinates (in parent's frame of reference)
 | 
|---|
 | 307 |         ;"Results: 1 if coordinates are contained, 0 otherwise
 | 
|---|
 | 308 |  
 | 
|---|
 | 309 |         new result set result=0
 | 
|---|
 | 310 |         ;"new temp set temp=$$Conv2Local(.LOC)
 | 
|---|
 | 311 |         ;"new temp set temp=$$Conv2Frame(.LOC,TMGthis)
 | 
|---|
 | 312 |         ;"Reemmber, THISs' coordinates are in parent's frame of ref
 | 
|---|
 | 313 |         new thisLOC set thisLOC=$$getProp^TMGOOL(TMGthis,"LOC",.thisLOC)
 | 
|---|
 | 314 |         if (LOC("TOP")<$get(thisLOC("TOP")))!(LOC("LEFT")<$get(thisLOC("LEFT"))) goto CDone
 | 
|---|
 | 315 |         if LOC("TOP")>($get(thisLOC("TOP"))+$get(thisLOC("HEIGHT"))) goto CDone
 | 
|---|
 | 316 |         if LOC("LEFT")>($get(thisLOC("LEFT"))+$get(thisLOC("WIDTH"))) goto CDone
 | 
|---|
 | 317 |         set result=1
 | 
|---|
 | 318 | CDone
 | 
|---|
 | 319 |         quit result
 | 
|---|
 | 320 |  
 | 
|---|
 | 321 |  
 | 
|---|
 | 322 | Conv2Frame(LOC,targetFrame)
 | 
|---|
 | 323 |         ;"Purpose: convert LOC to targetFrame's coordinate system.
 | 
|---|
 | 324 |         ;"      Note: initially, targetFrame may only be the name/ref of a parent,
 | 
|---|
 | 325 |         ;"              or child of TMGthis, or the word 'SCREEN' to indicate
 | 
|---|
 | 326 |         ;"              a desired targetFrame to be in screen coordinates.
 | 
|---|
 | 327 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 328 |         ;"             LOC("TOP")=
 | 
|---|
 | 329 |         ;"             LOC("LEFT")=
 | 
|---|
 | 330 |         ;"             LOC("HEIGHT")= ;"optional
 | 
|---|
 | 331 |         ;"             LOC("WIDTH")= ;"optional
 | 
|---|
 | 332 |         ;"             LOC("BOTTOM")=
 | 
|---|
 | 333 |         ;"             LOC("RIGHT")=
 | 
|---|
 | 334 |         ;"             LOC("FRAME")=Frame of reference for these coordinates
 | 
|---|
 | 335 |         ;"                              Note: frame should typically be the same as
 | 
|---|
 | 336 |         ;"                              the PARENT of the current object
 | 
|---|
 | 337 |         ;"          targetFrame=the frame of refernce to change to.
 | 
|---|
 | 338 |         ;"Results: none
 | 
|---|
 | 339 |         ;"Output:  Input variables are modified as OUT PARAMETERS
 | 
|---|
 | 340 |         ;"          LOC("TOP") is modified
 | 
|---|
 | 341 |         ;"          LOC("LEFT") is modified
 | 
|---|
 | 342 |         ;"          LOC("HEIGHT")=unchanged
 | 
|---|
 | 343 |         ;"          LOC("WIDTH")=unchanged
 | 
|---|
 | 344 |         ;"          LOC("BOTTOM") is updated
 | 
|---|
 | 345 |         ;"          LOC("RIGHT") is updated
 | 
|---|
 | 346 |  
 | 
|---|
 | 347 |         new pathArray
 | 
|---|
 | 348 |         do getPath(.LOC,targetFrame,.pathArray)
 | 
|---|
 | 349 |         do convPath(.LOC,.pathArray)
 | 
|---|
 | 350 |  
 | 
|---|
 | 351 | C2FDone
 | 
|---|
 | 352 |         quit 0
 | 
|---|
 | 353 |  
 | 
|---|
 | 354 |  
 | 
|---|
 | 355 | GetScrn()
 | 
|---|
 | 356 |         ;"Purpose: to get a ref/name/pointer to Screen.
 | 
|---|
 | 357 |         ;"      Note: because all graphic objects have to have the Screen as the
 | 
|---|
 | 358 |         ;"      ultimate parent, this will be found by recursively searching for parents
 | 
|---|
 | 359 |         ;"results: returns ref to Screen
 | 
|---|
 | 360 |  
 | 
|---|
 | 361 |         new result set result=""
 | 
|---|
 | 362 |         new curObj set curObj=TMGthis
 | 
|---|
 | 363 |         for  do  quit:(curObj="")!(result'="")
 | 
|---|
 | 364 |         . set result=$$getProp^TMGOOL(curObj,"SCREEN")
 | 
|---|
 | 365 |         . set curObj=$$getProp^TMGOOL(curObj,"PARENT")
 | 
|---|
 | 366 |  
 | 
|---|
 | 367 |         quit result
 | 
|---|
 | 368 |  
 | 
|---|
 | 369 |  
 | 
|---|
 | 370 | ClipToParent(TMGthis,extraT,extraL,extraB,extraR)
 | 
|---|
 | 371 |         ;"Purpose: to set the clipping boundries to the parent frame of TMGthis
 | 
|---|
 | 372 |         ;"Note: because the parent frame might be partly off screen, this will also
 | 
|---|
 | 373 |         ;"      clip to the screen to prevent off-screen writing.
 | 
|---|
 | 374 |         ;"Input: TMGthis -- the THIS pointer to have the clipping to
 | 
|---|
 | 375 |         ;"       extraT,extraL,extraB,extraR -- OPTIONAL  -- NOT IMPLEMENTED (YET)
 | 
|---|
 | 376 |         ;"              was to allow shrinking of the clip area by extra amounts.
 | 
|---|
 | 377 |         new PT,PL,PB,PR
 | 
|---|
 | 378 |         do getPCoords(TMGthis,.PT,.PL,.PB,.PR)  ;"get parent coordinates
 | 
|---|
 | 379 |         new pScrn set pScrn=$$GetScrn()
 | 
|---|
 | 380 |         new ST,SL,SB,SR,SLOC
 | 
|---|
 | 381 |         set SLOC=$$getProp^TMGOOL(pScrn,"LOC",.SLOC)  ;"get screen coordinates
 | 
|---|
 | 382 |         set ST=+$get(SLOC("TOP"))
 | 
|---|
 | 383 |         set SL=+$get(SLOC("LEFT"))
 | 
|---|
 | 384 |         set SR=SL+$get(SLOC("WIDTH"))
 | 
|---|
 | 385 |         set SB=ST+$get(SLOC("HEIGHT"))
 | 
|---|
 | 386 |         if PT<ST set PT=ST
 | 
|---|
 | 387 |         if PB'<SB set PB=SB
 | 
|---|
 | 388 |         if PL<SL set PL=SL
 | 
|---|
 | 389 |         if PR'<SR set PR=SR
 | 
|---|
 | 390 |         do SETCLIP^TMGXGF(PT,PL,PB,PR)  ;"clip to parent's window
 | 
|---|
 | 391 |         quit 0
 | 
|---|
 | 392 |  
 | 
|---|
 | 393 |  
 | 
|---|
 | 394 | FlushMouseBuffer()
 | 
|---|
 | 395 |         ;"Purpose: to flush mouse buffer so false trail isn't laid down after object change
 | 
|---|
 | 396 |  
 | 
|---|
 | 397 |         new pScrn set pScrn=$$GetScrn()
 | 
|---|
 | 398 |         set pScrn=$$getProp^TMGOOL(pScrn,"MOUSE HOLDER")
 | 
|---|
 | 399 |         if pScrn'="" kill @pScrn@("MOUSE","SAVE")  ;"flush mouse save buffer
 | 
|---|
 | 400 |         quit 0
 | 
|---|
 | 401 |  
 | 
|---|
 | 402 |  ;"------------------------------------------
 | 
|---|
 | 403 |  ;"Event handlers below
 | 
|---|
 | 404 |  ;"------------------------------------------
 | 
|---|
 | 405 |  
 | 
|---|
 | 406 | HandleAlpha(key)
 | 
|---|
 | 407 |         ;"Purpose: Accept an alpha-numeric character, and process as implemented
 | 
|---|
 | 408 |         ;"Note: This will be one key at a time, EXCEPT if an enter/return has
 | 
|---|
 | 409 |         ;"      been pressed.  In that case, key=CR
 | 
|---|
 | 410 |         ;"input: key -- the one letter alpha-numeric entered by user
 | 
|---|
 | 411 |  
 | 
|---|
 | 412 |         ;"I will add functionality here later...
 | 
|---|
 | 413 |  
 | 
|---|
 | 414 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
 | 415 |  
 | 
|---|
 | 416 |  
 | 
|---|
 | 417 | HandleMsg(cmdKey)
 | 
|---|
 | 418 |         ;"Purpose: Accept a command character, and process as implemented
 | 
|---|
 | 419 |         ;"Input: cmdKey -- the command input.  Examples:
 | 
|---|
 | 420 |         ;"       **MESSAGES**
 | 
|---|
 | 421 |         ;"       For messages, cmdKey='MESSAGE TEXT'
 | 
|---|
 | 422 |         ;"       All messages will include mouse locations:
 | 
|---|
 | 423 |         ;"          cmdKey("TOP"), and cmdKey("LEFT") <-- in parent's coordinates frame of reference
 | 
|---|
 | 424 |         ;"          Note: Because the top,left are in the parent's frame of reference,
 | 
|---|
 | 425 |         ;"               a call to Conv2Local to get local frame.  For example,
 | 
|---|
 | 426 |         ;"               if a control on a window was located at 10,10 and it gets clicked
 | 
|---|
 | 427 |         ;"               at 12,15, then a call Conv2Local will convert this to 2,5, and
 | 
|---|
 | 428 |         ;"               this will make sense for the child
 | 
|---|
 | 429 |         ;"       COMMAND  Details stored in ("KEY") node:  e.g.
 | 
|---|
 | 430 |         ;"              UP, DOWN, LEFT, RIGHT
 | 
|---|
 | 431 |         ;"              NEXT (page down), PREV (page up)
 | 
|---|
 | 432 |         ;"              REMOVE (for delete)
 | 
|---|
 | 433 |         ;"              note: HOME and END are NOT returned from READ^TMGXGF.
 | 
|---|
 | 434 |         ;"              F1, F2, ...
 | 
|---|
 | 435 |         ;"              ^A, ^B (ctrl-A, ctrl-B etc.)
 | 
|---|
 | 436 |         ;"              TAB
 | 
|---|
 | 437 |         ;"              ESC  (maybe)
 | 
|---|
 | 438 |         ;"       MOUSE-CLICK -- includes mouse location
 | 
|---|
 | 439 |         ;"       MOUSE-SHIFT-CLICK -- includes mouse location
 | 
|---|
 | 440 |         ;"       MOVE REQUEST
 | 
|---|
 | 441 |         ;"              ("DELTA","TOP")=deltaTop
 | 
|---|
 | 442 |         ;"              ("DELTA","LEFT")=deltaLeft
 | 
|---|
 | 443 |         ;"            i.e. TOP=1,LEFT=1 would mean that the mouse moved downward 1 and rightward 1
 | 
|---|
 | 444 |         ;"       CHECK PAINT, FULL PAINT
 | 
|---|
 | 445 |         ;"Result: none.  To pass back a result, set:
 | 
|---|
 | 446 |         ;"    cmdKey("RESULT")=result
 | 
|---|
 | 447 |         ;"    -1 ==> failure
 | 
|---|
 | 448 |         ;"    0 ==> OK
 | 
|---|
 | 449 |         ;"    1 ==> handled
 | 
|---|
 | 450 |  
 | 
|---|
 | 451 |         new result set result=0
 | 
|---|
 | 452 |         set cmdKey=$get(cmdKey)
 | 
|---|
 | 453 |         set cmdKey("RESULT")=result
 | 
|---|
 | 454 |         new child set child=""
 | 
|---|
 | 455 |         new temp set temp=$$Conv2Frame(.cmdKey,TMGthis)  ;"convert coordinates to TMGthis's frame
 | 
|---|
 | 456 |  
 | 
|---|
 | 457 |         if cmdKey="FULL PAINT" do
 | 
|---|
 | 458 |         . ;"Draw a frame to white out entire screen.
 | 
|---|
 | 459 |         . ;"do CLEAR^TMGXGF(0,0,IOSL,IOM) ;"clear screen portion TOP,LEFT,BOTTOM,RIGHT
 | 
|---|
 | 460 |         . new scrap set scrap=$$FlushScrnSave()
 | 
|---|
 | 461 |         . do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",1)
 | 
|---|
 | 462 |         . set cmdKey="CHECK PAINT"
 | 
|---|
 | 463 |  
 | 
|---|
 | 464 |         if cmdKey="CHECK PAINT" do  goto AMDone
 | 
|---|
 | 465 |         . do CheckPaint  ;"note only MainWindow should be getting this event, from Screen
 | 
|---|
 | 466 |  
 | 
|---|
 | 467 |         ;"NOTE: If a CLICK occurs, check to pass the message on to newly chosen child
 | 
|---|
 | 468 |         ;"      Otherwise message should go to focused child.
 | 
|---|
 | 469 |         if cmdKey["CLICK" do  goto:(child'="") AMDone
 | 
|---|
 | 470 |         . ;"First find out if click should belong to a child window.  If so, pass it on.
 | 
|---|
 | 471 |         . set child=$$GetContained(.cmdKey)
 | 
|---|
 | 472 |         . if child="" do UnfocusCur() quit  ;"ignore click
 | 
|---|
 | 473 |         . else  do FocusThis()
 | 
|---|
 | 474 |         . do fireEvent^TMGOOL(child,"MSG",.cmdKey)
 | 
|---|
 | 475 |  
 | 
|---|
 | 476 |         new focused set focused=$$getFocused()
 | 
|---|
 | 477 |         if focused'="" do  goto AMDone
 | 
|---|
 | 478 |         . do fireEvent^TMGOOL(focused,"MSG",.cmdKey)  ;"pass message to focused and quit
 | 
|---|
 | 479 |  
 | 
|---|
 | 480 |         ;"Message belongs to this object, so handle messages below:
 | 
|---|
 | 481 |         ;"--------------------------------------------------------
 | 
|---|
 | 482 |         do FocusThis()
 | 
|---|
 | 483 |         if cmdKey="MOUSE-CLICK" do
 | 
|---|
 | 484 |         . set cmdKey("RESULT")=1
 | 
|---|
 | 485 |         . do fireEvent^TMGOOL(TMGthis,"CLICK",.cmdKey)
 | 
|---|
 | 486 |         else  if cmdKey="MOUSE-SHIFT-CLICK" do
 | 
|---|
 | 487 |         . do fireEvent^TMGOOL(TMGthis,"SHIFT-CLICK",.cmdKey)
 | 
|---|
 | 488 |         . set cmdKey("RESULT")=1
 | 
|---|
 | 489 |         else  if cmdKey="MOVE REQUEST" do
 | 
|---|
 | 490 | AMMM    . new flags set flags=$$getProp^TMGOOL(TMGthis,"RESIZING FLAGS")
 | 
|---|
 | 491 |         . if flags="" do fireEvent^TMGOOL(TMGthis,"MOVE REQUEST",.cmdKey) quit
 | 
|---|
 | 492 |         . new pScrn set pScrn=$$GetScrn()
 | 
|---|
 | 493 |         . do setProp^TMGOOL(pScrn,"NEEDS REPAINT",1)
 | 
|---|
 | 494 |         . new scrap set scrap=$$FlushMouseBuffer()
 | 
|---|
 | 495 |         . if flags="T" do  quit
 | 
|---|
 | 496 |         . . do proc^TMGOOL(TMGthis,"MOVE OBJ",.cmdKey)  ;"returns result in cmdKey
 | 
|---|
 | 497 |         . do proc^TMGOOL(TMGthis,"RESIZE OBJ",flags,.cmdKey) quit
 | 
|---|
 | 498 |  
 | 
|---|
 | 499 | AMDone
 | 
|---|
 | 500 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
 | 501 |  
 | 
|---|
 | 502 |  
 | 
|---|
 | 503 | HndlMMove(cmdKey)  ;"Handle MouseMove request
 | 
|---|
 | 504 |         ;"Purpose: Handle Mouse Move
 | 
|---|
 | 505 |         ;"Input: cmdKey -- the command input.
 | 
|---|
 | 506 |         ;"       MOVE REQUEST
 | 
|---|
 | 507 |         ;"              ("TOP")=Current Top
 | 
|---|
 | 508 |         ;"              ("LEFT")=Current Left
 | 
|---|
 | 509 |         ;"              ("DELTA","TOP")=deltaTop
 | 
|---|
 | 510 |         ;"              ("DELTA","LEFT")=deltaLeft
 | 
|---|
 | 511 |         ;"            i.e. TOP=1,LEFT=1 would mean that the mouse moved downward 1 and rightward 1
 | 
|---|
 | 512 |         ;"Result: None, but result is put into cmdKey("RESULT")
 | 
|---|
 | 513 |         ;"    -1 ==> failure
 | 
|---|
 | 514 |         ;"    0 ==> OK
 | 
|---|
 | 515 |         ;"    1 ==> handled
 | 
|---|
 | 516 |  
 | 
|---|
 | 517 |         new abort set abort=0
 | 
|---|
 | 518 |         set cmdKey("RESULT")=0
 | 
|---|
 | 519 |         new temp set temp=$$Conv2Frame(.cmdKey,TMGthis)  ;"ensure coordinates in TMGthis's frame
 | 
|---|
 | 520 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT") ;"if null, then this is MainWindow
 | 
|---|
 | 521 |         new newT,newL
 | 
|---|
 | 522 |         set newT=+$get(cmdKey("TOP"))+$get(cmdKey("DELTA","TOP"))
 | 
|---|
 | 523 |         set newL=+$get(cmdKey("LEFT"))+$get(cmdKey("DELTA","LEFT"))
 | 
|---|
 | 524 |         set LOC=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 525 |  
 | 
|---|
 | 526 |         if (newT<0)!(newT>$get(LOC("HEIGHT")))!(newL<0)!(newL>$get(LOC("WIDTH"))) do
 | 
|---|
 | 527 |         . if parent="SCREEN" do  quit  ;"don't allow mouse to go off screen.
 | 
|---|
 | 528 |         . . set result=-1,abort=1
 | 
|---|
 | 529 |         . do fireEvent^TMGOOL(TMGthis,"LOOSING FOCUS",.cmdKey)
 | 
|---|
 | 530 |         if abort goto HMMDone
 | 
|---|
 | 531 |  
 | 
|---|
 | 532 | HMM     new flags set flags=$$getProp^TMGOOL(TMGthis,"RESIZING FLAGS")
 | 
|---|
 | 533 |         if flags="" goto HMMDone
 | 
|---|
 | 534 |         if flags="T" do proc^TMGOOL(TMGthis,"MOVE OBJ",.cmdKey) goto HMMDone
 | 
|---|
 | 535 |         do proc^TMGOOL(TMGthis,"RESIZE OBJ",flags,.cmdKey) goto HMMDone
 | 
|---|
 | 536 | HMMDone
 | 
|---|
 | 537 |         set cmdKey("RESULT")=result
 | 
|---|
 | 538 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
 | 539 |  
 | 
|---|
 | 540 |  
 | 
|---|
 | 541 | HandleClick(LOC)
 | 
|---|
 | 542 |         ;"Purpose: do something here with a mouse click.  Note: descendents can
 | 
|---|
 | 543 |         ;"        overwrite this function to customize their control.
 | 
|---|
 | 544 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 545 |         ;"          coordinates in LOCAL frame of refeernces.
 | 
|---|
 | 546 |         ;"          LOC("TOP")=
 | 
|---|
 | 547 |         ;"          LOC("LEFT")=
 | 
|---|
 | 548 |         ;"          LOC("HEIGHT")= ;"optional
 | 
|---|
 | 549 |         ;"          LOC("WIDTH")= ;"optional
 | 
|---|
 | 550 |         ;"          LOC("BOTTOM")= ;"optional
 | 
|---|
 | 551 |         ;"          LOC("RIGHT")=  ;"optional
 | 
|---|
 | 552 |         ;"Note: It has already been determined that the click belongs to this window
 | 
|---|
 | 553 |         ;"       (and not a child of this window), so it should be handled here.)
 | 
|---|
 | 554 |  
 | 
|---|
 | 555 |         ;"Click belongs to this window, so handle it.
 | 
|---|
 | 556 |  
 | 
|---|
 | 557 |         ;"Put default click handler code here...
 | 
|---|
 | 558 |         do FocusThis()
 | 
|---|
 | 559 |         new temp set temp=$$Conv2Frame(.LOC,TMGthis)  ;"ensure coordinates in TMGthis's frame
 | 
|---|
 | 560 |  
 | 
|---|
 | 561 |         new checkFrame set checkFrame=$$ClickOnFrame(.LOC)
 | 
|---|
 | 562 |         if checkFrame'="" do  goto HCDone
 | 
|---|
 | 563 |         . do fireEvent^TMGOOL(TMGthis,"FRAME CLICK",.LOC,.checkFrame)
 | 
|---|
 | 564 |  
 | 
|---|
 | 565 | HCDone
 | 
|---|
 | 566 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
 | 567 |  
 | 
|---|
 | 568 |  
 | 
|---|
 | 569 |  
 | 
|---|
 | 570 | HandleSClick(LOC)
 | 
|---|
 | 571 |         ;"Purpose: do something here with a mouse shift click.  Note: descendents can
 | 
|---|
 | 572 |         ;"        overwrite this function to customize their control.
 | 
|---|
 | 573 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 574 |         ;"          coordinates in LOCAL frame of refeernces.
 | 
|---|
 | 575 |         ;"          LOC("TOP")=
 | 
|---|
 | 576 |         ;"          LOC("LEFT")=
 | 
|---|
 | 577 |         ;"          LOC("HEIGHT")= ;"optional
 | 
|---|
 | 578 |         ;"          LOC("WIDTH")= ;"optional
 | 
|---|
 | 579 |         ;"          LOC("BOTTOM")= ;"optional
 | 
|---|
 | 580 |         ;"          LOC("RIGHT")=  ;"optional
 | 
|---|
 | 581 |         ;"Note: It has already been determined that the click belongs to this window
 | 
|---|
 | 582 |         ;"       (and not a child of this window), so it should be handled here.)
 | 
|---|
 | 583 |  
 | 
|---|
 | 584 |         ;"Click belongs to this window, so handle it.
 | 
|---|
 | 585 |  
 | 
|---|
 | 586 |         ;"Put default click handler code here...
 | 
|---|
 | 587 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 588 |         do proc^TMGOOL(parent,"SET FOCUSED",TMGthis)
 | 
|---|
 | 589 |  
 | 
|---|
 | 590 |         if $$getProp^TMGOOL(TMGthis,"STATE")="SELECTED" do
 | 
|---|
 | 591 |         . do setProp^TMGOOL(TMGthis,"STATE",0)
 | 
|---|
 | 592 |         else  do setProp^TMGOOL(TMGthis,"STATE","SELECTED")
 | 
|---|
 | 593 |  
 | 
|---|
 | 594 | ADCDone
 | 
|---|
 | 595 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
 | 596 |  
 | 
|---|
 | 597 |  
 | 
|---|
 | 598 | FmClick(LOC,flags)
 | 
|---|
 | 599 |         ;"Purpose: Handle a click on the frame.
 | 
|---|
 | 600 |         ;"        This sets RESIZING FLAGS property for later
 | 
|---|
 | 601 |         ;"        interpretation during window paints and mouse moves
 | 
|---|
 | 602 |         ;"Input:  LOC -- the coordinates of the triggering click.
 | 
|---|
 | 603 |         ;"        flags, containing:
 | 
|---|
 | 604 |         ;"         "T" if on top of frame
 | 
|---|
 | 605 |         ;"         "B" if on bottom of frame
 | 
|---|
 | 606 |         ;"         "L" if on left of frame
 | 
|---|
 | 607 |         ;"         "R" if on right of frame
 | 
|---|
 | 608 |         ;"         "TL","TR","BL","BR" for the corners
 | 
|---|
 | 609 |         ;"           note: no gaurantee regarding order: "TL" vs "LT"
 | 
|---|
 | 610 |  
 | 
|---|
 | 611 |         if $get(flags)="" goto AFMCDone
 | 
|---|
 | 612 |         if $$getProp^TMGOOL(TMGthis,"FRAME")'="SIZABLE" goto AFMCDone  ;"If not resizable, abort
 | 
|---|
 | 613 |  
 | 
|---|
 | 614 |         new curFlags set curFlags=$$getProp^TMGOOL(TMGthis,"RESIZING FLAGS")
 | 
|---|
 | 615 |         if (curFlags'="") set flags=""  ;"i.e. 2nd click on frame drops resizing
 | 
|---|
 | 616 |         do setProp^TMGOOL(TMGthis,"RESIZING FLAGS",flags)
 | 
|---|
 | 617 |         do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",1)
 | 
|---|
 | 618 |         new scrap set scrap=$$FlushMouseBuffer()
 | 
|---|
 | 619 |  
 | 
|---|
 | 620 | AFMCDone
 | 
|---|
 | 621 |         quit
 | 
|---|
 | 622 |  
 | 
|---|
 | 623 |  
 | 
|---|
 | 624 |  
 | 
|---|
 | 625 |  ;"------------------------------------------
 | 
|---|
 | 626 |  ;"Property Getters & Setters below
 | 
|---|
 | 627 |  ;"------------------------------------------
 | 
|---|
 | 628 |  
 | 
|---|
 | 629 | getLOC(TMGthis,PropName,outArray)
 | 
|---|
 | 630 |         ;"Purpose: to get LOC coordinates array of window
 | 
|---|
 | 631 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 632 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 633 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 634 |         ;"Note: because sometimes the getters do special things, I will alter
 | 
|---|
 | 635 |         ;"      this function so it doesn't bypass that code
 | 
|---|
 | 636 |         set outArray("TOP")=+$$getProp^TMGOOL(TMGthis,"TOP")
 | 
|---|
 | 637 |         set outArray("LEFT")=+$$getProp^TMGOOL(TMGthis,"LEFT")
 | 
|---|
 | 638 |         set outArray("WIDTH")=+$$getProp^TMGOOL(TMGthis,"WIDTH")
 | 
|---|
 | 639 |         set outArray("HEIGHT")=+$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
 | 640 |         set outArray("STATE")=+$$getProp^TMGOOL(TMGthis,"STATE")
 | 
|---|
 | 641 |         ;"merge outArray=@TMGthis@("PROP","LOC")
 | 
|---|
 | 642 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 643 |         set outArray("FRAME")=parent
 | 
|---|
 | 644 |         quit 0 ;"discarable result.
 | 
|---|
 | 645 |  
 | 
|---|
 | 646 | setTop(TMGthis,PropName,Top)
 | 
|---|
 | 647 |         ;"Purpose: to set TOP coordinates of window
 | 
|---|
 | 648 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 649 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 650 |         ;"       Top -- the coordinates of the TOP.  0 is top of screen
 | 
|---|
 | 651 |         set Top=$get(Top,0)
 | 
|---|
 | 652 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 653 |         new height
 | 
|---|
 | 654 |         if parent'="SCREEN" set height=$$getProp^TMGOOL(parent,"HEIGHT")
 | 
|---|
 | 655 |         else  set height=9999
 | 
|---|
 | 656 |         if (Top>-1)&(Top'>height) do
 | 
|---|
 | 657 |         . set @TMGthis@("PROP","LOC","TOP")=Top
 | 
|---|
 | 658 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
 | 659 |  
 | 
|---|
 | 660 | getTop(TMGthis,PropName,outArray)
 | 
|---|
 | 661 |         ;"Purpose: to get TOP coordinates of window
 | 
|---|
 | 662 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 663 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 664 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 665 |         new result set result=""
 | 
|---|
 | 666 |         new align set align=$$getProp^TMGOOL(TMGthis,"ALIGN")
 | 
|---|
 | 667 |         if (align="TOP")!(align="LEFT")!(align="RIGHT") do
 | 
|---|
 | 668 |         . set result=1
 | 
|---|
 | 669 |         else  if (align="BOTTOM") do
 | 
|---|
 | 670 |         . new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 671 |         . new PH set PH=$$getProp^TMGOOL(parent,"HEIGHT")
 | 
|---|
 | 672 |         . new H set H=$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
 | 673 |         . set result=(PH-1)-H
 | 
|---|
 | 674 |         else  do
 | 
|---|
 | 675 |         . set result=$get(@TMGthis@("PROP","LOC","TOP"))
 | 
|---|
 | 676 |  
 | 
|---|
 | 677 |         set outArray=result
 | 
|---|
 | 678 |         quit result
 | 
|---|
 | 679 |  
 | 
|---|
 | 680 | setLeft(TMGthis,PropName,Left)
 | 
|---|
 | 681 |         ;"Window member function (with no return value, i.e. a procedure)
 | 
|---|
 | 682 |         ;"Purpose: to set LEFT coordinates of window
 | 
|---|
 | 683 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 684 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 685 |         ;"       Left -- the coordinates of the LEFT.  0 is left of screen
 | 
|---|
 | 686 |         set Left=$get(Left,0)
 | 
|---|
 | 687 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 688 |         new width
 | 
|---|
 | 689 |         if parent'="SCREEN" set width=$$getProp^TMGOOL(parent,"WIDTH")
 | 
|---|
 | 690 |         else  set width=9999
 | 
|---|
 | 691 |         ;"if (Left>-1)&(Left<IOM) do
 | 
|---|
 | 692 |         if (Left<width) do
 | 
|---|
 | 693 |         . set @TMGthis@("PROP","LOC","LEFT")=Left
 | 
|---|
 | 694 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
 | 695 |  
 | 
|---|
 | 696 | getLeft(TMGthis,PropName,outArray)
 | 
|---|
 | 697 |         ;"Purpose: to get LEFT coordinates of window
 | 
|---|
 | 698 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 699 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 700 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 701 |  
 | 
|---|
 | 702 |         new result set result=""
 | 
|---|
 | 703 |         new align set align=$$getProp^TMGOOL(TMGthis,"ALIGN")
 | 
|---|
 | 704 |         if (align="TOP")!(align="LEFT")!(align="BOTTOM") do
 | 
|---|
 | 705 |         . set result=1
 | 
|---|
 | 706 |         else  if (align="RIGHT") do
 | 
|---|
 | 707 |         . new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 708 |         . new PW set PW=$$getProp^TMGOOL(parent,"WIDTH")
 | 
|---|
 | 709 |         . new W set W=$$getProp^TMGOOL(TMGthis,"WIDTH")
 | 
|---|
 | 710 |         . set result=(PW-1)-W
 | 
|---|
 | 711 |         else  do
 | 
|---|
 | 712 |         . set result=$get(@TMGthis@("PROP","LOC","LEFT"))
 | 
|---|
 | 713 |  
 | 
|---|
 | 714 |         set outArray=result
 | 
|---|
 | 715 |         quit result
 | 
|---|
 | 716 |  
 | 
|---|
 | 717 |  
 | 
|---|
 | 718 | setWidth(TMGthis,PropName,Width)
 | 
|---|
 | 719 |         ;"Window member function (with no return value, i.e. a procedure)
 | 
|---|
 | 720 |         ;"Purpose: to set WIDTH coordinates of window
 | 
|---|
 | 721 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 722 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 723 |         ;"       Width -- the coordinates of the WIDTH.
 | 
|---|
 | 724 |         ;"Note: Width means ADDITIONAL columns of size in addition to left column.
 | 
|---|
 | 725 |         ;"      Thus a vertical sizer bar has a height of '0', which really
 | 
|---|
 | 726 |         ;"      displays as a single column.  Confusing, but necessary
 | 
|---|
 | 727 |         set Width=$get(Width,0)
 | 
|---|
 | 728 |         if (Width>-1) do
 | 
|---|
 | 729 |         . set @TMGthis@("PROP","LOC","WIDTH")=Width
 | 
|---|
 | 730 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
 | 731 |  
 | 
|---|
 | 732 |  
 | 
|---|
 | 733 | getWidth(TMGthis,PropName,outArray)
 | 
|---|
 | 734 |         ;"Purpose: to get WIDTH coordinates of window
 | 
|---|
 | 735 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 736 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 737 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 738 |  
 | 
|---|
 | 739 |         ;"NOTE: this doesn't account for overlapping alignments.  For example, when
 | 
|---|
 | 740 |         ;"     A Hscroll is aligned to the bottom, and a Vscroller is alligned to
 | 
|---|
 | 741 |         ;"     the right, then they both think that they occupy the bottom-right
 | 
|---|
 | 742 |         ;"     corner.  I need to fix this later.  It will need to take into account
 | 
|---|
 | 743 |         ;"     the z-order (or something) of the children.
 | 
|---|
 | 744 |  
 | 
|---|
 | 745 |         new result set result=""
 | 
|---|
 | 746 |         new align set align=$$getProp^TMGOOL(TMGthis,"ALIGN")
 | 
|---|
 | 747 |         if (align="TOP")!(align="BOTTOM") do
 | 
|---|
 | 748 |         . new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 749 |         . set result=$$getProp^TMGOOL(parent,"WIDTH")
 | 
|---|
 | 750 |         . set result=result-1  ;"shrink inside parent's frame (yes, 1 is correct)
 | 
|---|
 | 751 |         else  do  ;"(align="NONE")!(align="LEFT")!(align="RIGHT")
 | 
|---|
 | 752 |         . set result=$get(@TMGthis@("PROP","LOC","WIDTH"))
 | 
|---|
 | 753 |  
 | 
|---|
 | 754 |         set outArray=result
 | 
|---|
 | 755 |         quit result
 | 
|---|
 | 756 |  
 | 
|---|
 | 757 |  
 | 
|---|
 | 758 | setHeight(TMGthis,PropName,Height)
 | 
|---|
 | 759 |         ;"Window member function (with no return value, i.e. a procedure)
 | 
|---|
 | 760 |         ;"Purpose: to set WIDTH coordinates of window
 | 
|---|
 | 761 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 762 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 763 |         ;"       Height -- the coordinates of the HEIGHT.
 | 
|---|
 | 764 |         ;"Note: Height means ADDITIONAL rows of size in addition to top row.
 | 
|---|
 | 765 |         ;"      Thus a horizontal sizer bar has a height of '0', which really
 | 
|---|
 | 766 |         ;"      displays as a single row.  Confusing, but necessary
 | 
|---|
 | 767 |         set Height=$get(Height)
 | 
|---|
 | 768 |         if (Height>-1) do
 | 
|---|
 | 769 |         . set @TMGthis@("PROP","LOC","HEIGHT")=Height
 | 
|---|
 | 770 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
 | 771 |  
 | 
|---|
 | 772 |  
 | 
|---|
 | 773 | getHeight(TMGthis,PropName,outArray)
 | 
|---|
 | 774 |         ;"Purpose: to get HEIGHT coordinates of window
 | 
|---|
 | 775 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 776 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 777 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 778 |         new result set result=""
 | 
|---|
 | 779 |         new align set align=$$getProp^TMGOOL(TMGthis,"ALIGN")
 | 
|---|
 | 780 |         if (align="LEFT")!(align="RIGHT") do
 | 
|---|
 | 781 |         . new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 782 |         . new PH set PH=$$getProp^TMGOOL(parent,"HEIGHT")
 | 
|---|
 | 783 |         . ;"new H set H=$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
 | 784 |         . ;"set result=PH-H-1
 | 
|---|
 | 785 |         . set result=PH-1
 | 
|---|
 | 786 |         else  do   ;"(align="NONE")!(align="TOP")!(align="BOTTOM")
 | 
|---|
 | 787 |         . set result=$get(@TMGthis@("PROP","LOC","HEIGHT"))
 | 
|---|
 | 788 |  
 | 
|---|
 | 789 |         set outArray=result
 | 
|---|
 | 790 |         quit result
 | 
|---|
 | 791 |  
 | 
|---|
 | 792 |  
 | 
|---|
 | 793 | setTLBR(Top,Left,Bottom,Right)
 | 
|---|
 | 794 |         ;"Purpose to set the Top,Left,Bottom,Right vales for object
 | 
|---|
 | 795 |         new width,height
 | 
|---|
 | 796 |         set width=Right-Left
 | 
|---|
 | 797 |         set height=Bottom-Top
 | 
|---|
 | 798 |         new scrap set scrap=$$setTLHW(.Top,.Left,.height,.width)
 | 
|---|
 | 799 |         quit 0
 | 
|---|
 | 800 |  
 | 
|---|
 | 801 | setTLHW(Top,Left,Height,Width)
 | 
|---|
 | 802 |         ;"Purpose: to set the Top,Left,Height,Width values for object
 | 
|---|
 | 803 |         ;"Results: 1 if change made, 0 if not change made
 | 
|---|
 | 804 |         new result set result=0
 | 
|---|
 | 805 |         if +$get(Width)<1 set Width=1
 | 
|---|
 | 806 |         if +$get(Height)<1 set Height=1
 | 
|---|
 | 807 |         new LOC set LOC=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
 | 808 |         if $get(LOC("TOP"))'=Top do setProp^TMGOOL(TMGthis,"TOP",.Top) set result=1
 | 
|---|
 | 809 |         if $get(LOC("LEFT"))'=Left do setProp^TMGOOL(TMGthis,"LEFT",.Left) set result=1
 | 
|---|
 | 810 |         if $get(LOC("WIDTH"))'=Width do setProp^TMGOOL(TMGthis,"WIDTH",Width) set result=1
 | 
|---|
 | 811 |         if $get(LOC("HEIGHT"))'=Height do setProp^TMGOOL(TMGthis,"HEIGHT",Height) set result=1
 | 
|---|
 | 812 |         quit result
 | 
|---|
 | 813 |  
 | 
|---|
 | 814 | setState(TMGthis,PropName,State)
 | 
|---|
 | 815 |         ;"Purpose: to set STATE property of window
 | 
|---|
 | 816 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 817 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 818 |         ;"       State -- object State
 | 
|---|
 | 819 |         set @TMGthis@("PROP","LOC","STATE")=$get(State)
 | 
|---|
 | 820 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
 | 821 |  
 | 
|---|
 | 822 | getState(TMGthis,PropName,outArray)
 | 
|---|
 | 823 |         ;"Purpose: to get TOP coordinates of window
 | 
|---|
 | 824 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 825 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 826 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 827 |         set outArray=$get(@TMGthis@("PROP","LOC","STATE"))
 | 
|---|
 | 828 |         quit $get(@TMGthis@("PROP","LOC","STATE"))
 | 
|---|
 | 829 |  
 | 
|---|
 | 830 |  
 | 
|---|
 | 831 | setParent(TMGthis,PropName,Parent)
 | 
|---|
 | 832 |         ;"Purpose: to link this object to a parent object, setting PARENT property
 | 
|---|
 | 833 |         ;"Note: Do NOT set PARENT directly.  Use this function, which will
 | 
|---|
 | 834 |         ;"      perform additional tasks associated with linking.
 | 
|---|
 | 835 |         ;"      Parents will OWN child (i.e. be responsible for their destruction), and
 | 
|---|
 | 836 |         ;"      also manage the placement and painting of the children.
 | 
|---|
 | 837 |         ;"Input: Parent -- the NAME (e.g. pWin) of parent to link to
 | 
|---|
 | 838 |         do proc^TMGOOL(Parent,"ACCEPT CHILD",TMGthis)
 | 
|---|
 | 839 |         set @TMGthis@("PROP","PARENT")=Parent
 | 
|---|
 | 840 |         quit ;"<-- required not return value for property setter.
 | 
|---|
 | 841 |  
 | 
|---|
 | 842 |  
 | 
|---|
 | 843 | getParent(TMGthis,PropName,outArray)
 | 
|---|
 | 844 |         ;"Purpose: to get TOP coordinates of window
 | 
|---|
 | 845 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
 | 846 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
 | 847 |         ;"       outArray -- PASSED BY REFERENCE.  An standardized output array
 | 
|---|
 | 848 |         set outArray=$get(@TMGthis@("PROP","PARENT"))
 | 
|---|
 | 849 |         if outArray="" set outArray="SCREEN"
 | 
|---|
 | 850 |         quit outArray
 | 
|---|
 | 851 |  
 | 
|---|
 | 852 |  
 | 
|---|
 | 853 | getNeedsRepaint(TMGthis,PropName,outArray)
 | 
|---|
 | 854 |         ;"Purpose: To determine if this object, or any of it's children need repainting
 | 
|---|
 | 855 |         ;"results: 1 if TMGthis needs repainting.  2 if a child needs repainting.
 | 
|---|
 | 856 |  
 | 
|---|
 | 857 |         new result set result=""
 | 
|---|
 | 858 |         new num set num=""
 | 
|---|
 | 859 |         set result=$get(@TMGthis@("PROP","NEEDS REPAINT"))
 | 
|---|
 | 860 |         if result=1 set outArray(TMGthis)=1 goto GNRPDone
 | 
|---|
 | 861 |         ;"Here query any children and see if they need repainting
 | 
|---|
 | 862 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)!(+result>0)  do
 | 
|---|
 | 863 |         . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 864 |         . if child="" quit
 | 
|---|
 | 865 |         . new tempResult
 | 
|---|
 | 866 |         . set tempResult=$$getNeedsRepaint(child,"NEEDS REPAINT",.outArray)
 | 
|---|
 | 867 |         . if tempResult>0 set result=2
 | 
|---|
 | 868 |         . if result>0 set outArray(child)=1
 | 
|---|
 | 869 |  
 | 
|---|
 | 870 | GNRPDone
 | 
|---|
 | 871 |         set outArray=result
 | 
|---|
 | 872 |         quit result
 | 
|---|
 | 873 |  
 | 
|---|
 | 874 |  ;"------------------------------------------
 | 
|---|
 | 875 |  ;"Private functions below
 | 
|---|
 | 876 |  ;"------------------------------------------
 | 
|---|
 | 877 |  
 | 
|---|
 | 878 | setLOC(LOC,T,L,W,H)
 | 
|---|
 | 879 |         ;"Purpose: to create a LOC array from T (top), L(left) ... coords
 | 
|---|
 | 880 |         ;"Input: LOC -- pass by reference.  The output array
 | 
|---|
 | 881 |         ;"       T --> "TOP" etc.
 | 
|---|
 | 882 |         ;"results: none
 | 
|---|
 | 883 |         kill LOC
 | 
|---|
 | 884 |         set LOC("TOP")=+$get(T)
 | 
|---|
 | 885 |         set LOC("LEFT")=+$get(L)
 | 
|---|
 | 886 |         set LOC("WIDTH")=+$get(W)
 | 
|---|
 | 887 |         set LOC("HEIGHT")=+$get(H)
 | 
|---|
 | 888 |         set LOC("BOTTOM")=+$get(T)++$get(H)
 | 
|---|
 | 889 |         set LOC("RIGHT")=+$get(L)++$get(W)
 | 
|---|
 | 890 |         quit
 | 
|---|
 | 891 |  
 | 
|---|
 | 892 |  
 | 
|---|
 | 893 | getPCoords(TMGthis,PT,PL,PB,PR)
 | 
|---|
 | 894 |         ;"Purpose: to get, in screen coordinates, the coordinates of the parent of TMGthis
 | 
|---|
 | 895 |         ;"Input: TMGthis : the THIS reference
 | 
|---|
 | 896 |         ;"       PT,PL,PR,PB -- PASS BY REFERENCE, these are OUT PARAMETERS
 | 
|---|
 | 897 |         ;"        note: these coordinates are in the SCREEN frame of reference
 | 
|---|
 | 898 |         ;"results: none
 | 
|---|
 | 899 |  
 | 
|---|
 | 900 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 901 |         new pScrn set pScrn=$$GetScrn()
 | 
|---|
 | 902 |         set scrap=$$getProp^TMGOOL(parent,"LOC",.PLOC)
 | 
|---|
 | 903 |         set scrap=$$Conv2Frame(.PLOC,"SCREEN")
 | 
|---|
 | 904 |  
 | 
|---|
 | 905 |         set PT=+$get(PLOC("TOP")),PL=+$get(PLOC("LEFT"))
 | 
|---|
 | 906 |         set PR=+$get(PLOC("RIGHT")),PB=$get(PLOC("BOTTOM"))
 | 
|---|
 | 907 |         if parent'=pScrn do  ;"scrink to INSIDE parent
 | 
|---|
 | 908 |         . set PT=PT+1,PL=PL+1,PR=PR-1,PB=PB-1
 | 
|---|
 | 909 |         if PT<0 set PT=0
 | 
|---|
 | 910 |         if PL<0 set PL=0
 | 
|---|
 | 911 |         quit
 | 
|---|
 | 912 |  
 | 
|---|
 | 913 | ClickOnFrame(LOC)
 | 
|---|
 | 914 |         ;"Purpose: to determine IF click occured on the boundries (frame) of this object
 | 
|---|
 | 915 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 916 |         ;"          coordinates in LOCAL frame of refeernces.
 | 
|---|
 | 917 |         ;"          LOC("TOP")=
 | 
|---|
 | 918 |         ;"          LOC("LEFT")=
 | 
|---|
 | 919 |         ;"          LOC("HEIGHT")= ;"optional
 | 
|---|
 | 920 |         ;"          LOC("WIDTH")= ;"optional
 | 
|---|
 | 921 |         ;"          LOC("BOTTOM")= ;"optional
 | 
|---|
 | 922 |         ;"          LOC("RIGHT")=  ;"optional
 | 
|---|
 | 923 |         ;"Results: "" = not on frame
 | 
|---|
 | 924 |         ;"         "T" if on top of frame
 | 
|---|
 | 925 |         ;"         "B" if on bottom of frame
 | 
|---|
 | 926 |         ;"         "L" if on left of frame
 | 
|---|
 | 927 |         ;"         "R" if on right of frame
 | 
|---|
 | 928 |         ;"         "TL","TR","BL","BR" for the corners
 | 
|---|
 | 929 |         ;"           note: no gaurantee regarding order: "TL" vs "LT"
 | 
|---|
 | 930 |  
 | 
|---|
 | 931 |         ;"new scrap set scrap=$$ConvInsideSelf(.LOC)
 | 
|---|
 | 932 |         set result=""
 | 
|---|
 | 933 |         if LOC("TOP")=0 set result=result_"T"
 | 
|---|
 | 934 |         if LOC("TOP")=$$getProp^TMGOOL(TMGthis,"HEIGHT") set result=result_"B"
 | 
|---|
 | 935 |         if LOC("LEFT")=0 set result=result_"L"
 | 
|---|
 | 936 |         if LOC("LEFT")=$$getProp^TMGOOL(TMGthis,"WIDTH") set result=result_"R"
 | 
|---|
 | 937 |  
 | 
|---|
 | 938 |         quit result
 | 
|---|
 | 939 |  
 | 
|---|
 | 940 | IsFocused(child)
 | 
|---|
 | 941 |         ;"Purpose: to determine if the specified child is the focused child
 | 
|---|
 | 942 |         ;"Input: child -- OPTIONAL.  the name/ref of the child to compare
 | 
|---|
 | 943 |         ;"         If child="" then function will return if TMGthis is focused
 | 
|---|
 | 944 |         ;"         in parent's child list.
 | 
|---|
 | 945 |         ;"Results: 1 if child is currently the focused child, 0 otherwise.
 | 
|---|
 | 946 |         ;"         if child="", then 1 if TMGthis is focused, 0 otherwise
 | 
|---|
 | 947 |  
 | 
|---|
 | 948 |         ;"Note: so there are two types of use:
 | 
|---|
 | 949 |         ;"   $$IsFocused(child)  <-- is child focused for TMGthis
 | 
|---|
 | 950 |         ;"   $$IsFocused() <---- is TMGthis focused for it's parent
 | 
|---|
 | 951 |  
 | 
|---|
 | 952 |         set child=$get(child,"")
 | 
|---|
 | 953 |         new result set result=""
 | 
|---|
 | 954 |         if child="" do
 | 
|---|
 | 955 |         . new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 956 |         . set child=TMGthis
 | 
|---|
 | 957 |         . new TMGthis set TMGthis=parent
 | 
|---|
 | 958 |         . set result=$$IsFocused(child)
 | 
|---|
 | 959 |         else  do
 | 
|---|
 | 960 |         . set result=($$getFocused()=child)
 | 
|---|
 | 961 |  
 | 
|---|
 | 962 |         quit result
 | 
|---|
 | 963 |  
 | 
|---|
 | 964 |  
 | 
|---|
 | 965 | setFocused(child)
 | 
|---|
 | 966 |         ;"Purpose: to set a child's status to focused, and effect it ensure visible
 | 
|---|
 | 967 |         ;"         by bringing it to the top of the z-order
 | 
|---|
 | 968 |         ;"Input: child -- the name/ref of the child to set as focused
 | 
|---|
 | 969 |  
 | 
|---|
 | 970 |         if $get(child)="" goto SFDone
 | 
|---|
 | 971 |         if $$getFocused()=child goto SFDone  ;"don't refocus if there already.
 | 
|---|
 | 972 |         do UnfocusCur()
 | 
|---|
 | 973 |  
 | 
|---|
 | 974 |         new curZ set curZ=$$GetNumChild(child)
 | 
|---|
 | 975 |         if curZ'>0 goto SFDone
 | 
|---|
 | 976 |  
 | 
|---|
 | 977 |         new num set num=""
 | 
|---|
 | 978 |         new lastValid set lastValid=0
 | 
|---|
 | 979 |         for  do  quit:(+num'>0)
 | 
|---|
 | 980 |         . set lastValid=+num
 | 
|---|
 | 981 |         . set num=$order(@TMGthis@("CHILDREN",num))
 | 
|---|
 | 982 |         set @TMGthis@("CHILDREN",lastValid+1,child)=""
 | 
|---|
 | 983 |         kill @TMGthis@("CHILDREN",curZ)
 | 
|---|
 | 984 |         do ListPack^TMGMISC($name(@TMGthis@("CHILDREN")))
 | 
|---|
 | 985 |         set @TMGthis@("CHILDREN","FOCUSED")=$$GetNumChild(child)
 | 
|---|
 | 986 |         do setProp^TMGOOL(child,"NEEDS REPAINT",1)
 | 
|---|
 | 987 | SFDone
 | 
|---|
 | 988 |         quit 0
 | 
|---|
 | 989 |  
 | 
|---|
 | 990 |  
 | 
|---|
 | 991 | getFocused()
 | 
|---|
 | 992 |         ;"returns currently focused child name/ref
 | 
|---|
 | 993 |         new focusNum
 | 
|---|
 | 994 |         set focusNum=+$get(@TMGthis@("CHILDREN","FOCUSED"))
 | 
|---|
 | 995 |         quit $$GetChild(focusNum)
 | 
|---|
 | 996 |  
 | 
|---|
 | 997 |  
 | 
|---|
 | 998 | FocusThis()
 | 
|---|
 | 999 |         ;"Purpose: to set TMGthis as focused for parent
 | 
|---|
 | 1000 |         new parent set parent=$$getProp^TMGOOL(TMGthis,"PARENT")
 | 
|---|
 | 1001 |         do proc^TMGOOL(parent,"SET FOCUSED",TMGthis)
 | 
|---|
 | 1002 |         quit
 | 
|---|
 | 1003 |  
 | 
|---|
 | 1004 |  
 | 
|---|
 | 1005 | UnfocusCur()
 | 
|---|
 | 1006 |         ;"returns: unfocuses currently focused object
 | 
|---|
 | 1007 |         new focusNum
 | 
|---|
 | 1008 |         set focusNum=+$get(@TMGthis@("CHILDREN","FOCUSED"))
 | 
|---|
 | 1009 |         if focusNum>0 do
 | 
|---|
 | 1010 |         . new child set child=$$GetChild(focusNum)
 | 
|---|
 | 1011 |         . do setProp^TMGOOL(child,"NEEDS REPAINT",1)
 | 
|---|
 | 1012 |         . set @TMGthis@("CHILDREN","FOCUSED")=""
 | 
|---|
 | 1013 |         quit
 | 
|---|
 | 1014 |  
 | 
|---|
 | 1015 |  
 | 
|---|
 | 1016 | GetNumChild(child,objectName)
 | 
|---|
 | 1017 |         ;"Returns the z-order for the given child
 | 
|---|
 | 1018 |         ;"Input: child -- the name/ref of the child to seek
 | 
|---|
 | 1019 |         ;"       objectName -- OPTIONAL.  Default is 'TMGthis'
 | 
|---|
 | 1020 |         ;"              The name of the object holding children
 | 
|---|
 | 1021 |         ;"Results: the z-order, or 0 if not found
 | 
|---|
 | 1022 |  
 | 
|---|
 | 1023 |         new num set num=""
 | 
|---|
 | 1024 |         new done set done=0
 | 
|---|
 | 1025 |         set objectName=$get(objectName,TMGthis)
 | 
|---|
 | 1026 |         if (objectName="")!(+objectName=objectName) do  goto GNCDone
 | 
|---|
 | 1027 | X1      .  new temp set temp=1
 | 
|---|
 | 1028 |         for  set num=$order(@objectName@("CHILDREN",num)) quit:(+num'>0)  do  quit:(done=1)
 | 
|---|
 | 1029 |         . if child=$order(@objectName@("CHILDREN",num,"")) set done=1
 | 
|---|
 | 1030 | GNCDone
 | 
|---|
 | 1031 |         quit +num
 | 
|---|
 | 1032 |  
 | 
|---|
 | 1033 |  
 | 
|---|
 | 1034 | GetChild(num)
 | 
|---|
 | 1035 |         ;"Returns child ref/name at num z-order
 | 
|---|
 | 1036 |         quit $order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 1037 |  
 | 
|---|
 | 1038 |  
 | 
|---|
 | 1039 | GetContained(LOC)
 | 
|---|
 | 1040 |         ;"Purpose: To get the name/ref of the child containing coordinates
 | 
|---|
 | 1041 |         ;"Input: LOC -- a location array:
 | 
|---|
 | 1042 |         ;"        LOC("TOP")=top
 | 
|---|
 | 1043 |         ;"        LOC("LEFT")=left
 | 
|---|
 | 1044 |         ;"results: name/ref of the child containing coordinates
 | 
|---|
 | 1045 |  
 | 
|---|
 | 1046 |         new result set result=""
 | 
|---|
 | 1047 |         new num set num=""
 | 
|---|
 | 1048 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)
 | 
|---|
 | 1049 |         ;"Now count backward
 | 
|---|
 | 1050 |         for  set num=$order(@TMGthis@("CHILDREN",num),-1) quit:(+num'>0)!(result'="")  do
 | 
|---|
 | 1051 |         . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 1052 |         . if child="" quit
 | 
|---|
 | 1053 |         . if $$fn^TMGOOL(child,"CONTAINS COORDS",.LOC)=0 quit
 | 
|---|
 | 1054 |         . set result=child
 | 
|---|
 | 1055 |  
 | 
|---|
 | 1056 |         quit result
 | 
|---|
 | 1057 |  
 | 
|---|
 | 1058 |  
 | 
|---|
 | 1059 | CheckPaint
 | 
|---|
 | 1060 |         ;"Purpose: to see if any children need repainting.  If so, repaint.
 | 
|---|
 | 1061 |         ;"Note: Only MainWindow should be getting to this point.
 | 
|---|
 | 1062 |         ;"      Also, Paint is not called for MainWindow (i.e. don't put a border on the main screen)
 | 
|---|
 | 1063 |  
 | 
|---|
 | 1064 |         ;"do SETCLIP^TMGXGF(0,0,IOSL,IOM)
 | 
|---|
 | 1065 |  
 | 
|---|
 | 1066 |         new paintAllChildren set paintAllChildren=0
 | 
|---|
 | 1067 |         ;"Note: Every time THIS is painted, all children are also painted.
 | 
|---|
 | 1068 |         ;"      But there may be times with THIS doesn't need repainting, but
 | 
|---|
 | 1069 |         ;"      just one of the children will need painting alone.
 | 
|---|
 | 1070 |         if $$getProp^TMGOOL(TMGthis,"NEEDS REPAINT")=1 do  ;"1=paint this, 2=paint a child
 | 
|---|
 | 1071 |         . set paintAllChildren=1
 | 
|---|
 | 1072 |         . ;"Draw a frame to white out entire screen.
 | 
|---|
 | 1073 |         . do CLEAR^TMGXGF(0,0,IOSL,IOM) ;"clear screen portion TOP,LEFT,BOTTOM,RIGHT
 | 
|---|
 | 1074 |         . do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",0)  ;"flag screen as total repainted
 | 
|---|
 | 1075 |  
 | 
|---|
 | 1076 |         ;"Note: 0=back-most window  (bigger numbers painted last)
 | 
|---|
 | 1077 |         new num set num=""
 | 
|---|
 | 1078 |         for  set num=$order(@TMGthis@("CHILDREN",num)) quit:(+num'>0)  do
 | 
|---|
 | 1079 |         . new child set child=$order(@TMGthis@("CHILDREN",num,""))
 | 
|---|
 | 1080 |         . if child="" quit
 | 
|---|
 | 1081 |         . new sameLoc,LOC,ldArray
 | 
|---|
 | 1082 |         . new scrap set scrap=$$getProp^TMGOOL(child,"LOC",.LOC)
 | 
|---|
 | 1083 |         . set scrap=$$getProp^TMGOOL(child,"LAST DRAW",.ldArray)
 | 
|---|
 | 1084 |         . set sameLoc=$$CompArray^TMGMISC("LOC","ldArray")
 | 
|---|
 | 1085 |         . new tempWho
 | 
|---|
 | 1086 |         . new needsPaint set needsPaint=$$getProp^TMGOOL(child,"NEEDS REPAINT",.tempWho)
 | 
|---|
 | 1087 |         . if (sameLoc=0)!(needsPaint>0)!(paintAllChildren=1) do
 | 
|---|
 | 1088 | CP2     . . do proc^TMGOOL(child,"PAINT")
 | 
|---|
 | 1089 |         . . do setProp^TMGOOL(child,"LAST DRAW",.LOC)
 | 
|---|
 | 1090 |  
 | 
|---|
 | 1091 |         quit
 | 
|---|
 | 1092 |  
 | 
|---|
 | 1093 |  
 | 
|---|
 | 1094 | parentPath(fromFrame,toFrame,outArray)
 | 
|---|
 | 1095 |         ;"Purpose: to enumerate the successive parent when going from 'from' frame
 | 
|---|
 | 1096 |         ;"         to the 'to' frame.
 | 
|---|
 | 1097 |         ;"Input: fromFrame,toFrame -- the name/ref of TMGWGOJ objects for frames
 | 
|---|
 | 1098 |         ;"       outArray -- PASS BY REFERENCE.  See format below:
 | 
|---|
 | 1099 |         ;"Output: outArray is filled as below:
 | 
|---|
 | 1100 |         ;"          outArray(1,fromFrame)=""
 | 
|---|
 | 1101 |         ;"          outArray(2,parent of fromFrame)=""
 | 
|---|
 | 1102 |         ;"          outArray(3,grandparent of fromFrame)=""
 | 
|---|
 | 1103 |         ;"          outArray(4,greatgrandparent of fromFrame)=""
 | 
|---|
 | 1104 |         ;"          ...
 | 
|---|
 | 1105 |         ;"results: none
 | 
|---|
 | 1106 |  
 | 
|---|
 | 1107 |         kill outArray
 | 
|---|
 | 1108 |         new num set num=2
 | 
|---|
 | 1109 |         new toFound set toFound=0
 | 
|---|
 | 1110 |         new curFrame set curFrame=fromFrame
 | 
|---|
 | 1111 |         for  do  quit:(curFrame="")!(curFrame=toFrame)!(curFrame="SCREEN")
 | 
|---|
 | 1112 |         . set curFrame=$$getProp^TMGOOL(curFrame,"PARENT")
 | 
|---|
 | 1113 |         . if curFrame="" quit
 | 
|---|
 | 1114 |         . if curFrame=toFrame set toFound=1
 | 
|---|
 | 1115 |         . set outArray(num,curFrame)="",num=num+1
 | 
|---|
 | 1116 |         if toFound=0 kill outArray
 | 
|---|
 | 1117 |         if $data(outArray)>0 set outArray(1,fromFrame)=""
 | 
|---|
 | 1118 |         quit
 | 
|---|
 | 1119 |  
 | 
|---|
 | 1120 |  
 | 
|---|
 | 1121 | convPath(LOC,pathArray)
 | 
|---|
 | 1122 |         ;"Purpose: to succesively translate coordinate systems for each entry in the
 | 
|---|
 | 1123 |         ;"         path array (as prepaired by parentPath)
 | 
|---|
 | 1124 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 1125 |         ;"             LOC("TOP")=
 | 
|---|
 | 1126 |         ;"             LOC("LEFT")=
 | 
|---|
 | 1127 |         ;"             LOC("HEIGHT")= ;"optional
 | 
|---|
 | 1128 |         ;"             LOC("WIDTH")= ;"optional
 | 
|---|
 | 1129 |         ;"             LOC("BOTTOM")=
 | 
|---|
 | 1130 |         ;"             LOC("RIGHT")=
 | 
|---|
 | 1131 |         ;"             LOC("FRAME")=Frame of reference for these coordinates
 | 
|---|
 | 1132 |         ;"                              Note: frame should typically be the same as
 | 
|---|
 | 1133 |         ;"                              the PARENT of the current object
 | 
|---|
 | 1134 |         ;"          targetFrame=the frame of refernce to change to.
 | 
|---|
 | 1135 |         ;"Input: pathArray -- PASS BY REFERENCE. format:
 | 
|---|
 | 1136 |         ;"          pathArray(1,initialFrame)=""
 | 
|---|
 | 1137 |         ;"          pathArray(2,parent of fromFrame)=""
 | 
|---|
 | 1138 |         ;"          pathArray(3,grandparent of fromFrame)=""
 | 
|---|
 | 1139 |         ;"          pathArray(4,greatgrandparent of fromFrame)=""
 | 
|---|
 | 1140 |         ;"          ...
 | 
|---|
 | 1141 |         ;"          ALSO: pathArray=direction (1 or -1) to effect translations
 | 
|---|
 | 1142 |         ;"             towards a parent frame (1) vs. a child frame (-1)
 | 
|---|
 | 1143 |         ;"Results: none
 | 
|---|
 | 1144 |         ;"Output:  Input variables are modified as OUT PARAMETERS
 | 
|---|
 | 1145 |         ;"          LOC("TOP") is modified
 | 
|---|
 | 1146 |         ;"          LOC("LEFT") is modified
 | 
|---|
 | 1147 |         ;"          LOC("HEIGHT")=unchanged
 | 
|---|
 | 1148 |         ;"          LOC("WIDTH")=unchanged
 | 
|---|
 | 1149 |         ;"          LOC("BOTTOM") is updated
 | 
|---|
 | 1150 |         ;"          LOC("RIGHT") is updated
 | 
|---|
 | 1151 |         ;"          LOC("FRAME") is updated
 | 
|---|
 | 1152 |  
 | 
|---|
 | 1153 |         new curFrame set curFrame=$get(LOC("FRAME"))
 | 
|---|
 | 1154 |         if curFrame="" goto CpDone  ;"unable to convert if not initial frame specified.
 | 
|---|
 | 1155 |         new direction set direction=+$get(pathArray)
 | 
|---|
 | 1156 |         if direction=0 goto CpDone
 | 
|---|
 | 1157 |  
 | 
|---|
 | 1158 |         new Top set Top=+$get(LOC("TOP"))
 | 
|---|
 | 1159 |         new Left set Left=+$get(LOC("LEFT"))
 | 
|---|
 | 1160 |  
 | 
|---|
 | 1161 |         new num set num=1
 | 
|---|
 | 1162 |         if direction=-1 set num=$order(pathArray(""),-1)
 | 
|---|
 | 1163 |         if $order(pathArray(num,""))'=curFrame goto CpStore  ;"not in correct initial frame
 | 
|---|
 | 1164 |  
 | 
|---|
 | 1165 |         new lfTop,lfLeft,loopFrame
 | 
|---|
 | 1166 |         for  do  quit:(loopFrame="")
 | 
|---|
 | 1167 |         . set loopFrame=$order(pathArray(num,"")),num=num+direction
 | 
|---|
 | 1168 |         . if (loopFrame="") quit
 | 
|---|
 | 1169 |         . if (direction=-1)&(loopFrame=curFrame) quit
 | 
|---|
 | 1170 |         . set lfTop=$$getProp^TMGOOL(loopFrame,"TOP")*direction
 | 
|---|
 | 1171 |         . set lfLeft=$$getProp^TMGOOL(loopFrame,"LEFT")*direction
 | 
|---|
 | 1172 |         . set Top=Top+lfTop
 | 
|---|
 | 1173 |         . set Left=Left+lfLeft
 | 
|---|
 | 1174 |         . set LOC("FRAME")=loopFrame
 | 
|---|
 | 1175 |  
 | 
|---|
 | 1176 | CpStore
 | 
|---|
 | 1177 |         ;"Store data back into array
 | 
|---|
 | 1178 |         set LOC("TOP")=Top
 | 
|---|
 | 1179 |         set LOC("LEFT")=Left
 | 
|---|
 | 1180 |         set LOC("BOTTOM")=Top+$get(LOC("HEIGHT"))
 | 
|---|
 | 1181 |         set LOC("RIGHT")=Left+$get(LOC("WIDTH"))
 | 
|---|
 | 1182 |  
 | 
|---|
 | 1183 | CpDone
 | 
|---|
 | 1184 |         quit
 | 
|---|
 | 1185 |  
 | 
|---|
 | 1186 |  
 | 
|---|
 | 1187 | getPath(LOC,targetFrame,pathArray)
 | 
|---|
 | 1188 |         ;"Purpose: to create a pathArray from current frame (stored in LOC) to
 | 
|---|
 | 1189 |         ;"         the targetFrame.  targetFrame may be an ancestor, or descendent
 | 
|---|
 | 1190 |         ;"         of the current frame.
 | 
|---|
 | 1191 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
 | 1192 |         ;"             LOC("TOP")=
 | 
|---|
 | 1193 |         ;"             LOC("LEFT")=
 | 
|---|
 | 1194 |         ;"             LOC("HEIGHT")= ;"optional
 | 
|---|
 | 1195 |         ;"             LOC("WIDTH")= ;"optional
 | 
|---|
 | 1196 |         ;"             LOC("BOTTOM")=
 | 
|---|
 | 1197 |         ;"             LOC("RIGHT")=
 | 
|---|
 | 1198 |         ;"             LOC("FRAME")=Frame of reference for these coordinates
 | 
|---|
 | 1199 |         ;"                              Note: frame should typically be the same as
 | 
|---|
 | 1200 |         ;"                              the PARENT of the current object
 | 
|---|
 | 1201 |         ;"          targetFrame=the frame of refernce to change to.
 | 
|---|
 | 1202 |         ;"          outArray -- PASS BY REFERENCE.  See format below:
 | 
|---|
 | 1203 |         ;"Output: pathArray is filled as below:
 | 
|---|
 | 1204 |         ;"          pathArray(1,curFrame)=""
 | 
|---|
 | 1205 |         ;"          pathArray(2,next translation frame (child/parent of current))=""
 | 
|---|
 | 1206 |         ;"          pathArray(3,next translation frame (child/parent of current))=""
 | 
|---|
 | 1207 |         ;"          ...
 | 
|---|
 | 1208 |  
 | 
|---|
 | 1209 |         new curFrame set curFrame=$get(LOC("FRAME"))
 | 
|---|
 | 1210 |         if curFrame="" goto gpDone
 | 
|---|
 | 1211 |         ;"First see if targetFrame is an ancestor of curFrame
 | 
|---|
 | 1212 |         do parentPath(curFrame,targetFrame,.pathArray)
 | 
|---|
 | 1213 |         if ($data(pathArray)>0)!(curFrame=targetFrame) do  goto gpDone ;"success
 | 
|---|
 | 1214 |         . set pathArray=1
 | 
|---|
 | 1215 |         ;"Now see if targetFrame is a descendent of curFrame
 | 
|---|
 | 1216 |         do parentPath(targetFrame,curFrame,.pathArray)
 | 
|---|
 | 1217 |         if $data(pathArray)=0 goto gpDone ;"failure
 | 
|---|
 | 1218 |         set pathArray=-1 ;"reverse direction
 | 
|---|
 | 1219 | gpDone
 | 
|---|
 | 1220 |         quit
 | 
|---|
 | 1221 |  
 | 
|---|
 | 1222 |  
 | 
|---|
 | 1223 |  
 | 
|---|