| 1 | TMGWSBR1 ;TMG/kst/OO Scroll Bar ;05/10/07
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;05/10/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,"TMGWGOJ")
 | 
|---|
| 24 |  
 | 
|---|
| 25 |         ;"---------------------------------------------------------
 | 
|---|
| 26 |         ;"register PROCEDURES/FUNCTIONS
 | 
|---|
| 27 |         do regFn^TMGOOL(TMGthis,"PAINT","Paint^TMGWSBR1()")
 | 
|---|
| 28 |  
 | 
|---|
| 29 |         ;"---------------------------------------------------------
 | 
|---|
| 30 |         ;"Register Event Handlers
 | 
|---|
| 31 |         do regEvent^TMGOOL(TMGthis,"CLICK","HandleClick^TMGWSBR1(LOC)")   ;"override
 | 
|---|
| 32 |  
 | 
|---|
| 33 |         ;"---------------------------------------------------------------------
 | 
|---|
| 34 |         ;"Register Properties
 | 
|---|
| 35 |         do regProp^TMGOOL(TMGthis,"MAX VALUE",100,"setMax^TMGWSBR1")  ;"
 | 
|---|
| 36 |         do regProp^TMGOOL(TMGthis,"MIN VALUE",0,"setMin^TMGWSBR1")  ;"
 | 
|---|
| 37 |         do regProp^TMGOOL(TMGthis,"VALUE",50,"setValue^TMGWSBR1")  ;"
 | 
|---|
| 38 |         do regProp^TMGOOL(TMGthis,"PERCENT",50,"setPercent^TMGWSBR1")  ;"
 | 
|---|
| 39 |         do regProp^TMGOOL(TMGthis,"ORIENTATION","H")  ;"[H]ORIZ VS. [V]ERT
 | 
|---|
| 40 |  
 | 
|---|
| 41 |         ;"--------------------------------------------------------------------------------
 | 
|---|
| 42 |         ;"Optional initialization of some instance-specific variables.
 | 
|---|
| 43 |  
 | 
|---|
| 44 |  
 | 
|---|
| 45 |         ;"--------------------------------------------------------------------------------
 | 
|---|
| 46 |         ;"Startup code here...
 | 
|---|
| 47 |  
 | 
|---|
| 48 |         quit
 | 
|---|
| 49 |  
 | 
|---|
| 50 |  
 | 
|---|
| 51 | Destructor(instanceName)  ;"Module MUST have 'Destructor' procedure
 | 
|---|
| 52 |         ;"Purpose:  A destructor for object Widget
 | 
|---|
| 53 |         ;"              any needed clean up code would go here first.
 | 
|---|
| 54 |         ;"Input: instanceName -- the name of the object instance to be deleted.
 | 
|---|
| 55 |         ;"              This should be the value returned from defWidget
 | 
|---|
| 56 |         ;"Note: Don't actually delete the object here.  Just perform code needed to
 | 
|---|
| 57 |         ;"              save the object variables etc.  Anything neeed before the object
 | 
|---|
| 58 |         ;"              is deleted by delete^TMGOOL
 | 
|---|
| 59 |  
 | 
|---|
| 60 |         ;"-----------------
 | 
|---|
| 61 |  
 | 
|---|
| 62 |         ;" Here I would put code that needs to be called before destruction of the object.
 | 
|---|
| 63 |  
 | 
|---|
| 64 |         ;"-----------------
 | 
|---|
| 65 |  
 | 
|---|
| 66 |         quit
 | 
|---|
| 67 |  
 | 
|---|
| 68 |  
 | 
|---|
| 69 |  ;"------------------------------------------
 | 
|---|
| 70 |  ;"Object member functions below
 | 
|---|
| 71 |  ;"------------------------------------------
 | 
|---|
| 72 |  
 | 
|---|
| 73 |  ;"Note: A variable (with global scope) TMGthis is available as a 'this' pointer (this instance)
 | 
|---|
| 74 |  ;"Note: ALL members must have QUIT xx  (even if xx is meaningless, as in a procedure)
 | 
|---|
| 75 |  
 | 
|---|
| 76 | Paint()
 | 
|---|
| 77 |         ;"Purpose: To paint the scroolbar
 | 
|---|
| 78 |         ;"Input: instanceName -- the name/ref of this instance
 | 
|---|
| 79 |  
 | 
|---|
| 80 |         new T,L,B,R,H,W,LOC
 | 
