Beispiel #1
0
static gchar *
eog_exif_util_format_date_with_strptime (const gchar *date)
{
	static GOnce strptime_updates_wday = G_ONCE_INIT;
	gchar *new_date = NULL;
	gchar tmp_date[DATE_BUF_SIZE];
	gchar *p;
	gsize dlen;
	struct tm tm;

	memset (&tm, '\0', sizeof (tm));
	p = strptime (date, "%Y:%m:%d %T", &tm);

	if (p == date + strlen (date)) {
		g_once (&strptime_updates_wday,
			_check_strptime_updates_wday,
			NULL);

		// Ensure tm.tm_wday and tm.tm_yday are set
		if (!GPOINTER_TO_BOOLEAN (strptime_updates_wday.retval))
			_calculate_wday_yday (&tm);

		/* A strftime-formatted string, to display the date the image was taken.  */
		dlen = strftime (tmp_date, DATE_BUF_SIZE * sizeof(gchar), _("%a, %d %B %Y  %X"), &tm);
		new_date = g_strndup (tmp_date, dlen);
	}

	return new_date;
}
/* Close tab */
static gboolean
really_close_tab (CeditTab *tab)
{
	GtkWidget *toplevel;
	CeditWindow *window;

	cedit_debug (DEBUG_COMMANDS);

	g_return_val_if_fail (cedit_tab_get_state (tab) == CEDIT_TAB_STATE_CLOSING,
			      FALSE);

	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tab));
	g_return_val_if_fail (CEDIT_IS_WINDOW (toplevel), FALSE);

	window = CEDIT_WINDOW (toplevel);

	cedit_window_close_tab (window, tab);

	if (cedit_window_get_active_tab (window) == NULL)
	{
		gboolean is_quitting;

		is_quitting = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
								      CEDIT_IS_QUITTING));

		if (is_quitting)
			gtk_widget_destroy (GTK_WIDGET (window));
	}

	return FALSE;
}
static void
close_all_tabs (CeditWindow *window)
{
	gboolean is_quitting;

	cedit_debug (DEBUG_COMMANDS);

	/* There is no document to save -> close all tabs */
	cedit_window_close_all_tabs (window);

	is_quitting = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
							      CEDIT_IS_QUITTING));

	if (is_quitting)
		gtk_widget_destroy (GTK_WIDGET (window));

	return;
}
static void
save_dialog_response_cb (CeditFileChooserDialog *dialog,
                         gint                    response_id,
                         CeditWindow            *window)
{
	GFile *file;
	const CeditEncoding *encoding;
	CeditTab *tab;
	gpointer data;
	GSList *tabs_to_save_as;
	CeditDocumentNewlineType newline_type;

	cedit_debug (DEBUG_COMMANDS);

	tab = CEDIT_TAB (g_object_get_data (G_OBJECT (dialog),
					    CEDIT_TAB_TO_SAVE_AS));

	if (response_id != GTK_RESPONSE_OK)
	{
		gtk_widget_destroy (GTK_WIDGET (dialog));

		goto save_next_tab;
	}

	file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
	g_return_if_fail (file != NULL);

	encoding = cedit_file_chooser_dialog_get_encoding (dialog);
	newline_type = cedit_file_chooser_dialog_get_newline_type (dialog);

	gtk_widget_destroy (GTK_WIDGET (dialog));

	if (tab != NULL)
	{
		CeditDocument *doc;
		gchar *parse_name;
		gchar *uri;

		doc = cedit_tab_get_document (tab);
		g_return_if_fail (CEDIT_IS_DOCUMENT (doc));

		parse_name = g_file_get_parse_name (file);

		cedit_statusbar_flash_message (CEDIT_STATUSBAR (window->priv->statusbar),
					        window->priv->generic_message_cid,
					       _("Saving file '%s'\342\200\246"),
					       parse_name);

		g_free (parse_name);

		/* let's remember the dir we navigated too,
		 * even if the saving fails... */
		 _cedit_window_set_default_location (window, file);

		// FIXME: pass the GFile to tab when api is there
		uri = g_file_get_uri (file);
		_cedit_tab_save_as (tab, uri, encoding, newline_type);
		g_free (uri);
	}

	g_object_unref (file);

save_next_tab:

	data = g_object_get_data (G_OBJECT (window),
				  CEDIT_LIST_OF_TABS_TO_SAVE_AS);
	if (data == NULL)
		return;

	/* Save As the next tab of the list (we are Saving All files) */
	tabs_to_save_as = (GSList *)data;
	g_return_if_fail (tab == CEDIT_TAB (tabs_to_save_as->data));

	/* Remove the first item of the list */
	tabs_to_save_as = g_slist_delete_link (tabs_to_save_as,
					       tabs_to_save_as);

	g_object_set_data (G_OBJECT (window),
			   CEDIT_LIST_OF_TABS_TO_SAVE_AS,
			   tabs_to_save_as);

	if (tabs_to_save_as != NULL)
	{
		tab = CEDIT_TAB (tabs_to_save_as->data);

		if (GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (tab),
							    CEDIT_IS_CLOSING_TAB)) == TRUE)
		{
			g_object_set_data (G_OBJECT (tab),
					   CEDIT_IS_CLOSING_TAB,
					   NULL);

			/* Trace tab state changes */
			g_signal_connect (tab,
					  "notify::state",
					  G_CALLBACK (tab_state_changed_while_saving),
					  window);
		}

		cedit_window_set_active_tab (window, tab);
		file_save_as (tab, window);
	}
}
static void
close_confirmation_dialog_response_handler (CeditCloseConfirmationDialog *dlg,
					    gint                          response_id,
					    CeditWindow                  *window)
{
	GList *selected_documents;
	gboolean is_closing_all;

	cedit_debug (DEBUG_COMMANDS);

	is_closing_all = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
					    			 CEDIT_IS_CLOSING_ALL));

	gtk_widget_hide (GTK_WIDGET (dlg));

	switch (response_id)
	{
		case GTK_RESPONSE_YES: /* Save and Close */
			selected_documents = cedit_close_confirmation_dialog_get_selected_documents (dlg);
			if (selected_documents == NULL)
			{
				if (is_closing_all)
				{
					/* There is no document to save -> close all tabs */
					/* We call gtk_widget_destroy before close_all_tabs
					 * because close_all_tabs could destroy the cedit window */
					gtk_widget_destroy (GTK_WIDGET (dlg));

					close_all_tabs (window);

					return;
				}
				else
					g_return_if_reached ();
			}
			else
			{
				if (is_closing_all)
				{
					save_and_close_all_documents (selected_documents,
								      window);
				}
				else
				{
					save_and_close_document (selected_documents,
								 window);
				}
			}

			g_list_free (selected_documents);

			break;

		case GTK_RESPONSE_NO: /* Close without Saving */
			if (is_closing_all)
			{
				/* We call gtk_widget_destroy before close_all_tabs
				 * because close_all_tabs could destroy the cedit window */
				gtk_widget_destroy (GTK_WIDGET (dlg));

				close_all_tabs (window);

				return;
			}
			else
			{
				const GList *unsaved_documents;

				unsaved_documents = cedit_close_confirmation_dialog_get_unsaved_documents (dlg);
				g_return_if_fail (unsaved_documents->next == NULL);

				close_document (window,
						CEDIT_DOCUMENT (unsaved_documents->data));
			}

			break;
		default: /* Do not close */

			/* Reset is_quitting flag */
			g_object_set_data (G_OBJECT (window),
					   CEDIT_IS_QUITTING,
					   GBOOLEAN_TO_POINTER (FALSE));

			break;
	}

	gtk_widget_destroy (GTK_WIDGET (dlg));
}