;+ ; NAME: ; XCALC ; ; PURPOSE: ; ; This widget program simulates the operation of a simple calculator. ; ; AUTHOR: ; ; Robert M. Dimeo, Ph.D. ; NIST Center for Neutron Research ; 100 Bureau Drive ; Gaithersburg, MD 20899 ; Phone: (301) 975-8135 ; E-mail: robert.dimeo@nist.gov ; http://www.ncnr.nist.gov/staff/dimeo ; ; CATEGORY: ; ; Widgets ; ; CALLING SEQUENCE: ; ; XCALC ; ; ; INPUT FIELDS: ; ; NONE ; ; DISCLAIMER ; ; This software is provided as is without any warranty whatsoever. ; Permission to use, copy, modify, and distribute modified or ; unmodified copies is granted, provided this disclaimer ; is included unchanged. ; ; MODIFICATION HISTORY: ; ; Written by Rob Dimeo, November 6, 2002. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pro xcalcCleanup,tlb widget_control,tlb,get_uvalue = pState ptr_free,pState end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pro xcalcQuit,event widget_control,event.top,/destroy end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pro xcalc_event,event uname = widget_info(event.id,/uname) widget_control,event.top,get_uvalue = pState case strupcase(uname) of 'QUIT': widget_control,event.top,/destroy 'CLEAR': begin (*pState).val1 = 0.0 (*pState).val2 = 0.0 widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '' (*pState).valEntry = 0 end 'INVERSE': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = 1.0/float(val[0]) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '' (*pState).valEntry = 0 end 'SQRT': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = sqrt(float(val[0])) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '' (*pState).valEntry = 0 end 'ADD': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = float(val[0]) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '+' (*pState).valEntry = 0 end 'SUBTRACT': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = float(val[0]) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '-' (*pState).valEntry = 0 end 'DIVIDE': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = float(val[0]) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '/' (*pState).valEntry = 0 end 'MULTIPLY': begin widget_control,(*pState).inField,get_value = val (*pState).val1 = float(val[0]) widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '*' (*pState).valEntry = 0 end 'EQUALS': begin if (*pState).op eq '' then return widget_control,(*pState).inField,get_value = val (*pState).val2 = float(val[0]) expr = string((*pState).val1)+(*pState).op+string((*pState).val2) r = execute('y='+expr,1) (*pState).val1 = y widget_control,(*pState).inField, $ set_value = strtrim(string((*pState).val1),2) (*pState).op = '' (*pState).val2 = 0.0 (*pState).valEntry = 0 end else: endcase theseVals = ['1','2','3','4','5','6','7','8','9','0','.'] ok = where(theseVals eq strupcase(uname),count) if count gt 0 then begin widget_control,(*pState).inField,get_value = val ; How many decimal points have been used? decPos = strpos(val[0],'.') if (decPos[0] ne -1) and strupcase(uname) eq '.' then return if (float(val[0]) eq 0.0) or (*pState).valEntry eq 0 then begin widget_control,(*pState).inField,set_value = uname (*pState).valEntry = 1 endif else begin ; append number outVal = strtrim(val[0]+uname,2) widget_control,(*pState).inField,set_value = outVal endelse endif end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pro xcalc ; Widget definition module tlb = widget_base(/col,title = 'Calculator Utility',tlb_frame_attr = 1) thisFont = "Comic Sans MS*20*Bold" if !d.name ne 'WIN' then begin inField = widget_text(tlb,xsize = xsize,value = strtrim(string(0.0),2)) endif else begin inField = widget_text(tlb,xsize = xsize,value = strtrim(string(0.0),2), $ font = thisFont) endelse xsize = 60 & ysize = 50 row1 = widget_base(tlb,/row) b = widget_button(row1,value = '7',uname = '7',xsize = xsize,ysize = ysize) b = widget_button(row1,value = '8',uname = '8',xsize = xsize,ysize = ysize) b = widget_button(row1,value = '9',uname = '9',xsize = xsize,ysize = ysize) b = widget_button(row1,value = '/',uname = 'divide',xsize = xsize,ysize = ysize) b = widget_button(row1,value = 'AC',uname = 'clear',xsize = xsize,ysize = ysize) row2 = widget_base(tlb,/row) b = widget_button(row2,value = '4',uname = '4',xsize = xsize,ysize = ysize) b = widget_button(row2,value = '5',uname = '5',xsize = xsize,ysize = ysize) b = widget_button(row2,value = '6',uname = '6',xsize = xsize,ysize = ysize) b = widget_button(row2,value = '*',uname = 'multiply',xsize = xsize,ysize = ysize) b = widget_button(row2,value = '.',uname = '.',xsize = xsize,ysize = ysize) row3 = widget_base(tlb,/row) b = widget_button(row3,value = '1',uname = '1',xsize = xsize,ysize = ysize) b = widget_button(row3,value = '2',uname = '2',xsize = xsize,ysize = ysize) b = widget_button(row3,value = '3',uname = '3',xsize = xsize,ysize = ysize) b = widget_button(row3,value = '+',uname = 'add',xsize = xsize,ysize = ysize) b = widget_button(row3,value = 'EXIT',uname = 'quit',xsize = xsize,ysize = ysize) row4 = widget_base(tlb,/row) b = widget_button(row4,value = '0',uname = '0',xsize = xsize,ysize = ysize) b = widget_button(row4,value = 'SQRT',uname = 'sqrt',xsize = xsize,ysize = ysize) b = widget_button(row4,value = '1/x',uname = 'inverse',xsize = xsize,ysize = ysize) b = widget_button(row4,value = '-',uname = 'subtract',xsize = xsize,ysize = ysize) b = widget_button(row4,value = '=',uname = 'equals',xsize = xsize,ysize = ysize) widget_control,tlb,/realize state = { inField:inField, $ val1:0.0, $ val2:0.0, $ valEntry:0, $ op:''} pState = ptr_new(state,/no_copy) widget_control,tlb,set_uvalue = pState,/no_copy xmanager,'xcalc',tlb,/no_block,cleanup = 'xcalcCleanup' end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;