|---|
| 81 |         new scrap set scrap=$$getProp^TMGOOL(TMGthis,"LOC",.LOC)
 | 
|---|
| 82 |         do proc^TMGOOL(TMGthis,"CONVERT TO FRAME",.LOC,"SCREEN")
 | 
|---|
| 83 |         set T=+$get(LOC("TOP")),L=+$get(LOC("LEFT"))
 | 
|---|
| 84 |         set B=+$get(LOC("BOTTOM")),R=+$get(LOC("RIGHT"))
 | 
|---|
| 85 |         set H=+$get(LOC("HEIGHT")),W=+$get(LOC("WIDTH"))
 | 
|---|
| 86 |  
 | 
|---|
| 87 |         new o set o=$$getProp^TMGOOL(TMGthis,"ORIENTATION")
 | 
|---|
| 88 |         new pct set pct=$$getProp^TMGOOL(TMGthis,"PERCENT")
 | 
|---|
| 89 |         new len set len=$select(o="H":(W),1:(H))
 | 
|---|
| 90 |         set len=len-1 ;"avoid overlap in bottom-right corner.
 | 
|---|
| 91 |         new tempS set tempS=$$getDispS(len,o,pct)
 | 
|---|
| 92 |  
 | 
|---|
| 93 |         if o="H" do SAY^TMGXGF(T,L,tempS)
 | 
|---|
| 94 |         else  do VSAY^TMGXGF(T,L,tempS)
 | 
|---|
| 95 |  
 | 
|---|
| 96 |         do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",0)  ;"flag as painted.
 | 
|---|
| 97 |  
 | 
|---|
| 98 |         quit 0
 | 
|---|
| 99 |  
 | 
|---|
| 100 |  
 | 
|---|
| 101 |  ;"------------------------------------------
 | 
|---|
| 102 |  ;"Property Getters & Setters below
 | 
|---|
| 103 |  ;"------------------------------------------
 | 
|---|
| 104 |  
 | 
|---|
| 105 | setMax(TMGthis,PropName,value)
 | 
|---|
| 106 |         ;"Purpose: to set MAX value possible for scroll bar
 | 
|---|
| 107 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
| 108 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
| 109 |         ;"       value -- value to set
 | 
|---|
| 110 |  
 | 
|---|
| 111 |         set @TMGthis@("PROP","MAX")=$get(value)
 | 
|---|
| 112 |         do setActualPct
 | 
|---|
| 113 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
| 114 |  
 | 
|---|
| 115 |  
 | 
|---|
| 116 | setMin(TMGthis,PropName,value)
 | 
|---|
| 117 |         ;"Purpose: to set MIN value possible for scroll bar
 | 
|---|
| 118 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
| 119 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
| 120 |         ;"       value -- value to set
 | 
|---|
| 121 |  
 | 
|---|
| 122 |         set @TMGthis@("PROP","MIN")=$get(value)
 | 
|---|
| 123 |         do setActualPct
 | 
|---|
| 124 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
| 125 |  
 | 
|---|
| 126 |  
 | 
|---|
| 127 | setValue(TMGthis,PropName,value)
 | 
|---|
| 128 |         ;"Purpose: to set value for scroll bar
 | 
|---|
| 129 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
| 130 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
| 131 |         ;"       value -- value to set
 | 
|---|
| 132 |  
 | 
|---|
| 133 |         new max,min
 | 
|---|
| 134 |         set max=$get(@TMGthis@("PROP","MAX"))
 | 
|---|
| 135 |         set min=$get(@TMGthis@("PROP","MIN"))
 | 
|---|
| 136 |         set value=+$get(value)
 | 
|---|
| 137 |         if (value'>max)&(value'<min) do
 | 
|---|
| 138 |         . set @TMGthis@("PROP","VALUE")=value
 | 
|---|
| 139 |         . do setActualPct
 | 
|---|
| 140 |         do setProp^TMGOOL(TMGthis,"NEEDS REPAINT",1)
 | 
|---|
| 141 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
| 142 |  
 | 
|---|
| 143 |  
 | 
|---|
| 144 | setPercent(TMGthis,PropName,pct)
 | 
|---|
| 145 |         ;"Purpose: to set percent value for scroll bar
 | 
|---|
| 146 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
| 147 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
| 148 |         ;"       pct -- value to set: expected input=0-100 (NOT 0.00-1.00)
 | 
|---|
| 149 |  
 | 
