]> git.street.me.uk Git - andy/viking.git/blobdiff - src/clipboard.c
Import Launchpad translation updates - French Update.
[andy/viking.git] / src / clipboard.c
index 9538eadba2ca947911b772a84b1ae61730b3b11a..61c7c8528b91fa73ca4158ad524077de7c9f0a70 100644 (file)
@@ -96,7 +96,7 @@ static void clip_receive_viking ( GtkClipboard *c, GtkSelectionData *sd, gpointe
     return;
   } 
   //  g_print("clip receive: target = %s, type = %s\n", gdk_atom_name(gtk_selection_data_get_target(sd), gdk_atom_name(sd->type));
-  g_assert(!strcmp(gdk_atom_name(gtk_selection_data_get_target(sd)), target_table[0].target));
+  //g_assert(!strcmp(gdk_atom_name(gtk_selection_data_get_target(sd)), target_table[0].target));
 
   vc = (vik_clipboard_t *)gtk_selection_data_get_data(sd);
   //  g_print("  sd->data = %p, sd->length = %d, vc->len = %d\n", sd->data, sd->length, vc->len);
@@ -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,7 +160,7 @@ 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] = ' ';
       }
     }
   }
@@ -172,42 +173,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 +254,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);
   }
@@ -288,14 +312,14 @@ static void clip_receive_html ( GtkClipboard *c, GtkSelectionData *sd, gpointer
     span = s;
   }
   for (i=0; i<strlen(span); i++) {
-    gchar c = span[i];
-    if (c == '<') {
+    gchar ch = span[i];
+    if (ch == '<') {
       tag++;
     }
     if (tag>0) {
       span[i] = ' ';
     }
-    if (c == '>') {
+    if (ch == '>') {
       if (tag>0) tag--;
     }
   }
@@ -317,19 +341,26 @@ void clip_receive_targets ( GtkClipboard *c, GdkAtom *a, gint n, gpointer p )
   gint i;
 
   for (i=0; i<n; i++) {
-    //g_print("  ""%s""\n", gdk_atom_name(a[i]));
-    if (!strcmp(gdk_atom_name(a[i]), "text/html")) {
+    gchar* name = gdk_atom_name(a[i]);
+    //g_print("  ""%s""\n", name);
+    gboolean breaktime = FALSE;
+    if (!g_strcmp0(name, "text/html")) {
       gtk_clipboard_request_contents ( c, gdk_atom_intern("text/html", TRUE), clip_receive_html, vlp );
-      break;
+      breaktime = TRUE;
     }
     if (a[i] == GDK_TARGET_STRING) {
       gtk_clipboard_request_text ( c, clip_receive_text, vlp );
-      break;
+      breaktime = TRUE;
     }
-    if (!strcmp(gdk_atom_name(a[i]), "application/viking")) {
+    if (!g_strcmp0(name, "application/viking")) {
       gtk_clipboard_request_contents ( c, gdk_atom_intern("application/viking", TRUE), clip_receive_viking, vlp );
-      break;
+      breaktime = TRUE;
     }
+
+    g_free ( name );
+
+    if ( breaktime )
+      break;
   }
 }
 
@@ -346,17 +377,18 @@ void a_clipboard_copy_selected ( VikLayersPanel *vlp )
 {
   VikLayer *sel = vik_layers_panel_get_selected ( vlp );
   GtkTreeIter iter;
-  VikClipboardDataType type;
+  VikClipboardDataType type = VIK_CLIPBOARD_DATA_NONE;
   guint16 layer_type = 0;
   gint subtype = 0;
   guint8 *data = NULL;
-  guint len;
+  guint len = 0;
   const gchar *name = 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
@@ -459,11 +491,18 @@ static void clip_determine_type ( GtkClipboard *c, GdkAtom *a, gint n, gpointer
 {
   gint i;
   for (i=0; i<n; i++) {
-    // g_print("  ""%s""\n", gdk_atom_name(a[i]));
-    if (!strcmp(gdk_atom_name(a[i]), "application/viking")) {
+    gchar *name = gdk_atom_name(a[i]);
+    // g_print("  ""%s""\n", name);
+    gboolean breaktime = FALSE;
+    if (!g_strcmp0(name, "application/viking")) {
       gtk_clipboard_request_contents ( c, gdk_atom_intern("application/viking", TRUE), clip_determine_viking_type, p );
-      break;
+      breaktime = TRUE;
     }
+
+    g_free ( name );
+
+    if ( breaktime )
+      break;
   }
 }