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 |
|
---|