|---|
| 150 |         new max,min
 | 
|---|
| 151 |         set max=$get(@TMGthis@("PROP","MAX"))
 | 
|---|
| 152 |         set min=$get(@TMGthis@("PROP","MIN"))
 | 
|---|
| 153 |         set pct=+$get(pct)
 | 
|---|
| 154 |         if pct>100 set pct=100
 | 
|---|
| 155 |         else  if pct<0 set pct=0
 | 
|---|
| 156 |         new range set range=max-min
 | 
|---|
| 157 |         new value set value=(range*(pct/100))+min
 | 
|---|
| 158 |         set @TMGthis@("PROP","VALUE")=value
 | 
|---|
| 159 |         set @TMGthis@("PROP","PERCENT")=pct
 | 
|---|
| 160 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
| 161 |  
 | 
|---|
| 162 |  
 | 
|---|
| 163 | setOrient(TMGthis,PropName,value)
 | 
|---|
| 164 |         ;"Purpose: to set percent value for scroll bar
 | 
|---|
| 165 |         ;"Input: TMGthis -- a this pointer for properter setter.
 | 
|---|
| 166 |         ;"       PropName -- the name of the property -- not used here
 | 
|---|
| 167 |         ;"       pct -- value to set: expected input="H" or "V"
 | 
|---|
| 168 |  
 | 
|---|
| 169 |         set value=$$UP^XLFSTR($extract(value,1))
 | 
|---|
| 170 |         if (value="H")!(value="V") set @TMGthis@("PROP","ORIENTATION")=value
 | 
|---|
| 171 |         quit  ;"<-- required not return value for property setter.
 | 
|---|
| 172 |  
 | 
|---|
| 173 |  ;"------------------------------------------
 | 
|---|
| 174 |  ;"Event handlers below
 | 
|---|
| 175 |  ;"------------------------------------------
 | 
|---|
| 176 |  
 | 
|---|
| 177 | HandleClick(LOC)
 | 
|---|
| 178 |         ;"Purpose: do something here with a mouse click.  Note: descendents can
 | 
|---|
| 179 |         ;"        overwrite this function to customize their control.
 | 
|---|
| 180 |         ;"Input:    LOC -- PASS BY REFERNCE.  Expected input format:
 | 
|---|
| 181 |         ;"          coordinates in LOCAL frame of refeernces.
 | 
|---|
| 182 |         ;"          LOC("TOP")=
 | 
|---|
| 183 |         ;"          LOC("LEFT")=
 | 
|---|
| 184 |         ;"          LOC("HEIGHT")= ;"optional
 | 
|---|
| 185 |         ;"          LOC("WIDTH")= ;"optional
 | 
|---|
| 186 |         ;"          LOC("BOTTOM")= ;"optional
 | 
|---|
| 187 |         ;"          LOC("RIGHT")=  ;"optional
 | 
|---|
| 188 |         ;"Note: It has already been determined that the click belongs to this window
 | 
|---|
| 189 |         ;"       (and not a child of this window), so it should be handled here.)
 | 
|---|
| 190 |  
 | 
|---|
| 191 |         ;"Click belongs to this window, so handle it.
 | 
|---|
| 192 |  
 | 
|---|
| 193 |         ;"Put default click handler code here...
 | 
|---|
| 194 |  
 | 
|---|
| 195 |         do proc^TMGOOL(TMGthis,"CONVERT TO FRAME",.LOC,TMGthis)  ;"ensure coordinates in TMGthis's frame
 | 
|---|
| 196 |  
 | 
|---|
| 197 |         new L set L=$get(LOC("LEFT"))
 | 
|---|
| 198 |         new T set T=$get(LOC("TOP"))
 | 
|---|
| 199 |  
 | 
|---|
| 200 |         new orient set orient=$$getProp^TMGOOL(TMGthis,"ORIENTATION")
 | 
|---|
| 201 |         if orient="H" do
 | 
|---|
| 202 |         . new W set W=$$getProp^TMGOOL(TMGthis,"WIDTH")
 | 
|---|
| 203 |         . if L=0 do scrlMinus(1)
 | 
|---|
| 204 |         . ;"For line below:  why W-2?
 | 
|---|
| 205 |         . ;"  A: numbering starts at 0, so W seems 1 too long
 | 
|---|
| 206 |         . ;"    then subtract another 1 to avoid overlap with Vscroll bar
 | 
