Diagram * diagram_load(const char *filename, DiaImportFilter *ifilter) { Diagram *diagram = NULL; GList *diagrams; gboolean was_default = FALSE; for (diagrams = open_diagrams; diagrams != NULL; diagrams = g_list_next(diagrams)) { Diagram *old_diagram = (Diagram*)diagrams->data; if (old_diagram->is_default) { diagram = old_diagram; was_default = TRUE; break; } } /* TODO: Make diagram not be initialized twice */ if (diagram == NULL) { diagram = new_diagram(filename); } if (diagram == NULL) return NULL; if ( !diagram_init(diagram, filename) || !diagram_load_into (diagram, filename, ifilter)) { if (!was_default) /* don't kill the default diagram on import failure */ diagram_destroy(diagram); diagram = NULL; } else { /* not modifying 'diagram->unsaved' the state depends on the import filter used */ diagram_set_modified(diagram, FALSE); if (app_is_interactive()) { recent_file_history_add(filename); if (was_default) /* replacing it is like first remove than add */ dia_diagram_remove(diagram); dia_diagram_add(diagram); } } if (diagram != NULL && was_default && app_is_interactive()) { diagram_update_for_filename(diagram); diagram->is_default = FALSE; if ( g_slist_length(diagram->displays) == 1 ) display_set_active (diagram->displays->data); } return diagram; }
static void dia_dnd_file_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time, DDisplay *ddisp) { #if GTK_CHECK_VERSION(2,22,0) switch (gdk_drag_context_get_selected_action(context)) #else switch (context->action) #endif { case GDK_ACTION_DEFAULT: case GDK_ACTION_COPY: case GDK_ACTION_MOVE: case GDK_ACTION_LINK: case GDK_ACTION_ASK: default: { Diagram *diagram = NULL; gchar *sPath = NULL, *pFrom, *pTo; pFrom = strstr((gchar *) gtk_selection_data_get_data(data), "file:"); while (pFrom) { GError *error = NULL; pTo = pFrom; while (*pTo != 0 && *pTo != 0xd && *pTo != 0xa) pTo ++; sPath = g_strndup(pFrom, pTo - pFrom); /* format changed with Gtk+2.0, use conversion */ pFrom = g_filename_from_uri (sPath, NULL, &error); if (!ddisp) diagram = diagram_load (pFrom, NULL); else { diagram = ddisp->diagram; if (!diagram_load_into (diagram, pFrom, NULL)) { /* the import filter is supposed to show the error message */ gtk_drag_finish (context, TRUE, FALSE, time); break; } } g_free (pFrom); g_free(sPath); if (diagram != NULL) { diagram_update_extents(diagram); layer_dialog_set_diagram(diagram); if (diagram->displays == NULL) { new_display(diagram); } } pFrom = strstr(pTo, "file:"); } /* while */ gtk_drag_finish (context, TRUE, FALSE, time); } break; } return; }