using System; using System.Collections.Generic; using System.Linq; using System.Windows.Controls; using Comal.Classes; using Comal.Stores; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { internal class GPSTrackerLocationGrid : DynamicOneToManyGrid { private static List> _cache; protected override void Init() { base.Init(); Criteria.Add( new Filter(x => x.Location.Timestamp).IsGreaterThanOrEqualTo(DateTime.Now.AddDays(-1)) ); ActionColumns.Add(new DynamicMapColumn(this, x => x.Location)); AddButton("Get Addresses", null, GetAddressClick); } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.AddRange( DynamicGridOption.SelectColumns, DynamicGridOption.RecordCount, DynamicGridOption.FilterRows ); } public string ReverseGeocode(double latitude, double longitude) { if (_cache == null) _cache = new Client().Query( new Filter(x => x.Location.Address).IsNotEqualTo(""), new Columns( x => x.Location.Address, x => x.Location.Longitude, x => x.Location.Latitude ) ).Rows.Select(r => new Tuple( r.Get(c => c.Location.Latitude), r.Get(c => c.Location.Longitude), r.Get(c => c.Location.Address) )).ToList(); var tuple = _cache.FirstOrDefault(x => Equals(x.Item1, latitude) && Equals(x.Item2, longitude)); if (tuple == null) { var address = StoreUtils.ReverseGeocode(latitude, longitude); if (!string.IsNullOrWhiteSpace(address)) { tuple = new Tuple(latitude, longitude, address); _cache.Add(tuple); } } return tuple != null ? tuple.Item3 : ""; } private bool GetAddressClick(Button arg1, CoreRow[] arg2) { var result = false; var rows = Data.Rows.Where(r => string.IsNullOrWhiteSpace(r.Get(c => c.Location.Address)) && !Equals(r.Get(c => c.Location.Latitude), 0.0F) && !Equals(r.Get(c => c.Location.Longitude), 0.0F) ); Progress.ShowModal("Updating Addresses", progress => { foreach (var row in rows) { var item = LoadItem(row); var address = ReverseGeocode( row.Get(x => x.Location.Latitude), row.Get(x => x.Location.Longitude) ); if (!string.IsNullOrWhiteSpace(address)) { item.Location.Address = address; UpdateRow(row, x => x.Location.Address, address, false); result = true; } } }); return result; } } }