|---|
| 207 |         . else  if L=(W-2) do scrlPlus(1)
 | 
|---|
| 208 |         . else  do
 | 
|---|
| 209 |         . . new pos set pos=$$getMrkPos()
 | 
|---|
| 210 |         . . if L<pos do scrlPLeft
 | 
|---|
| 211 |         . . if L>pos do scrlPRight
 | 
|---|
| 212 |         else  if orient="V" do
 | 
|---|
| 213 |         . new H set H=$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
| 214 |         . if T=0 do scrlMinus(1)
 | 
|---|
| 215 |         . ;"For line below:  why H-1?
 | 
|---|
| 216 |         . ;"  A: numbering starts at 0, so H seems 1 too long
 | 
|---|
| 217 |         . ;"    no need to subtract another 1 re overlap, because Vscroller has corner
 | 
|---|
| 218 |         . else  if T=(H-2) do scrlPlus(1)
 | 
|---|
| 219 |         . else  do
 | 
|---|
| 220 |         . . new pos set pos=$$getMrkPos()
 | 
|---|
| 221 |         . . if T<pos do scrlPUp
 | 
|---|
| 222 |         . . if T>pos do scrlPDown
 | 
|---|
| 223 |  
 | 
|---|
| 224 |  
 | 
|---|
| 225 | HCDone
 | 
|---|
| 226 |         quit ;"<-- required: NO return value for event handler
 | 
|---|
| 227 |  
 | 
|---|
| 228 |  
 | 
|---|
| 229 |  
 | 
|---|
| 230 |  
 | 
|---|
| 231 |  ;"------------------------------------------
 | 
|---|
| 232 |  ;"Private functions below
 | 
|---|
| 233 |  ;"------------------------------------------
 | 
|---|
| 234 |  
 | 
|---|
| 235 | getMrkPos()
 | 
|---|
| 236 |         ;"Purpose: to get the graphical position of the marker on
 | 
|---|
| 237 |         ;"    the scroll bar.
 | 
|---|
| 238 |         new o set o=$$getProp^TMGOOL(TMGthis,"ORIENTATION")
 | 
|---|
| 239 |         new pct set pct=$$getProp^TMGOOL(TMGthis,"PERCENT")
 | 
|---|
| 240 |         new len set len=$select(o="H":(W),1:(H))
 | 
|---|
| 241 |         set len=len-1 ;"avoid overlap in bottom-right corner.
 | 
|---|
| 242 |         new tempS set tempS=$$getDispS(len,o,pct)
 | 
|---|
| 243 |         new s set s=$piece(tempS,"*",1)
 | 
|---|
| 244 |         quit $length(s)
 | 
|---|
| 245 |  
 | 
|---|
| 246 | scrlPLeft
 | 
|---|
| 247 |         ;"Purpose: to handle a request to scroll a page to the left
 | 
|---|
| 248 |         new W set W=$$getProp^TMGOOL(TMGthis,"WIDTH")
 | 
|---|
| 249 |         do scrlMinus(W)
 | 
|---|
| 250 |         quit
 | 
|---|
| 251 |  
 | 
|---|
| 252 | scrlPRight
 | 
|---|
| 253 |         ;"Purpose: to handle a request to scroll a page to the left
 | 
|---|
| 254 |         new W set W=$$getProp^TMGOOL(TMGthis,"WIDTH")
 | 
|---|
| 255 |         do scrlPlus(W)
 | 
|---|
| 256 |         quit
 | 
|---|
| 257 |  
 | 
|---|
| 258 | scrlPUp
 | 
|---|
| 259 |         ;"Purpose: to handle a request to scroll a page to the left
 | 
|---|
| 260 |         new H set H=$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
| 261 |         do scrlMinus(H)
 | 
|---|
| 262 |         quit
 | 
|---|
| 263 |  
 | 
|---|
| 264 | scrlPDown
 | 
|---|
| 265 |         ;"Purpose: to handle a request to scroll a page to the left
 | 
|---|
| 266 |         new H set H=$$getProp^TMGOOL(TMGthis,"HEIGHT")
 | 
|---|
| 267 |         do scrlPlus(H)
 | 
|---|
| 268 |         quit
 | 
|---|
| 269 |  
 | 
|---|
| 270 | scrlMinus(num)
 | 
|---|
| 271 |         ;"Purpose: to handle a request to scroll to the minus direction (left, or up)
 | 
