Example: Single Data Type Data
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.
Example Code
This example is included in the file table_widget_example1.pro 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 table_widget_example1.pro. 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. WIDGET_CONTROL, ev.top, GET_UVALUE=stash ; 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 ENDIF ; 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) ENDIF ELSE BEGIN WIDGET_CONTROL, stash.text, SET_VALUE=STRING(value) ENDELSE ENDIF ; 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] ENDIF ELSE BEGIN ; 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]) ENDFOR ENDELSE WIDGET_CONTROL, stash.text, SET_VALUE=list ENDIF ; 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.table, TABLE_DISJOINT_SELECTION=1 WIDGET_CONTROL, stash.b_change, $ SET_VALUE='Change to Standard Selection Mode' ENDIF ELSE BEGIN WIDGET_CONTROL, stash.table, TABLE_DISJOINT_SELECTION=0 WIDGET_CONTROL, stash.b_change, $ SET_VALUE='Change to Disjoint Selection Mode' ENDELSE ENDIF ; If the event came from the 'Quit' button, close the ; application. IF (ev.ID eq stash.b_quit) THEN WIDGET_CONTROL, ev.TOP, /DESTROY END ; 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. base = WIDGET_BASE(/COLUMN) 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. WIDGET_CONTROL, base, /REALIZE ; Get the widget ID of the draw widget. WIDGET_CONTROL, draw, GET_VALUE=drawID ; 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. WIDGET_CONTROL, base, SET_UVALUE=stash XMANAGER, 'table_widget_example1', base END
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 the use of a single event routine rather than separate event routines for each widget.