-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPoISearchResultsPage.xaml.cs
More file actions
152 lines (144 loc) · 6.94 KB
/
PoISearchResultsPage.xaml.cs
File metadata and controls
152 lines (144 loc) · 6.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Windows.Devices.Geolocation;
namespace AppSDEM
{
/**
* Controller dei risultati di ricerca dei PoI
* @author Francesco Garutti
*/
/**
* Classe per i campi che voglio visualizzare nella LongListSelector
*/
public class PoItrovati
{
public string idpoi { get; set; }
public string immagine { get; set; }
public string nome { get; set; }
public string citta { get; set; }
public string posizione { get; set; }
public string distanza { get; set; }
}
public partial class PoISearchResultsPage : PhoneApplicationPage
{
public PoISearchResultsPage()
{
InitializeComponent();
}
/**
* Funzione che parte con la ricerca dei PoI
* restituisce la lista dei PoI trovati
*/
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
// carico la lista solo la prima volta quando non è selezionato niente
// altrimenti se entro in un dettaglio e faccio back mi torna a ricaricare
// di nuovo tutta la lista
if (poitrovati.SelectedItem == null)
{
//attivo la progress bar
progressbar.IsIndeterminate = true;
// ottengo la risposta in formato json dal form di ricerca e la deserializzo
// creando la lista <code>idpoiList</code>
string resultjson = e.Uri.ToString();
resultjson = resultjson.Substring(resultjson.IndexOf("?") + 1);
List<PoI> idpoiList = new List<PoI>();
idpoiList = Utils.DeserializeJSONArray<PoI>(resultjson);
// se non ho trovato nessun PoI lo notifico all'utente con una textbox
if (idpoiList.Count == 0)
{
notfound_txt.Text = "Nessun PoI trovato tramite questa ricerca!";
// stoppo e nascondo la progress bar
progressbar.IsIndeterminate = false;
progressbar.Visibility = Visibility.Collapsed;
}
else
{
// inizializzo la <code>listpoitrovati</code> come <code>ObservableCollection</code>
// per creare la lista dinamica dei poi trovati
ObservableCollection<PoItrovati> listpoitrovati = new ObservableCollection<PoItrovati>();
// invoco la funzione di GeoLocator per ritornare la mia posizione
Geolocator myGeolocator = new Geolocator();
Geoposition myGeoposition = await myGeolocator.GetGeopositionAsync();
string currentLocation = myGeoposition.Coordinate.ToGeoCoordinate().ToString();
// faccio un for per ogni poi trovato e a ogni ciclo aggiungo un elemento
// alla LongListSelector
for (int i = 0; i < idpoiList.Count; i++)
{
// invoco la funzione <code>poi_details</code> per ottenere alcuni dati
// significativi del poi da mostrare nella lista
string json_detail = await WebAPI.poi_details("1", idpoiList[i].idpoi.ToString());
List<PoI> detailpoiList = new List<PoI>();
detailpoiList = Utils.DeserializeJSONArray<PoI>(json_detail);
// divido per 1000 poichè la funzione restituisce il risultato in metri
float distance = (float)(detailpoiList[0].DistanceTo(currentLocation)) / 1000;
// aggiungo il poi alla lista con i dati che mi interessano
listpoitrovati.Add(new PoItrovati
{
idpoi = idpoiList[i].idpoi.ToString(),
immagine = detailpoiList[0].GetUrlThumbImage(),
nome = detailpoiList[0].short_description,
citta = detailpoiList[0].city,
posizione = detailpoiList[0].position,
distanza = distance.ToString()
});
}
// stoppo e nascondo la progress bar
progressbar.IsIndeterminate = false;
progressbar.Visibility = Visibility.Collapsed;
// alla fine visualizzo la <code>listpoitrovati</code> tramite la
// LongListSelector <code>poitrovati</code> in ordine di distanza
poitrovati.ItemsSource = listpoitrovati.OrderBy(PoItrovati=>PoItrovati.distanza).ToList();
}
}
}
/**
* Funzione che al Tap di un elemento della lista apre un CMB con possibilità di scelta tra
* visualizzare più dettagli o visualizzare il PoI nella mappa
*/
private void GetPoiDetail_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
// creo un item che ottiene i dati dell'elemento ottenuto dal tap
PoItrovati item = ((FrameworkElement)e.OriginalSource).DataContext as PoItrovati;
// ci entra solo se clicchi sui PoI senza immagine perchè non riesce a creare il data context
if (item == null)
{
MessageBox.Show("Non ci sono ulteriori informazioni per questo PoI");
return;
}
// creo un CutstomMessageBox che appare al Tap per avere più info o visualizzare il PoI sulla mappa
CustomMessageBox cmb = new CustomMessageBox()
{
Caption = item.nome,
LeftButtonContent = "More Details",
RightButtonContent = "View on Map",
};
// vengono assegnati 2 metodi diversi in relazione ai 2 bottoni sul CMB
cmb.Dismissed += (s1, e1) =>
{
switch (e1.Result)
{
// bottone sinistro -> pagina dei dettagli
case CustomMessageBoxResult.LeftButton:
NavigationService.Navigate(new Uri("/DetailPage.xaml?poi_id=" + item.idpoi, UriKind.Relative));
break;
// bottone destro -> visualizzare il checkin nella mappa
case CustomMessageBoxResult.RightButton:
NavigationService.Navigate(new Uri("/MapPage.xaml?pos=" + item.posizione, UriKind.Relative));
break;
}
};
// mostra il CMB
cmb.Show();
}
}
}