*/
static gboolean clip_parse_latlon ( const gchar *text, struct LatLon *coord )
{
- gint latdeg, londeg;
+ gint latdeg, londeg, latmi, lonmi;
+ gdouble lats, lons;
gdouble latm, lonm;
gdouble lat, lon;
gchar *cand;
if (g_ascii_isdigit (s[i]) && s[i+1] != '.' && !g_ascii_isdigit (s[i+1])) {
s[i+1] = ' ';
if (!g_ascii_isalnum (s[i+2]) && s[i+2] != '-') {
- s[i+2] = ' ';
+ s[i+2] = ' ';
}
}
+ if ( g_ascii_iscntrl (s[i]) ) {
+ // Replace any control characters (i.e. mainly for tabs) with a space
+ s[i] = ' ';
+ }
}
/* now try reading coordinates */
gint j, k;
cand = s+i;
+ // First try matching strings containing the cardinal directions
for (j=0; j<2; j++) {
- for (k=0; k<2; k++) {
- gchar fmt1[] = "N %d%*[ ]%lf W %d%*[ ]%lf";
- gchar fmt2[] = "%d%*[ ]%lf N %d%*[ ]%lf W";
- gchar fmt3[] = "N %lf W %lf";
- gchar fmt4[] = "%lf N %lf W";
-
- fmt1[0] = latc[j]; fmt1[13] = lonc[k];
- fmt2[11] = latc[j]; fmt2[24] = lonc[k];
- fmt3[0] = latc[j]; fmt3[6] = lonc[k];
- fmt4[4] = latc[j]; fmt4[10] = lonc[k];
-
- if (sscanf(cand, fmt1, &latdeg, &latm, &londeg, &lonm) == 4 ||
- sscanf(cand, fmt2, &latdeg, &latm, &londeg, &lonm) == 4) {
- lat = (j*2-1) * (latdeg + latm / 60);
- lon = (k*2-1) * (londeg + lonm / 60);
- break;
- }
- if (sscanf(cand, fmt3, &lat, &lon) == 2 ||
- sscanf(cand, fmt4, &lat, &lon) == 2) {
- lat *= (j*2-1);
- lon *= (k*2-1);
- break;
- }
- }
- if (k!=2) break;
+ for (k=0; k<2; k++) {
+ // DMM
+ gchar fmt1[] = "N %d%*[ ]%lf W %d%*[ ]%lf";
+ gchar fmt2[] = "%d%*[ ]%lf N %d%*[ ]%lf W";
+ // DDD
+ gchar fmt3[] = "N %lf W %lf";
+ gchar fmt4[] = "%lf N %lf W";
+ // DMS
+ gchar fmt5[] = "N%d%*[ ]%d%*[ ]%lf%*[ ]W%d%*[ ]%d%*[ ]%lf";
+
+ // Substitute in 'N','E','S' or 'W' values for each attempt
+ fmt1[0] = latc[j]; fmt1[13] = lonc[k];
+ fmt2[11] = latc[j]; fmt2[24] = lonc[k];
+ fmt3[0] = latc[j]; fmt3[6] = lonc[k];
+ fmt4[4] = latc[j]; fmt4[10] = lonc[k];
+ fmt5[0] = latc[j]; fmt5[23] = lonc[k];
+
+ if (sscanf(cand, fmt1, &latdeg, &latm, &londeg, &lonm) == 4 ||
+ sscanf(cand, fmt2, &latdeg, &latm, &londeg, &lonm) == 4) {
+ lat = (j*2-1) * (latdeg + latm / 60);
+ lon = (k*2-1) * (londeg + lonm / 60);
+ break;
+ }
+ if (sscanf(cand, fmt3, &lat, &lon) == 2 ||
+ sscanf(cand, fmt4, &lat, &lon) == 2) {
+ lat *= (j*2-1);
+ lon *= (k*2-1);
+ break;
+ }
+ gint am = sscanf(cand, fmt5, &latdeg, &latmi, &lats, &londeg, &lonmi, &lons);
+ if ( am == 6 ) {
+ lat = (j*2-1) * (latdeg + latmi / 60.0 + lats / 3600.0);
+ lon = (k*2-1) * (londeg + lonmi / 60.0 + lons / 3600.0);
+ break;
+ }
+ }
+ if (k!=2) break;
}
if (j!=2) break;
- if (sscanf(cand, "%d%*[ ]%lf %d%*[ ]%lf", &latdeg, &latm, &londeg, &lonm) == 4) {
- lat = latdeg/abs(latdeg) * (abs(latdeg) + latm / 60);
- lon = londeg/abs(londeg) * (abs(londeg) + lonm / 60);
- break;
+ // DMM without Cardinal directions
+ if (sscanf(cand, "%d%*[ ]%lf*[ ]%d%*[ ]%lf", &latdeg, &latm, &londeg, &lonm) == 4) {
+ lat = latdeg/abs(latdeg) * (abs(latdeg) + latm / 60);
+ lon = londeg/abs(londeg) * (abs(londeg) + lonm / 60);
+ break;
+ }
+ // DMS without Cardinal directions
+ if (sscanf(cand, "%d%*[ ]%d%*[ ]%lf%*[ ]%d%*[ ]%d%*[ ]%lf", &latdeg, &latmi, &lats, &londeg, &lonmi, &lons) == 6) {
+ lat = latdeg/abs(latdeg) * (abs(latdeg) + latm / 60.0 + lats / 3600.0);
+ lon = londeg/abs(londeg) * (abs(londeg) + lonm / 60.0 + lons / 3600.0);
+ break;
}
+ // Raw values
if (sscanf(cand, "%lf %lf", &lat, &lon) == 2) {
- break;
+ break;
}
}
}
if (sel && sel->type == VIK_LAYER_TRW) {
vik_trw_layer_new_waypoint ( VIK_TRW_LAYER(sel), VIK_GTK_WINDOW_FROM_LAYER(sel), &vc );
+ trw_layer_calculate_bounds_waypoints ( VIK_TRW_LAYER(sel) );
+ vik_layer_emit_update ( VIK_LAYER(sel) );
} else {
a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vlp)), _("In order to paste a waypoint, please select an appropriate layer to paste into."), NULL);
}
if ( ! sel )
return;
- vik_treeview_get_selected_iter ( sel->vt, &iter );
+ if ( !vik_treeview_get_selected_iter ( sel->vt, &iter ) )
+ return;
layer_type = sel->type;
// Since we intercept copy and paste keyboard operations, this is called even when a cell is being edited