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);
*/
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);
}
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--;
}
}
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;
}
}
{
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
{
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;
}
}