| 1 | ;+ |
|---|
| 2 | ; NAME: |
|---|
| 3 | ; FSC_DROPLIST |
|---|
| 4 | ; |
|---|
| 5 | ; PURPOSE: |
|---|
| 6 | ; |
|---|
| 7 | ; The purpose of this compound widget is to provide an alternative |
|---|
| 8 | ; to the DROPLIST widget offered in the IDL distribution. What has |
|---|
| 9 | ; always annoyed me about a droplist is that you can't get the current |
|---|
| 10 | ; "value" of a droplist easily. This compound widget makes this and |
|---|
| 11 | ; other tasks much easier. |
|---|
| 12 | ; |
|---|
| 13 | ; AUTHOR: |
|---|
| 14 | ; |
|---|
| 15 | ; FANNING SOFTWARE CONSULTING |
|---|
| 16 | ; David Fanning, Ph.D. |
|---|
| 17 | ; 1645 Sheely Drive |
|---|
| 18 | ; Fort Collins, CO 80526 USA |
|---|
| 19 | ; Phone: 970-221-0438 |
|---|
| 20 | ; E-mail: davidf@dfanning.com |
|---|
| 21 | ; Coyote's Guide to IDL Programming: http://www.dfanning.com/ |
|---|
| 22 | ; |
|---|
| 23 | ; CATEGORY: |
|---|
| 24 | ; |
|---|
| 25 | ; General programming. |
|---|
| 26 | ; |
|---|
| 27 | ; CALLING SEQUENCE: |
|---|
| 28 | ; |
|---|
| 29 | ; droplistObj = FSC_Droplist(parent, Title='Animals: ", Value=['Dog'. 'Cat', 'Coyote'], Index=2) |
|---|
| 30 | ; |
|---|
| 31 | ; The return value of the FSC_Droplist (droplistObj in this example) is |
|---|
| 32 | ; an object reference. Interaction with the droplist will occur through |
|---|
| 33 | ; object methods. |
|---|
| 34 | ; |
|---|
| 35 | ; INPUT PARAMETERS: |
|---|
| 36 | ; |
|---|
| 37 | ; parent -- The parent widget ID of the compound widget. Required. |
|---|
| 38 | ; |
|---|
| 39 | ; INPUT KEYWORDS: |
|---|
| 40 | ; |
|---|
| 41 | ; Any keyword that is appropriate for the Widget_Droplist function can be used. |
|---|
| 42 | ; In addition, these keywords are explicitly defined. |
|---|
| 43 | ; |
|---|
| 44 | ; EVENT_FUNC -- Set this keyword to the name of an Event Handler Function. |
|---|
| 45 | ; EVENT_PRO -- Set this keyword to the name of an Event Handler Procedure. |
|---|
| 46 | ; FORMAT -- A format specifier for the "format" of the values in the droplist. |
|---|
| 47 | ; INDEX -- The index number of the current selection. |
|---|
| 48 | ; SPACES -- A two-element array that indicates the number of blank spaces to be added |
|---|
| 49 | ; to the the beginning and end of the formatted values. If a single number |
|---|
| 50 | ; is provided, this number of blank spaces is added to both the beginning |
|---|
| 51 | ; and the end of the value. |
|---|
| 52 | ; TITLE -- The title of the droplist widget. |
|---|
| 53 | ; UNAME -- The user name of the droplist widget. (Only available in IDL 5.2 and higher.) |
|---|
| 54 | ; UVALUE -- The normal "user value" of the droplist. |
|---|
| 55 | ; VALUE -- An array of the droplist "selections". May be any data type. |
|---|
| 56 | ; |
|---|
| 57 | ; COMMON BLOCKS: |
|---|
| 58 | ; |
|---|
| 59 | ; None. |
|---|
| 60 | ; |
|---|
| 61 | ; DEPENDENCIES: |
|---|
| 62 | ; |
|---|
| 63 | ; Requires ERROR_MESSAGE from the Coyote Library.. |
|---|
| 64 | ; |
|---|
| 65 | ; EVENT STRUCTURE: |
|---|
| 66 | ; |
|---|
| 67 | ; An event is returned each time the droplist value is changed. The event structure |
|---|
| 68 | ; is defined like this: |
|---|
| 69 | ; |
|---|
| 70 | ; event = { FSC_DROPLIST_EVENT, $ ; The name of the event structure. |
|---|
| 71 | ; ID: 0L, $ ; The ID of the compound widget's top-level base. |
|---|
| 72 | ; TOP: 0L, $ ; The widget ID of the top-level base of the hierarchy. |
|---|
| 73 | ; HANDLER: 0L, $ ; The event handler ID. Filled out by IDL. |
|---|
| 74 | ; INDEX: 0L, $ ; The index number of the current selection. |
|---|
| 75 | ; SELECTION:Ptr_New() $ ; A pointer to the current selection "value". |
|---|
| 76 | ; SELF:Obj_New() } ; The object reference of the compound widget. |
|---|
| 77 | ; |
|---|
| 78 | ; PUBLIC OBJECT METHODS: |
|---|
| 79 | ; |
|---|
| 80 | ; GetID -- A function with no arguments that returns the widget identifier |
|---|
| 81 | ; of the droplist widget. |
|---|
| 82 | ; |
|---|
| 83 | ; droplistID = droplistObj->GetID() |
|---|
| 84 | ; |
|---|
| 85 | ; GetIndex -- A function with no arguments that returns the index |
|---|
| 86 | ; number of the current droplist selection. |
|---|
| 87 | ; |
|---|
| 88 | ; currentIndex = droplistObj->GetIndex() |
|---|
| 89 | ; |
|---|
| 90 | ; GetSelection -- A function with no arguments that returns the current |
|---|
| 91 | ; droplist selection. |
|---|
| 92 | ; |
|---|
| 93 | ; currentSelection = droplistObj->GetSelection() |
|---|
| 94 | ; |
|---|
| 95 | ; GetUValue -- A function with no arguments that returns the "user value" |
|---|
| 96 | ; of the compound widget i.e., the value set with the UVALUE keyword). |
|---|
| 97 | ; |
|---|
| 98 | ; myUValue = droplistObj->GetUValue() |
|---|
| 99 | ; |
|---|
| 100 | ; GetValues -- A function with no arguments that returns the "values" or |
|---|
| 101 | ; "selections" for the droplist. |
|---|
| 102 | ; |
|---|
| 103 | ; possibleSelections = droplistObj->GetValues() |
|---|
| 104 | ; |
|---|
| 105 | ; Resize -- A procedure that sets the X screen size of the droplist. It is |
|---|
| 106 | ; defined like this: |
|---|
| 107 | ; |
|---|
| 108 | ; PRO Resize, newSize, ParentSize=parentSize |
|---|
| 109 | ; |
|---|
| 110 | ; The "newSize" keyword is the new X screen size. If this argument is |
|---|
| 111 | ; missing, the screen X size of the compound widget's parent is used. |
|---|
| 112 | ; The parentSize keyword is an output keyword that returns the X screen |
|---|
| 113 | ; size of the compound widget's parent. |
|---|
| 114 | ; |
|---|
| 115 | ; droplistObj->Resize, 400 |
|---|
| 116 | ; |
|---|
| 117 | ; Note that not all devices (e.g., X Windows devices) support droplist resizing. |
|---|
| 118 | ; |
|---|
| 119 | ; SetIndex -- A procedure that sets the current droplist selection based on |
|---|
| 120 | ; the given index. This is equivalent to Widget_Control, droplistID, Set_Droplist_Select=newIndex |
|---|
| 121 | ; |
|---|
| 122 | ; droplistObj->SetIndex, newIndex |
|---|
| 123 | ; |
|---|
| 124 | ; SetSelection -- Whereas a regular droplist widget can only be set by index |
|---|
| 125 | ; number, this compound widget can also be set by a "selection". The new selection |
|---|
| 126 | ; can be any data type and corresponds to one of the "values" of the droplist. |
|---|
| 127 | ; |
|---|
| 128 | ; droplistObj->SetSelection, newSelection |
|---|
| 129 | ; |
|---|
| 130 | ; SetValues -- Sets the possible selections of the droplist widget. The CurrentIndex keyword |
|---|
| 131 | ; will allow the current index of the selection to be changed to: |
|---|
| 132 | ; |
|---|
| 133 | ; newChoices = ['dog', 'cat', 'coyote'] |
|---|
| 134 | ; droplistObj->SetValues, newChoices, CurrentIndex=2 |
|---|
| 135 | ; |
|---|
| 136 | ; |
|---|
| 137 | ; EXAMPLE: |
|---|
| 138 | ; |
|---|
| 139 | ; An example program is provided at the end of the FSC_DROPLIST code. To run it, |
|---|
| 140 | ; type these commands: |
|---|
| 141 | ; |
|---|
| 142 | ; IDL> .Compile FSC_DROPLIST |
|---|
| 143 | ; IDL> Example |
|---|
| 144 | ; |
|---|
| 145 | ; MODIFICATION HISTORY: |
|---|
| 146 | ; |
|---|
| 147 | ; Written by: David W Fanning, 17 Jan 2000. DWF. |
|---|
| 148 | ; Added FORMAT and SPACES keywords 28 April 2000. DWF. |
|---|
| 149 | ; Fixed a small problem with event processing when the EVENT_FUNC keyword |
|---|
| 150 | ; was used. 29 Dec 2000. DWF. |
|---|
| 151 | ; Attached the UNAME value to the TLB of the compound widget instead |
|---|
| 152 | ; of to the droplist widget itself. 11 Jan 2001. DWF. |
|---|
| 153 | ; Fixed a problem when the droplist was part of a modal widget and used the |
|---|
| 154 | ; EVENT_PRO keyword. 27 Oct 2003. DWF. |
|---|
| 155 | ; Added a SetValue method for setting all the values in the droplist at once. 12 Nov 2004. DWF. |
|---|
| 156 | ; Fixed type on line 346/ 6 Feb 2008. DWF. |
|---|
| 157 | ;- |
|---|
| 158 | ;########################################################################### |
|---|
| 159 | ; |
|---|
| 160 | ; LICENSE |
|---|
| 161 | ; |
|---|
| 162 | ; This software is OSI Certified Open Source Software. |
|---|
| 163 | ; OSI Certified is a certification mark of the Open Source Initiative. |
|---|
| 164 | ; |
|---|
| 165 | ; Copyright 2000-2008 Fanning Software Consulting |
|---|
| 166 | ; |
|---|
| 167 | ; This software is provided "as-is", without any express or |
|---|
| 168 | ; implied warranty. In no event will the authors be held liable |
|---|
| 169 | ; for any damages arising from the use of this software. |
|---|
| 170 | ; |
|---|
| 171 | ; Permission is granted to anyone to use this software for any |
|---|
| 172 | ; purpose, including commercial applications, and to alter it and |
|---|
| 173 | ; redistribute it freely, subject to the following restrictions: |
|---|
| 174 | ; |
|---|
| 175 | ; 1. The origin of this software must not be misrepresented; you must |
|---|
| 176 | ; not claim you wrote the original software. If you use this software |
|---|
| 177 | ; in a product, an acknowledgment in the product documentation |
|---|
| 178 | ; would be appreciated, but is not required. |
|---|
| 179 | ; |
|---|
| 180 | ; 2. Altered source versions must be plainly marked as such, and must |
|---|
| 181 | ; not be misrepresented as being the original software. |
|---|
| 182 | ; |
|---|
| 183 | ; 3. This notice may not be removed or altered from any source distribution. |
|---|
| 184 | ; |
|---|
| 185 | ; For more information on Open Source Software, visit the Open Source |
|---|
| 186 | ; web site: http://www.opensource.org. |
|---|
| 187 | ; |
|---|
| 188 | ;########################################################################### |
|---|
| 189 | ; |
|---|
| 190 | |
|---|
| 191 | |
|---|
| 192 | |
|---|
| 193 | PRO FSC_Droplist_Kill_Notify, droplistID |
|---|
| 194 | |
|---|
| 195 | ; This procedure is called automatically when the droplist is destroy. The |
|---|
| 196 | ; purpose is to destroy the self object so there are no memory leaks. |
|---|
| 197 | |
|---|
| 198 | Widget_Control,droplistID, Get_UValue=self |
|---|
| 199 | Obj_Destroy, self |
|---|
| 200 | END ;-------------------------------------------------------------------------- |
|---|
| 201 | |
|---|
| 202 | |
|---|
| 203 | FUNCTION FSC_Droplist::EventHandler, event |
|---|
| 204 | |
|---|
| 205 | ; This is the event handler method of the object. The purpose is to set the |
|---|
| 206 | ; object's current selection and index number. If an event handler has |
|---|
| 207 | ; been specified, a FSC_DROPLIST event is sent to the proper event handler. |
|---|
| 208 | |
|---|
| 209 | ; Set the current selection and index number. |
|---|
| 210 | |
|---|
| 211 | *self.selection = (*self.value)[event.index] |
|---|
| 212 | self.index = event.index |
|---|
| 213 | |
|---|
| 214 | ; If we need to send an event package the event up. Include both |
|---|
| 215 | ; the index number (what normal droplist events produce), the current |
|---|
| 216 | ; selection, and the self object reference. |
|---|
| 217 | |
|---|
| 218 | thisEvent = {FSC_Droplist_EVENT, ID:self.tlb, TOP:event.top, HANDLER:event.handler, $ |
|---|
| 219 | INDEX:self.index, SELECTION:self.selection, SELF:self} |
|---|
| 220 | |
|---|
| 221 | ; Send the event if requested. If it is requested, no events returned. |
|---|
| 222 | |
|---|
| 223 | IF self.event_pro NE "" THEN BEGIN |
|---|
| 224 | Call_Procedure, self.event_pro, thisEvent |
|---|
| 225 | thisEvent = 0 |
|---|
| 226 | IF Obj_Valid(self) EQ 0 THEN RETURN, thisEvent ; Modal widget destroyed. |
|---|
| 227 | ENDIF |
|---|
| 228 | |
|---|
| 229 | IF self.event_func NE "" THEN BEGIN |
|---|
| 230 | ok = Call_Function(self.event_func, thisEvent) |
|---|
| 231 | thisEvent = 0 |
|---|
| 232 | ENDIF |
|---|
| 233 | |
|---|
| 234 | RETURN, thisEvent |
|---|
| 235 | END ;-------------------------------------------------------------------------- |
|---|
| 236 | |
|---|
| 237 | |
|---|
| 238 | |
|---|
| 239 | FUNCTION FSC_Droplist_Events, event |
|---|
| 240 | |
|---|
| 241 | ; This is the droplist event handler. The purpose of this procedure is to |
|---|
| 242 | ; get the self object reference and call the object's own event method. |
|---|
| 243 | ; The event handler method will return 0 if an event handler procedure or |
|---|
| 244 | ; function has been called. Otherwise, it will return the event. |
|---|
| 245 | |
|---|
| 246 | Widget_Control, event.id, Get_UValue=self |
|---|
| 247 | theEvent = self->EventHandler(event) |
|---|
| 248 | RETURN, theEvent |
|---|
| 249 | END ;-------------------------------------------------------------------------- |
|---|
| 250 | |
|---|
| 251 | |
|---|
| 252 | |
|---|
| 253 | PRO FSC_Droplist::Sensitive, value |
|---|
| 254 | |
|---|
| 255 | ; This method makes the droplist sensitive (value=1) or insensitive (value=0). |
|---|
| 256 | |
|---|
| 257 | Widget_Control, self.droplistID, Sensitive=value |
|---|
| 258 | END ;-------------------------------------------------------------------------- |
|---|
| 259 | |
|---|
| 260 | |
|---|
| 261 | |
|---|
| 262 | PRO FSC_Droplist::Resize, newSize, ParentSize=parentSize |
|---|
| 263 | |
|---|
| 264 | ; This method resizes the droplist. If the variable "newSize" is not provided, |
|---|
| 265 | ; the new size is set by the parent widget's X screen size. This makes it possible |
|---|
| 266 | ; to have the droplist sized to fit it's parent base widget. |
|---|
| 267 | |
|---|
| 268 | ; Get the parent widget's geometry and X screen size. |
|---|
| 269 | |
|---|
| 270 | parentGeometry = Widget_Info(self.parent, /Geometry) |
|---|
| 271 | parentSize = parentGeometry.scr_xsize |
|---|
| 272 | |
|---|
| 273 | ; Has a size been provided? In not, use the parent's X screen size. |
|---|
| 274 | |
|---|
| 275 | IF N_Elements(newSize) EQ 0 THEN BEGIN |
|---|
| 276 | newSize = parentGeometry.scr_xsize |
|---|
| 277 | ENDIF |
|---|
| 278 | |
|---|
| 279 | ; Resize the droplist widget. |
|---|
| 280 | |
|---|
| 281 | Widget_Control, self.droplistID, Scr_XSize=newSize |
|---|
| 282 | END ;-------------------------------------------------------------------------- |
|---|
| 283 | |
|---|
| 284 | |
|---|
| 285 | |
|---|
| 286 | PRO FSC_Droplist::SetSelection, selection |
|---|
| 287 | |
|---|
| 288 | ; This method sets the current selection of the droplist by means of |
|---|
| 289 | ; the selection "value". With a normal droplist you must set the selection |
|---|
| 290 | ; by specifying an index number. |
|---|
| 291 | |
|---|
| 292 | ; Find the selection in the value. Return it's index number. |
|---|
| 293 | |
|---|
| 294 | IF N_Elements(selection) EQ 0 THEN selection = (*self.value)[0] |
|---|
| 295 | index = Where(StrUpCase( Strtrim(*self.value,2) ) EQ StrUpCase( StrTrim(selection,2) ), count) |
|---|
| 296 | |
|---|
| 297 | ; If you can't find the selection, print an error message. |
|---|
| 298 | |
|---|
| 299 | IF count EQ 0 THEN BEGIN |
|---|
| 300 | uname = Widget_Info(self.droplistID,/UName) |
|---|
| 301 | ok = Error_Message('No item with name "' + uname + ':' + $ |
|---|
| 302 | StrTrim(selection,2) + '" exists. Returning...') |
|---|
| 303 | RETURN |
|---|
| 304 | ENDIF |
|---|
| 305 | |
|---|
| 306 | ; Set the current index and selection for the object. |
|---|
| 307 | |
|---|
| 308 | index = 0 > index < (N_Elements(*self.value) - 1) |
|---|
| 309 | self.index = index |
|---|
| 310 | *self.selection = selection |
|---|
| 311 | |
|---|
| 312 | ; Set the current selection for the droplist widget. |
|---|
| 313 | |
|---|
| 314 | Widget_Control, self.droplistID, Set_Droplist_Select=self.index |
|---|
| 315 | END ;-------------------------------------------------------------------------- |
|---|
| 316 | |
|---|
| 317 | |
|---|
| 318 | |
|---|
| 319 | PRO FSC_Droplist::SetIndex, index |
|---|
| 320 | |
|---|
| 321 | ; This method sets the current selection by means of its index number. |
|---|
| 322 | |
|---|
| 323 | ; Make sure the index number is there and valid. |
|---|
| 324 | |
|---|
| 325 | IF N_Elements(index) EQ 0 THEN index = 0 |
|---|
| 326 | self.index = 0 > index < (N_Elements(*self.value) - 1) |
|---|
| 327 | |
|---|
| 328 | ; Set the current selection. |
|---|
| 329 | |
|---|
| 330 | *self.selection = (*self.value)[index] |
|---|
| 331 | |
|---|
| 332 | ; Set the selection on the droplist widget. |
|---|
| 333 | |
|---|
| 334 | Widget_Control, self.droplistID, Set_Droplist_Select=self.index |
|---|
| 335 | |
|---|
| 336 | END ;-------------------------------------------------------------------------- |
|---|
| 337 | |
|---|
| 338 | |
|---|
| 339 | |
|---|
| 340 | PRO FSC_Droplist::SetValues, theValues, CurrentIndex=currentIndex |
|---|
| 341 | |
|---|
| 342 | ; This method allows all the values in the droplist to be changed simultaneously. |
|---|
| 343 | |
|---|
| 344 | IF Ptr_Valid(self.value) THEN *self.value = theValues ELSE self.value = Ptr_New(theValues) |
|---|
| 345 | Widget_Control, self.droplistID, Set_Value=*self.value |
|---|
| 346 | |
|---|
| 347 | IF N_Elements(currentIndex) EQ 0 THEN currentIndex = self.index ELSE self.index = currentIndex < (N_Elements(theValues)-1) |
|---|
| 348 | IF currentIndex GT (N_Elements(*self.value)-1) THEN BEGIN |
|---|
| 349 | currentIndex = 0 |
|---|
| 350 | self.index = currentIndex |
|---|
| 351 | ENDIF |
|---|
| 352 | IF Ptr_Valid(self.selection) THEN *self.selection = (*self.value)[self.index] ELSE $ |
|---|
| 353 | self.selection = Ptr_New((*self.value)[self.index]) |
|---|
| 354 | Widget_Control, self.droplistID, Set_Droplist_Select=self.index |
|---|
| 355 | END ;-------------------------------------------------------------------------- |
|---|
| 356 | |
|---|
| 357 | |
|---|
| 358 | |
|---|
| 359 | FUNCTION FSC_Droplist::GetIndex |
|---|
| 360 | |
|---|
| 361 | ; This method returns the index number of the current selection. |
|---|
| 362 | |
|---|
| 363 | RETURN, self.index |
|---|
| 364 | END ;-------------------------------------------------------------------------- |
|---|
| 365 | |
|---|
| 366 | |
|---|
| 367 | |
|---|
| 368 | FUNCTION FSC_Droplist::GetSelection |
|---|
| 369 | |
|---|
| 370 | ; This method returns the "value" of the current selection. |
|---|
| 371 | |
|---|
| 372 | RETURN, *self.selection |
|---|
| 373 | END ;-------------------------------------------------------------------------- |
|---|
| 374 | |
|---|
| 375 | |
|---|
| 376 | |
|---|
| 377 | FUNCTION FSC_Droplist::GetValues |
|---|
| 378 | |
|---|
| 379 | ; This method returns the current "values" or "selections" of the droplist. |
|---|
| 380 | |
|---|
| 381 | RETURN, *self.value |
|---|
| 382 | END ;-------------------------------------------------------------------------- |
|---|
| 383 | |
|---|
| 384 | |
|---|
| 385 | |
|---|
| 386 | FUNCTION FSC_Droplist::GetUValue |
|---|
| 387 | |
|---|
| 388 | ; This method returns the "user value" of the droplist. |
|---|
| 389 | |
|---|
| 390 | RETURN, *self.storage |
|---|
| 391 | END ;-------------------------------------------------------------------------- |
|---|
| 392 | |
|---|
| 393 | |
|---|
| 394 | |
|---|
| 395 | FUNCTION FSC_Droplist::GetID |
|---|
| 396 | |
|---|
| 397 | ; This method returns the droplist widget identifier. |
|---|
| 398 | |
|---|
| 399 | RETURN, self.droplistID |
|---|
| 400 | END ;-------------------------------------------------------------------------- |
|---|
| 401 | |
|---|
| 402 | |
|---|
| 403 | |
|---|
| 404 | PRO FSC_Droplist::CLEANUP |
|---|
| 405 | |
|---|
| 406 | ; This is the object's cleanup method. Free's up all the pointers used in the |
|---|
| 407 | ; object. |
|---|
| 408 | |
|---|
| 409 | Ptr_Free, self.value |
|---|
| 410 | Ptr_Free, self.selection |
|---|
| 411 | Ptr_Free, self.storage |
|---|
| 412 | END ;-------------------------------------------------------------------------- |
|---|
| 413 | |
|---|
| 414 | |
|---|
| 415 | |
|---|
| 416 | FUNCTION FSC_Droplist::INIT, $ |
|---|
| 417 | parent, $ ; The widget ID of the droplist's parent widget. Required. |
|---|
| 418 | debug=debug, $ ; Turns full error handling on for INIT catch error handler. |
|---|
| 419 | Event_Func=event_func, $ ; The name of an event handler function. |
|---|
| 420 | Event_Pro=event_pro, $ ; The name of an event handler procedure. |
|---|
| 421 | _Extra=extra, $ ; A keyword that allows any droplist keyword to be used in initialization. |
|---|
| 422 | Format=format, $ ; The format of the "value" of the droplist. |
|---|
| 423 | Index=index, $ ; The index number of the current selection. |
|---|
| 424 | Spaces=spaces, $ ; Number of blank spaces to add to formatted "values". |
|---|
| 425 | Title=title, $ ; The text that goes in the TITLE of the droplist. |
|---|
| 426 | UName=uname, $ ; A user name. Left for the user of the cw_droplist program. |
|---|
| 427 | UValue=storage, $ ; A user value. Left for the user of the cw_droplist program. |
|---|
| 428 | Value=value ; The "value" or selections of the droplist. May be any data type. |
|---|
| 429 | |
|---|
| 430 | ; Catch any errors. |
|---|
| 431 | |
|---|
| 432 | Catch, theError |
|---|
| 433 | IF theError NE 0 THEN BEGIN |
|---|
| 434 | Catch, /Cancel |
|---|
| 435 | ok = Error_Message(!Error_State.Msg, Traceback=Keyword_Set(debug)) |
|---|
| 436 | RETURN, 0 |
|---|
| 437 | ENDIF |
|---|
| 438 | |
|---|
| 439 | ; This is the object's initialization method. |
|---|
| 440 | |
|---|
| 441 | IF N_Elements(parent) EQ 0 THEN BEGIN |
|---|
| 442 | ok = Error_Message('Parent parameter must be provided. Returning...') |
|---|
| 443 | RETURN, 0 |
|---|
| 444 | ENDIF |
|---|
| 445 | |
|---|
| 446 | ; Check for presence of keywords. |
|---|
| 447 | |
|---|
| 448 | IF N_Elements(title) EQ 0 THEN title = 'Selection: ' |
|---|
| 449 | IF N_Elements(value) EQ 0 THEN value = ['Dog', 'Cat', 'Coyote'] |
|---|
| 450 | IF N_Elements(storage) EQ 0 THEN storage = "" |
|---|
| 451 | IF N_Elements(index) EQ 0 THEN index = 0 |
|---|
| 452 | IF N_Elements(event_pro) EQ 0 THEN event_pro = "" |
|---|
| 453 | IF N_Elements(event_func) EQ 0 THEN event_func = "" |
|---|
| 454 | IF N_Elements(uname) EQ 0 THEN uname = "" |
|---|
| 455 | IF N_Elements(spaces) EQ 0 THEN BEGIN |
|---|
| 456 | forwardSpace = "" |
|---|
| 457 | trailingSpace = "" |
|---|
| 458 | ENDIF ELSE BEGIN |
|---|
| 459 | IF N_Elements(spaces) EQ 2 THEN BEGIN |
|---|
| 460 | IF spaces[0] LE 0 THEN forwardSpace = "" ELSE forwardSpace = String(Replicate(32B,spaces[0])) |
|---|
| 461 | IF spaces[1] LE 0 THEN trailingSpace = "" ELSE trailingSpace = String(Replicate(32B,spaces[1])) |
|---|
| 462 | ENDIF ELSE BEGIN |
|---|
| 463 | IF spaces[0] LE 0 THEN forwardSpace = "" ELSE forwardSpace = String(Replicate(32B,spaces[0])) |
|---|
| 464 | IF spaces[0] LE 0 THEN trailingSpace = "" ELSE trailingSpace = String(Replicate(32B,spaces[0])) |
|---|
| 465 | ENDELSE |
|---|
| 466 | ENDELSE |
|---|
| 467 | index = 0 > index < (N_Elements(value) - 1) |
|---|
| 468 | |
|---|
| 469 | ; Create the droplist widget. UName only available for IDL 5.2 and higher. |
|---|
| 470 | |
|---|
| 471 | IF Float(!Version.Release) GE 5.2 THEN BEGIN |
|---|
| 472 | |
|---|
| 473 | IF Keyword_Set(format) THEN theValue = String(value, Format=format) ELSE theValue = StrTrim(value,2) |
|---|
| 474 | self.tlb = Widget_Base(parent, UValue=storage, UName=uname) |
|---|
| 475 | self.droplistID = Widget_Droplist(self.tlb, $ |
|---|
| 476 | Title=title, $ |
|---|
| 477 | Value=forwardSpace + theValue + trailingSpace, $ |
|---|
| 478 | _Extra=extra, $ |
|---|
| 479 | Kill_Notify='FSC_Droplist_Kill_Notify', $ |
|---|
| 480 | Event_Func='FSC_Droplist_Events', $ |
|---|
| 481 | UValue=self) |
|---|
| 482 | |
|---|
| 483 | ENDIF ELSE BEGIN |
|---|
| 484 | |
|---|
| 485 | IF Keyword_Set(format) THEN theValue = String(value, Format=format) ELSE theValue = StrTrim(value,2) |
|---|
| 486 | self.tlb = Widget_Base(parent, UValue=storage) |
|---|
| 487 | self.droplistID = Widget_Droplist(self.tlb, $ |
|---|
| 488 | Title=title, $ |
|---|
| 489 | Value=forwardSpace + theValue + trailingSpace, $ |
|---|
| 490 | _Extra=extra, $ |
|---|
| 491 | Kill_Notify='FSC_Droplist_Kill_Notify', $ |
|---|
| 492 | Event_Func='FSC_Droplist_Events', $ |
|---|
| 493 | UValue=self) |
|---|
| 494 | |
|---|
| 495 | ENDELSE |
|---|
| 496 | |
|---|
| 497 | ; Set the current selection on the droplist. |
|---|
| 498 | |
|---|
| 499 | selection = Value[index] |
|---|
| 500 | Widget_Control, self.droplistID, Set_Droplist_Select=index |
|---|
| 501 | |
|---|
| 502 | ; Populate the object. |
|---|
| 503 | |
|---|
| 504 | self.storage = Ptr_New(storage) |
|---|
| 505 | self.index = index |
|---|
| 506 | self.title = title |
|---|
| 507 | self.parent = parent |
|---|
| 508 | self.selection = Ptr_New(selection) |
|---|
| 509 | self.event_func = event_func |
|---|
| 510 | self.event_pro = event_pro |
|---|
| 511 | self.value = Ptr_New(value) |
|---|
| 512 | |
|---|
| 513 | RETURN, 1 |
|---|
| 514 | END ;-------------------------------------------------------------------------- |
|---|
| 515 | |
|---|
| 516 | |
|---|
| 517 | |
|---|
| 518 | PRO FSC_Droplist__DEFINE |
|---|
| 519 | |
|---|
| 520 | struct = { FSC_Droplist, $ ; The FSC_DROPLIST object class definition. |
|---|
| 521 | title:"", $ ; The droplist title. |
|---|
| 522 | value:Ptr_New(), $ ; The values or selections on the droplist. |
|---|
| 523 | parent:0L, $ ; The widget identifer of the parent widget. |
|---|
| 524 | tlb:0L, $ ; The top-level base of the compound widget. . |
|---|
| 525 | droplistID:0L, $ ; The droplist widget identifier. |
|---|
| 526 | selection:Ptr_New(), $ ; The current droplist selection. |
|---|
| 527 | storage:Ptr_New(), $ ; The storage locaton for the "user value". |
|---|
| 528 | event_pro:"", $ ; The name of an event handler procedure. |
|---|
| 529 | event_func:"", $ ; The name of an event handler function. |
|---|
| 530 | index:0 $ ; The index number of the current selecton. |
|---|
| 531 | } |
|---|
| 532 | END ;-------------------------------------------------------------------------- |
|---|
| 533 | |
|---|
| 534 | |
|---|
| 535 | |
|---|
| 536 | FUNCTION FSC_Droplist, parent, Title=title, Value=value, _Extra=extra |
|---|
| 537 | |
|---|
| 538 | ; This is the compound widget function call. It's purpose is to |
|---|
| 539 | ; create the compound widget object and return it. |
|---|
| 540 | |
|---|
| 541 | RETURN, Obj_New('FSC_Droplist', parent, Title=title, Value=value, _Extra=extra) |
|---|
| 542 | END ;-------------------------------------------------------------------------- |
|---|
| 543 | |
|---|
| 544 | |
|---|
| 545 | |
|---|
| 546 | PRO Example_Events, event |
|---|
| 547 | Widget_Control, event.top, Get_UValue=droplists |
|---|
| 548 | thisEvent = Tag_Names(event, /Structure_Name) |
|---|
| 549 | CASE thisEvent OF |
|---|
| 550 | 'FSC_DROPLIST_EVENT': BEGIN |
|---|
| 551 | thisDroplist = event.self->GetUValue() |
|---|
| 552 | Print, "" |
|---|
| 553 | Print, thisDroplist + ' Selection: ', *event.selection |
|---|
| 554 | Print, thisDroplist + ' Index Number: ', event.index |
|---|
| 555 | ENDCASE |
|---|
| 556 | 'WIDGET_BUTTON': BEGIN |
|---|
| 557 | Widget_Control, event.id, Get_UValue=thisValue |
|---|
| 558 | CASE thisValue OF ; Set the droplists by "selection". |
|---|
| 559 | 'SET_DROPLIST1': droplists[0]->SetSelection, 'Coyote' |
|---|
| 560 | 'SET_DROPLIST2': droplists[1]->SetSelection, 99.8 |
|---|
| 561 | ELSE: Widget_Control, event.top, /Destroy |
|---|
| 562 | ENDCASE |
|---|
| 563 | ENDCASE |
|---|
| 564 | ENDCASE |
|---|
| 565 | END ;--------------------------------------------------------------------------- |
|---|
| 566 | |
|---|
| 567 | |
|---|
| 568 | PRO Example |
|---|
| 569 | |
|---|
| 570 | ; Droplist 1 is filled with string selections. |
|---|
| 571 | ; Droplist 2 is filled with number selections. |
|---|
| 572 | |
|---|
| 573 | tlb = Widget_Base(Title='FSC_Droplist Example', Column=1) |
|---|
| 574 | animals = ['Dog', 'Cat', 'Opposum', 'Coyote'] |
|---|
| 575 | numbers = [45.6, 18.3, 21.5, 99.8] |
|---|
| 576 | |
|---|
| 577 | ; Create the droplists. |
|---|
| 578 | |
|---|
| 579 | droplist1 = FSC_Droplist(tlb, Value=animals, Index=3, UValue='DROPLIST 1') |
|---|
| 580 | droplist2 = FSC_Droplist(tlb, Value=numbers, Index=1, UValue='DROPLIST 2', $ |
|---|
| 581 | Format='(F5.2)', Spaces=[2,0], Debug=1) |
|---|
| 582 | |
|---|
| 583 | ; Other widgets. |
|---|
| 584 | |
|---|
| 585 | button = Widget_Button(tlb, Value='Set Droplist 1 to "Coyote"', UValue='SET_DROPLIST1') |
|---|
| 586 | button = Widget_Button(tlb, Value='Set Droplist 2 to 99.8', UValue='SET_DROPLIST2') |
|---|
| 587 | button = Widget_Button(tlb, Value='Quit', UValue='QUIT') |
|---|
| 588 | |
|---|
| 589 | ; Resize the droplists. |
|---|
| 590 | |
|---|
| 591 | droplist1->Resize, 200 |
|---|
| 592 | droplist2->Resize, 200 |
|---|
| 593 | |
|---|
| 594 | Widget_Control, tlb, /Realize, Set_UValue=[droplist1, droplist2] |
|---|
| 595 | XManager, 'Example', tlb, Event_Handler='Example_Events', /No_Block |
|---|
| 596 | |
|---|
| 597 | ; Test of SetValues method: |
|---|
| 598 | ; Wait, 2 |
|---|
| 599 | ; newChoices = ['dog', 'cat', 'coyote'] |
|---|
| 600 | ; droplist1->SetValues, newChoices, CurrentIndex=2 |
|---|
| 601 | |
|---|
| 602 | END ;--------------------------------------------------------------------------- |
|---|