The following procedures build a simple application that allows the user to select data from a table, plotting the data in a draw window and optionally displaying the data values in a text widget. The user can switch the table between standard and disjoint selection modes.

This example is included in the file in the examples/doc/widgets subdirectory of the IDL distribution. Run this example procedure by entering table_widget_example1 at the IDL command prompt or view the file in an IDL Editor window by entering .EDIT See Running the Example Code if IDL does not run the program as expected.

; Event-handler routine
PRO table_widget_example1_event, ev
  ; Retrieve the anonymous structure contained in the user value of
  ; the top-level base widget.
  ; Retrieve the table's selection mode and selection.
  disjoint = WIDGET_INFO(stash.table, /TABLE_DISJOINT_SELECTION)
  selection = WIDGET_INFO(stash.table, /TABLE_SELECT)
  ; Check to see whether a selection exists, setting the
  ; variable 'hasSelection' accordingly.
  IF (selection[0] ne -1) THEN hasSelection = 1 $
    ELSE hasSelection = 0
  ; If there is a selection, get the value.
  IF (hasSelection) THEN WIDGET_CONTROL, stash.table, $     GET_VALUE=value, /USE_TABLE_SELECT
  ; The following sections define the application's reactions to
  ; various types of events.
  ; If the event came from the table, plot the selected data.
  IF ((ev.ID eq stash.table) AND hasSelection) THEN BEGIN
    WSET, stash.draw
    PLOT, value
  ; If the event came from the 'Show Selected Data' button, display
  ; the data in the text widget.
  IF ((ev.ID eq stash.b_value) AND hasSelection) THEN BEGIN
    IF (disjoint eq 0) THEN BEGIN
      WIDGET_CONTROL, stash.text, SET_VALUE=STRING(value, /PRINT)
      WIDGET_CONTROL, stash.text, SET_VALUE=STRING(value)
  ; If the event came from the 'Show Selected Cells' button,
  ; display the selection information in the text widget. Use
  ; different displays for standard and disjoint selections.
  IF ((ev.ID eq stash.b_select) AND hasSelection) THEN BEGIN
    IF (disjoint eq 0) THEN BEGIN
      ; Create a string array containing the column and row
      ; values of the selected rectangle.
      list0 = 'Standard Selection'
      list1 = 'Left:   ' + STRING(selection[0])
      list2 = 'Top:    ' + STRING(selection[1])
      list3 = 'Right:  ' + STRING(selection[2])
      list4 = 'Bottom: ' + STRING(selection[3])
      list = [list0, list1, list2, list3, list4]
      ; Create a string array containing the column and row
      ; information for the selected cells.
      n = N_ELEMENTS(selection)
      list = STRARR(n/2+1)
      list[0] = 'Disjoint Selection'
      FOR j=0,n-1,2 DO BEGIN
        list[j/2+1] = 'Column: ' + STRING(selection[j]) + $
          ', Row: ' + STRING(selection[j+1])
    WIDGET_CONTROL, stash.text, SET_VALUE=list
  ; If the event came from the 'Change Selection Mode' button,
  ; change the table selection mode and the title of the button.
  IF (ev.ID eq stash.b_change) THEN BEGIN
    IF (disjoint eq 0) THEN BEGIN
      WIDGET_CONTROL, stash.b_change, $
        SET_VALUE='Change to Standard Selection Mode'
      WIDGET_CONTROL, stash.b_change, $
        SET_VALUE='Change to Disjoint Selection Mode'
  ; If the event came from the 'Quit' button, close the
  ; application.
  IF (ev.ID eq stash.b_quit) THEN WIDGET_CONTROL, ev.TOP, /DESTROY
; Widget creation routine.
PRO table_widget_example1
  ; Create data to be displayed in the table.
  data = DIST(7)
  ; Create initial text to be displayed in the text widget.
  help = ['Select data from the table below using the mouse.']
  ; Create the widget hierarchy.
  subbase1 = WIDGET_BASE(base, /ROW)
  draw = WIDGET_DRAW(subbase1, XSIZE=250, YSIZE=250)
  subbase2 = WIDGET_BASE(subbase1, /COLUMN)
  text = WIDGET_text(subbase2, XS=50, YS=8, VALUE=help, /SCROLL)
  b_value = WIDGET_BUTTON(subbase2, VALUE='Show Selected Data')
  b_select = WIDGET_BUTTON(subbase2, VALUE='Show Selected Cells')
  b_change = WIDGET_BUTTON(subbase2, $
    VALUE='Change to Disjoint Selection Mode')
  b_quit = WIDGET_BUTTON(subbase2, VALUE='Quit')
  table = WIDGET_TABLE(base, VALUE=data, /ALL_EVENTS)
  ; Realize the widgets.
  ; Get the widget ID of the draw widget.
  ; Create an anonymous structure to hold widget IDs. This
  ; structure becomes the user value of the top-level base
  ; widget.
  stash = {draw:drawID, table:table, text:text, b_value:b_value, $
           b_select:b_select, b_change:b_change, b_quit:b_quit}
  ; Set the user value of the top-level base and call XMANAGER
  ; to manage everything.
  XMANAGER, 'table_widget_example1', base

The following things about this example are worth noting:

  • It is important to check whether a selection exists before using WIDGET_CONTROL to retrieve the selection.
  • Data from disjoint selections is handled differently than data from standard selections.
  • For a relatively simple application, passing a group of widget IDs via the top-level base widget’s user value allows using a single event routine rather than separate event routines for each widget.