[796] | 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 |
|
---|