]> git.street.me.uk Git - andy/viking.git/blobdiff - src/clipboard.c
Really empty GPS realtime layers.
[andy/viking.git] / src / clipboard.c
index ee0828bb686874fd431695b231b25e8012130568..64471379ace52b98e3d11de84d22294c54253516 100644 (file)
@@ -141,7 +141,8 @@ static void clip_receive_viking ( GtkClipboard *c, GtkSelectionData *sd, gpointe
  */
 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;
@@ -159,9 +160,13 @@ static gboolean clip_parse_latlon ( const gchar *text, struct LatLon *coord )
     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 */
@@ -172,42 +177,63 @@ static gboolean clip_parse_latlon ( const gchar *text, struct LatLon *coord )
       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;
       }
     }
   }
@@ -232,6 +258,8 @@ static void clip_add_wp(VikLayersPanel *vlp, struct LatLon *coord)
 
   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);
   }
@@ -363,7 +391,8 @@ void a_clipboard_copy_selected ( VikLayersPanel *vlp )
   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