REBOL [
    Title:        "Scrolling Fields"
    Date:        27-Mar-2006
    Name:      'Scrolling Fields
    Version:    0.1.0
    File:          %scrolling-fields.r
    Author:     "R.v.d.Zee"
    Owner:     "R.v.d.Zee"
    Rights:     {Copyright (C) R.v.d.Zee 2006}
    Tabs:       4
    Purpose: {This script illustrates the use of fields and a scroller to display  data.
                      Similar to a text-list, scrolling fields provides greater control over the  
                      presentation of data.  
                       }    
    Library: [
                    level: 'beginner
                    platform: 'Windows 
                    type: 'tutorial 
                    domain: [GUI] 
                    tested-under: none
                    support: none 
                    license: none 
                    see-also: none
    ]
    Notes: {   The data may be edited at the bottom row of fields directly above the buttons.
                     The new data presents itself in the scrolling fields - but the entry in the
                     original data (listData in this case)  is also changed.

                     The carry through of an edit to the original loaded  data works for strings,
                      but did not carry through when a time data type was used.  So all data in
                      listData are strings.  

                      Scrolling fields data may be edited and updated.                                           
   
    }
]



listData: [
    "MOUNT ISA"                    {-20°43'00"}  {+139°29'00"}  "06:47"   "18:50" 
    "TOOWOOMBA"                {-27°33'00"}  {+151°57'00"}  "05:58"   "18:00"
    "MAREEBA"                       {-16°59'00"}  {+145°25'00"}  "06:23"   "18:27"    
    "AYERS ROCK - ULURU"    {-25°20'00"}  {+131°02'00"}  "06:51"   "18:53"   
    "ADELAIDE"                      {-34°55'00"}  {+138°36'00"}  "06:22"   "18:22" 
    "PERTH"                           {-31°57'00"}  {+115°51'00"}  "06:22"   "18:24"
    "DARWIN"                        {-12°27'00"}  {+130°50'00"}  "06:51"   "18:55"
    "BRISBANE"                      {-27°28'00"}  {+153°01'00"}  "05:53"   "17:55"
    "HOBART"                        {-42°53'00"}  {+147°17'00"}  "07:17"   "19:17"
    "MELBOURNE"                  {-37°48'00"}  {+144°56'00"}  "07:26"   "19:27"
    "BROOME"                        {-17°57'00"}  {+122°14'00"}  "05:56"   "17:59"
]

dataLength: divide (length? listData) 5

gatherData: [
    cityData:          make block! dataLength 
    latitudeData:     make block! dataLength 
    longitudeData:  make block! dataLength 
    sunriseData:     make block! dataLength 
    sunsetData:      make block! dataLength
    forskip listData 5 [
        append cityData          first listData     
        append latitudeData    second listData
        append longitudeData third listData
        append sunriseData    fourth listData
        append sunsetData     fifth listData
    ]
]
do gatherData

populate:  [
        foreach face scrollingFields/pane [
            if face/style = 'city [
                face/text: first cityData
                show face
                cityData: next cityData 
            ]
            if face/style = 'latitude [
                face/text: first latitudeData
                show face
                latitudeData: next latitudeData 
            ]
            if face/style = 'longitude [
                face/text: first longitudeData
                show face
                longitudeData: next longitudeData 
            ]
            if face/style = 'sunrise [
                face/text: first sunriseData
                show face
                sunriseData: next sunriseData 
            ]
            if face/style = 'sunset [
                face/text: first sunsetData
                show face
                sunsetData: next sunsetData 
            ]
        ]
        listData: head listData
        cityData: head cityData
        latitudeData: head latitudeData
        longitudeData: head longitudeData
        sunriseData: head sunriseData
        sunsetData: head sunsetData 
    ]

    ; abbreviations for the fields: 
    ;    c for city   --  l for latitude   --   o for longitude  --   r for sunrise  --    s for sunset  

colorRow1: [
    c1/colors/1: l1/colors/1: o1/colors/1: r1/colors/1: s1/colors/1: water
    show [c1 l1 o1 r1 s1]
    edit1/text: c1/text  edit2/text: l1/text  edit3/text: o1/text  edit4/text: r1/text  edit5/text: s1/text
    show [edit1 edit2 edit3 edit4 edit5]        
]
colorRow2: [
     c2/colors/1: l2/colors/1: o2/colors/1: r2/colors/1: s2/colors/1: water
     show [c2 l2 o2 r2 s2]
     edit1/text: c2/text  edit2/text: l2/text  edit3/text: o2/text  edit4/text: r2/text  edit5/text: s2/text 
     show [edit1 edit2 edit3 edit4 edit5]           
]
colorRow3: [
    c3/colors/1: l3/colors/1: o3/colors/1: r3/colors/1: s3/colors/1: water
    show [c3 l3 o3 r3 s3]
    edit1/text: c3/text   edit2/text: l3/text  edit3/text: o3/text  edit4/text: r3/text  edit5/text: s3/text
    show [edit1 edit2 edit3 edit4 edit5]           
]
colorRow4: [
    c4/colors/1: l4/colors/1: o4/colors/1: r4/colors/1: s4/colors/1: water
    show [c4 l4 o4 r4 s4]
    edit1/text: c4/text  edit2/text: l4/text  edit3/text: o4/text  edit4/text: r4/text   edit5/text: s4/text
    show [edit1 edit2 edit3 edit4 edit5]           
]
colorRow5: [
    c5/colors/1: l5/colors/1: o5/colors/1: r5/colors/1: s5/colors/1: water
    show [c5 l5 o5 r5 s5]
    edit1/text: c5/text  edit2/text: l5/text  edit3/text: o5/text  edit4/text: r5/text  edit5/text: s5/text
    show [edit1 edit2 edit3 edit4 edit5]           
]

coloredAcross: false                    ;  a switch to improve performance, otherwise, everytime
                                                       ;  the scroller's dragger is moved, most fields would have
                                                       ;  the color changed  

unColor: [
    unfocus
    foreach face scrollingFields/pane [
        if  any [
            face/style = 'city                                  ;unColor is used to unhilight the row 
            face/style = 'latitude
            face/style = 'longitude
            face/style = 'sunrise
            face/style = 'sunset
        ][face/colors/1: olive show face]    
    ]
    coloredAcross: false
]

editData: make block! 5

hiLites: [                                                            ;determines which row to hilite
    engage: func [face action event] [ 
        if action = 'up [
            do unColor
            liteAt: to-integer remove form face/var      
            if liteAt = 1 [do colorRow1]
            if liteAt = 2 [do colorRow2]     
            if liteAt = 3 [do colorRow3]
            if liteAt = 4 [do colorRow4]
            if liteAt = 5 [do colorRow5]
           show scrollingFields/pane 
        ] 
    ]
    coloredAcross: true
]
  
scrollingFields: layout [
    size 1024x300
    backcolor coffee
    origin 20x38 box 542x146 pewter
    origin 22x40 
    style city           field  200x27 olive olive font-color green font-size 17 feel hiLites
    style latitude     field 100x27  olive olive font-color green font-size 17 feel hiLites
    style longitude  field 100x27 olive  olive font-color green font-size 17 feel hiLites
    style sunrise     field    60x27 olive  olive font-color green font-size 17 feel hiLites
    style sunset      field    60x27 olive  olive font-color green font-size 17 feel hiLites
    below
    space 0
    c1: city c2: city c3: city c4: city c5: city [print face/offset]
    return
    l1: latitude  l2: latitude  l3: latitude l4: latitude  l5: latitude
    return
    o1: longitude o2: longitude o3: longitude o4: longitude o5: longitude
    return
    r1: sunrise r2: sunrise r3: sunrise r4: sunrise r5: sunrise
    return
    s1: sunset  s2: sunset  s3: sunset  s4: sunset  s5: sunset

    origin 544x38 scrollAll: scroller 16x136 olive brown [
        unfocus
        if coloredAcross = true [do unColor]
        skipper: scrollAll/data * (length? cityData)
        cityData: skip cityData skipper
        latitudeData: skip latitudeData skipper
        longitudeData: skip longitudeData skipper
        sunriseData: skip sunriseData skipper
        sunsetData: skip sunsetData skipper 

        if (length? citydata) >= 5  [do populate]
        cityData: head cityData
        latitudeData: head latitudeData
        longitudeData: head longitudeData
        sunriseData: head sunriseData
        sunsetData: head sunsetData
    ]


    across     
    origin 40x205
    style edit  field 100x27 water water font-color green font-size 17 [
          show scrollingfields/pane
    ]
    edit1: edit 200x27 edit2: edit edit3: edit edit4: edit 60x27  edit5: edit 60x27 
    return
    across
    indent 347 
    btn silver  "Data" [do populate]
    btn silver "Update" [
        append listData ["NEW PLACE"  {-33°55'00"}  {+111°11'00"}  "00:00"   "11:00"]
        do gatherData
        do populate
    ]
    btn silver "Source" [
         clear showSource/text
         fieldCounter: 0
         forall listData  [
             either fieldCounter < 4 [
                 append showSource/text join  first listData  "^(tab)" 
                 fieldCounter: fieldCounter + 1
                 ][
                 append showSource/text join  first listData  "^/"
                 fieldCounter: 0
               ]
        ]    
        show showSource
    ] 
    btn silver "Quit" [quit]

    origin 610x38 showSource: label 400x300  green  font-size 12 top 

]

scrollingFields/offset: 0x30
s5/edge/size: 0x1
s5/edge/color: pewter

                                  view scrollingFields