Would some of you be so kind as to run this code. I am particularly looking to see if you get scroll button rubberbanding or other misbehavior in either list on different platforms. I'm also interested to be sure it meets HIG. A very small resource is needed and is attached at the end as a binhex file. Any suggestions or bug reports are welcome. Feel free to e-mail me off list. Thanks, Ken '-------------BEGIN FB^3 CODE------------------- COMPILE LONG IF NDEF _gestaltAppearanceAttr INCLUDE "Tlbx Appearance.Incl" COMPILE END IF RESOURCES "currencyConverter.rsrc" KILL RESOURCES "CDEF",8 BEGIN RECORD currencyConverter DIM 15 countryStr AS STR255 DIM 9 typeStr AS STR255 END RECORD BEGIN GLOBALS DIM gList1H AS HANDLE DIM gList2H AS HANDLE DIM gTick AS LONG DIM c(52) AS currencyConverter DIM gFocus AS BOOLEAN DIM gQuit AS BOOLEAN END GLOBALS BEGIN ENUM _mainEntryField = 1 _responseOne _responseTwo _labelOne _labelTwo _labelThree _splashField END ENUM _numField = 4 gFocus = _zTrue c.countryStr(1) = "United States" c.countryStr(2) = "Argentina" c.countryStr(3) = "Australia" c.countryStr(4) = "Austria" c.countryStr(5) = "Bahamas" c.countryStr(6) = "Belgium" c.countryStr(7) = "Brazil" c.countryStr(8) = "Canada" c.countryStr(9) = "Chile" c.countryStr(10) = "China" c.countryStr(11) = "Colombia" c.countryStr(12) = "Denmark" c.countryStr(13) = "Europe" c.countryStr(14) = "Fiji Islands" c.countryStr(15) = "Finland" c.countryStr(16) = "France" c.countryStr(17) = "Germany" c.countryStr(18) = "Ghana" c.countryStr(19) = "Great Britain" c.countryStr(20) = "Greece" c.countryStr(21) = "Honduras" c.countryStr(22) = "Hong Kong" c.countryStr(23) = "Iceland" c.countryStr(24) = "India" c.countryStr(25) = "Ireland" c.countryStr(26) = "Israel" c.countryStr(27) = "Italy" c.countryStr(28) = "Japan" c.countryStr(29) = "Malaysia" c.countryStr(30) = "Mexico" c.countryStr(31) = "Morocco" c.countryStr(32) = "Neth. Antilles" c.countryStr(33) = "Netherlands" c.countryStr(34) = "New Zealand" c.countryStr(35) = "Norway" c.countryStr(36) = "Pakistan" c.countryStr(37) = "Panama" c.countryStr(38) = "Peru" c.countryStr(39) = "Philippines" c.countryStr(40) = "Portugal" c.countryStr(41) = "Singapore" c.countryStr(42) = "South Africa" c.countryStr(43) = "South Korea" c.countryStr(44) = "Spain" c.countryStr(45) = "Sri Lanka" c.countryStr(46) = "Sweden" c.countryStr(47) = "Switzerland" c.countryStr(48) = "Taiwan" c.countryStr(49) = "Thailand" c.countryStr(50) = "Trinidad/Tobago" c.countryStr(51) = "Tunisia" c.countryStr(52) = "Venezuela" c.typeStr(1) = "Dollars" c.typeStr(2) = "Pesos" c.typeStr(3) = "Dollars" c.typeStr(4) = "Schillings" c.typeStr(5) = "Dollars" c.typeStr(6) = "Francs" c.typeStr(7) = "Reals" c.typeStr(8) = "Dollars" c.typeStr(9) = "Pesos" c.typeStr(10) = "Renminbis" c.typeStr(11) = "Pesos" c.typeStr(12) = "Krones" c.typeStr(13) = "Euros" c.typeStr(14) = "Dollars" c.typeStr(15) = "Markkas" c.typeStr(16) = "Francs" c.typeStr(17) = "Marks" c.typeStr(18) = "Cedis" c.typeStr(19) = "Pounds" c.typeStr(20) = "Drachmae" c.typeStr(21) = "Lempiras" c.typeStr(22) = "Dollars" c.typeStr(23) = "Kronas" c.typeStr(24) = "Rupees" c.typeStr(25) = "Pounds" c.typeStr(26) = "Shekels" c.typeStr(27) = "Liras" c.typeStr(28) = "Yen" c.typeStr(29) = "Ringgits" c.typeStr(30) = "New Pesos" c.typeStr(31) = "Dirhams" c.typeStr(32) = "Florins" c.typeStr(33) = "Guilders" c.typeStr(34) = "Dollars" c.typeStr(35) = "Krones" c.typeStr(36) = "Rupees" c.typeStr(37) = "Balboas" c.typeStr(38) = "New Sols" c.typeStr(39) = "Pesos" c.typeStr(40) = "Escudos" c.typeStr(41) = "Dollars" c.typeStr(42) = "Rands" c.typeStr(43) = "Won" c.typeStr(44) = "Pesetas" c.typeStr(45) = "Rupees" c.typeStr(46) = "Kronas" c.typeStr(47) = "Francs" c.typeStr(48) = "Dollars" c.typeStr(49) = "Bahts" c.typeStr(50) = "Dollars" c.typeStr(51) = "Dinar" c.typeStr(52) = "Bolivars" LOCAL FN doQuit gQuit = _zTrue END FN LOCAL FN aboutWindow DIM AS STR255 introStr,intro2Str DIM wnd2Ptr AS POINTER DIM err AS SHORT introStr = CHR$(13)+"This little demo"+CHR$(13)+"explores Listboxes."+CHR$(13) intro2Str = "Ken Shmidheiser"+CHR$(13)+"Somerset, KY"+CHR$(13)+"May 2001" WINDOW 2,"",( 0,0 )-( 250,150 ),-_dialogMovable wnd2Ptr = WINDOW(_wndPointer) : if wnd2Ptr = _nil then exit fn COLOR = _zBlue TEXT _helvetica, 12, _boldBit% LONG COLOR 46510,65535,65535,_false EDIT FIELD(_splashField),introStr+CHR$(13)+intro2Str,(20,20)-(230,130),_statFramed,_centerJust err = FN SETTHEMEWINDOWBACKGROUND(wnd2Ptr,_kThemeActiveDialogBackgroundBrush,_zTrue) END FN LOCAL FN splashScreen FN aboutWindow DELAY 2000 WINDOW CLOSE 2 END FN LOCAL FN buildMenus APPLE MENU "About Currency Converter Prototype..." MENU 1,0, _enable, "File" MENU 1,1, _enable, "Clear EFs" MENU 1,2, _enable, "-" MENU 1,3, _enable, "Quit/Q" EDIT MENU 2 END FN LOCAL FN getRowNumber( listHndl& ) DIM theCell AS POINT DIM cellFound AS BOOLEAN DIM rowNumber AS INTEGER CALL SETPT( theCell,0,0 ) cellFound = FN LGETSELECT( _true,#@theCell,listHndl& ) LONG IF cellFound CALL LSETSELECT( _true,theCell,listHndl& ) rowNumber = theCell.v% + 1 XELSE rowNumber = 0 END IF END FN = rowNumber LOCAL FN buildMainWindow DIM err AS SHORT DIM @actualSize AS LONG DIM x AS INTEGER DIM tmpStr AS STR255 DIM cell AS POINT DIM wndPtr AS POINTER DIM list1Rect AS RECT DIM list2Rect AS RECT WINDOW -1,"Currency Converter",(0,0)-(490,360),_docNoGrow+_noAutoClip TEXT _sysFont,12, 0 EDIT = 4 EDIT FIELD _mainEntryField,"1",( 251,20 )-( 330,36 ),_framedNoCR,_centerJust+_numField EDIT FIELD _responseOne,"",( 72,254 )-( 408,269 ),_statFramed,_centerJust EDIT FIELD _responseTwo,"",( 72,286 )-( 408,301 ),_statFramed,_centerJust wndPtr = WINDOW(_wndPointer) : if wndPtr = _nil THEN EXIT FN err = FN SETTHEMEWINDOWBACKGROUND(wndPtr,_kThemeActiveDialogBackgroundBrush,_zTrue) err = FN CREATEROOTCONTROl(wndPtr,gList1H) CALL SETRECT( list1Rect,70,80,215+15,80+(USR FONTHEIGHT*10) ) gList1H = FN NEWCONTROL(wndPtr,list1Rect,"",_true,500,0,0,_kControlListBoxProc,65536*12) LONG IF gList1H <> 0 err = FN GETCONTROLDATA(gList1H,0,_"lhan",sizeof(gList1H),@gList1H,@actualSize) LSETDRAWINGMODE(_zTrue,gList1H) SETPT(cell,0,0) FOR x = 1 to 52 err = FN LADDROW(1,x,gList1H) cell.v% = gList1H..dataBounds.bottom% - 1 tmpStr = c.countryStr(x)'tmpStr = STR#(128,x) LSETCELL(@tmpStr+1,len(tmpStr),cell,gList1H) NEXT END IF CALL SETRECT( list2Rect,250,80,395+15,80+(USR FONTHEIGHT*10) ) gList2H = FN NEWCONTROL(wndPtr,list2Rect,"",_true,500,0,0,_kControlListBoxProc,65536*13) LONG IF gList2H <> 0 err = FN GETCONTROLDATA(gList2H,0,_"lhan",sizeof(gList2H),@gList2H,@actualSize) LSETDRAWINGMODE(_zTrue,gList2H) SETPT(cell,0,0) FOR x = 1 to 52 err = FN LADDROW(1,x,gList2H) cell.v% = gList2H..dataBounds.bottom% - 1 tmpStr = c.countryStr(x)'tmpStr = STR#(128,x) LSETCELL(@tmpStr+1,LEN(tmpStr),cell,gList2H) NEXT END IF EDIT FIELD _labelOne,"Enter units of currency you want to convert:",( 60,12 )-( 230,57 ),_statNoFramed,_rightJust EDIT FIELD _labelTwo,"Convert this type...",( 70,60 )-( 230,80 ),_statNoFramed,_leftJust EDIT FIELD _labelThree,"...into this type.",( 250,60 )-( 395,80 ),_statNoFramed,_leftJust BUTTON 1,1,"Quit",(425,325)-(475,345),_shadow BUTTON 2,1,"Convert",(330,325)-(410,345),_push EDIT FIELD 2 WINDOW 1 END FN LOCAL FN ShowSelection( listH& ) DIM theCell AS POINT DIM cellFound AS INTEGER CALL SETPT( theCell,0,0 ) cellFound = FN LGETSELECT( _true,#@theCell,listH& ) LONG IF cellFound CALL LSETSELECT( _true,theCell,listH& ) END IF END FN = theCell.v% LOCAL FN clearFields EDIT$(_responseOne) = "" EDIT$(_responseTwo) = "" END FN LOCAL FN testStrings( inputStr$, textColor% ) DIM i AS INTEGER DIM AS STR255 ef1Str, ef2Str ef1Str = "Commands passed from " ef2Str = "... will go in these edit fields." COLOR = textColor% EDIT$(_responseOne) = ef1Str + inputStr$ + " ..." EDIT$(_responseTwo) = ef2Str COLOR = _zBlack EDIT$(_mainEntryField) = "1" END FN LOCAL FN doStrings( list%, rowNumber% ) DIM typeStr AS STR255 DIM countryStr AS STR255 LONG IF rowNumber% = 0 EDIT$(_responseOne) = "Please select a country from List " + STR$( list% ) EDIT$(_responseTwo) = "" XELSE typeStr = c.typeStr( rowNumber% ) countryStr = c.countryStr( rowNumber% ) DEF LCASE(typeStr) EDIT$(_responseOne) = "You have clicked on List " + STR$( list% ) + " Item " + STR$( rowNumber% ) EDIT$(_responseTwo) = "In " + countryStr + " the currency is " + typeStr + "." END IF END FN LOCAL FN focusList( BOOLEAN ) DIM err AS SHORT DIM list1Rect AS RECT DIM list2Rect AS RECT CALL SETRECT( list1Rect,70,80,215+15,80+(USR FONTHEIGHT*10) ) CALL SETRECT( list2Rect,250,80,395+15,80+(USR FONTHEIGHT*10) ) LONG IF BOOLEAN = _zTrue err = FN DrawThemeListBoxFrame(list1Rect, _kThemeStateActive) err = FN DrawThemeFocusRect(list1Rect,_true) err = FN DrawThemeFocusRect(list2Rect,_false) XELSE err = FN DrawThemeListBoxFrame(list2Rect, _kThemeStateActive) err = FN DrawThemeFocusRect(list2Rect,_true) err = FN DrawThemeFocusRect(list1Rect,_false) END IF END FN LOCAL FN doCalc( unitNumber% ) DIM unitStr AS STR255 unitStr = STR$( unitNumber% ) EDIT$(_mainEntryField)="1" SETSELECT 0,255 FN clearFields COLOR = _zGreen EDIT$(_responseOne) = "The number of units you have input is:" COLOR = _zBlack EDIT$(_responseTwo) = unitStr END FN LOCAL FN doMenu DIM AS INTEGER menuID, itemID menuID = MENU( _menuID ) itemID = MENU( _itemID ) SELECT CASE( menuID ) CASE _applemenu SELECT( itemID ) CASE 1 FN aboutWindow MENU DO UNTIL FN BUTTON WINDOW CLOSE 2 FLUSHEVENTS END SELECT CASE 1 SELECT( itemID ) CASE 1 FN clearFields CASE 3 FN doQuit END SELECT END SELECT MENU END FN LOCAL FN doEdit DIM efNum AS INTEGER DIM keyStr AS STR255 DIM inNowStr AS STR255 DIM inNowNumber AS LONG efNum = WINDOW( _EFnum ) SELECT CASE( efNum ) CASE = _mainEntryField keyStr = TEKEY$ SELECT WINDOW( _EFclass ) / 4 LONG IF ASC( keyStr ) => _"0" AND ASC( keyStr ) <= _"9" TEKEY$ = keyStr XELSE EDIT$(_responseOne) = "Sorry, this field accepts only numbers not letters..." EDIT$(_responseTwo) = "Please try again." END IF END SELECT inNowStr = EDIT$( efNum ) LONG IF len( inNowStr ) > 8 inNowNumber = VAL(inNowStr) FN doCalc( inNowNumber ) END IF END SELECT EDIT FIELD _mainEntryField END FN LOCAL FN doDialog DIM AS INTEGER evnt, id DIM @rowNumber AS INTEGER DIM wndPtr AS POINTER DIM inputStr AS STR255 evnt = DIALOG( 0 ) id = DIALOG( evnt ) SELECT( evnt ) CASE _btnClick SELECT CASE( id ) CASE 1 END CASE 2 inputStr$ = "the 'Convert' button" FN testStrings( inputStr$, _zRed ) CASE 12 gFocus = _zTrue FN focusList( gFocus ) rowNumber = FN getRowNumber( gList1H ) FN doStrings( 1, rowNumber ) LONG IF FN TICKCOUNT < gTick+30 inputStr = "double clicks" FN testStrings( inputStr, _zBlue ) END IF gTick = FN TICKCOUNT CASE 13 gFocus = _false FN focusList( gFocus ) rowNumber = FN getRowNumber( gList2H ) FN doStrings( 2, rowNumber ) LONG IF FN TICKCOUNT < gTick+30 inputStr$ = "double clicks" FN testStrings( inputStr$, _zBlue ) END IF gTick = FN TICKCOUNT END SELECT CASE _wndClose SELECT CASE( id ) CASE 1 LONG IF gList1H <> _nil CALL LDISPOSE(gList1H) gList1H = _nil END IF LONG IF gList2H <> _nil CALL LDISPOSE(gList2H) gList2H = _nil END IF END END SELECT CASE _efReturn SELECT CASE( id ) CASE _mainEntryField inputStr$ = EDIT$( _mainEntryField ) FN doCalc( VAL(inputStr$) ) END SELECT CASE _wndClick SELECT CASE( id ) CASE 1 CASE 2 WINDOW CLOSE 2 END SELECT CASE _wndRefresh SELECT( id ) CASE 1 FN focusList(gFocus) BUTTON 1 CASE 2 END SELECT CASE ELSE END SELECT END FN ON MENU FN doMenu ON EDIT FN doEdit ON DIALOG FN doDialog ON BREAK FN doQuit FN buildMenus FN splashScreen FN buildMainWindow DO HANDLEEVENTS UNTIL gQuit END '-------------- END FB^3 CODE RESOURCE FOLLOWS ------------- (This file must be converted with BinHex 4.0) :&Q0eFR*PEQ0j3fpZGQ9bG'9b,R*cFQ-!FR0bBe*6483"!*!(!8JfG3#3"!%!N!- "&J#3!aB!N!-b'NM(3H`"+N2X!23cX(S!HJ!`"e*(YNGZk%)X!5KJ'%J@Bh9bFQ9 ZBhP$EfjfCA*dCA)ZFR0bBb"XDA0d)-3JD3!!FR0bBe*6483"!*!$!3%!N!U!!*! (X-2blJ#3"J&)6dcZ')Mrd%jH6R8!!%j@!!")ja!BF!!S3(B")JaQ'#m$5(J"ANk j!!!"bPL2*KmS3#!-CJ*f!%S$CaS[$%kj!!!&K#K!+,Rrr1Yd)$Rrr1Yd@%pJ!R! !*Na`!"!Z!"X[!#mZ!"3[,J!3,bi!$#mZ!!J[#dkj!!!&c#!,6qm!'%cZ'!#3!a) !N!8"!*!%!3#3"3%!N!-"!*!$!4B!N!-@!*!$-J,DfRJrL!#3!a`!-J!!E'4PF`# 3!`S"p2rr!*!)B9):