|---|
| 272 |         new value set value=$$getProp^TMGOOL(TMGthis,"VALUE")
 | 
|---|
| 273 |         set value=value-num
 | 
|---|
| 274 |         do setProp^TMGOOL(TMGthis,"VALUE",value)
 | 
|---|
| 275 |         quit
 | 
|---|
| 276 |  
 | 
|---|
| 277 | scrlPlus(num)
 | 
|---|
| 278 |         ;"Purpose: to handle a request to scroll to the plus direction (right or down)
 | 
|---|
| 279 |         new value set value=$$getProp^TMGOOL(TMGthis,"VALUE")
 | 
|---|
| 280 |         set value=value+num
 | 
|---|
| 281 |         do setProp^TMGOOL(TMGthis,"VALUE",value)
 | 
|---|
| 282 |         quit
 | 
|---|
| 283 |  
 | 
|---|
| 284 |  
 | 
|---|
| 285 |  
 | 
|---|
| 286 | setActualPct
 | 
|---|
| 287 |         ;"Purpose: to set the value of PERCENT to match current values
 | 
|---|
| 288 |  
 | 
|---|
| 289 |         new max,min,value
 | 
|---|
| 290 |         set max=$get(@TMGthis@("PROP","MAX"))
 | 
|---|
| 291 |         set min=$get(@TMGthis@("PROP","MIN"))
 | 
|---|
| 292 |         set value=$get(@TMGthis@("PROP","VALUE"))
 | 
|---|
| 293 |  
 | 
|---|
| 294 |         new range set range=max-min
 | 
|---|
| 295 |         new pos set pos=value-min
 | 
|---|
| 296 |         new pct set pct=0
 | 
|---|
| 297 |  
 | 
|---|
| 298 |         if range'=0 set pct=((pos/range)*100)
 | 
|---|
| 299 |         set @TMGthis@("PROP","PERCENT")=pct
 | 
|---|
| 300 |         quit
 | 
|---|
| 301 |  
 | 
|---|
| 302 |  
 | 
|---|
| 303 | getDispS(len,o,pct)
 | 
|---|
| 304 |         ;"Purpose: get a string that represents the scroll bar
 | 
|---|
| 305 |         ;"    e.g. '<---#------>'
 | 
|---|
| 306 |         ;"    or if orientation is vertical: '^||||#|||v'
 | 
|---|
| 307 |         ;"Input: len -- the total length of the string to be returned
 | 
|---|
| 308 |         ;"       o -- orientation: 'H' or 'V'
 | 
|---|
| 309 |         ;"       pct -- the percent position
 | 
|---|
| 310 |         ;"results: returns string, or "" if length<3
 | 
|---|
| 311 |  
 | 
|---|
| 312 |         new result set result=""
 | 
|---|
| 313 |         set len=$get(len)-2  ;"shrink for arrows on ends
 | 
|---|
| 314 |         if len'>0 goto gDSDone
 | 
|---|
| 315 |         set o=$get(o,"H")
 | 
|---|
| 316 |         set pct=+$get(pct)
 | 
|---|
| 317 |         ;"if o="H" set len=len-1 ;"avoid overlap with HORIZ bar at the corner
 | 
|---|
| 318 |  
 | 
|---|
| 319 |         new bar
 | 
|---|
| 320 |         ;"if o="V" set $piece(bar,$get(IOVL,"|"),len+2)=" "
 | 
|---|
| 321 |         ;"else  set $piece(bar,$get(IOHL,"-"),len+2)=" "
 | 
|---|
| 322 |         if o="V" set $piece(bar,"|",len+2)=" "
 | 
|---|
| 323 |         else  set $piece(bar,"-",len+2)=" "
 | 
|---|
| 324 |  
 | 
|---|
| 325 |         new pre,post
 | 
|---|
| 326 |         set pre=(len*pct\100),post=len-pre
 | 
|---|
| 327 |         set result=result_$extract(bar,1,pre-1)_"*"_$extract(bar,1,post)
 | 
|---|
| 328 |  
 | 
|---|
| 329 |         if o="V" set result="^"_result_"v"
 | 
|---|
| 330 |         else  set result="<"_result_">"
 | 
|---|
| 331 |  
 | 
|---|
| 332 | gDSDone
 | 
|---|
| 333 |         quit result
 | 
|---|
| 334 |  
 | 
|---|
| 335 |  
 | 
|---|
| 336 |  
 | 
|---|