summaryrefslogtreecommitdiffstats
path: root/plug-ins/metadata/metadata-editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'plug-ins/metadata/metadata-editor.c')
-rw-r--r--plug-ins/metadata/metadata-editor.c5779
1 files changed, 5779 insertions, 0 deletions
diff --git a/plug-ins/metadata/metadata-editor.c b/plug-ins/metadata/metadata-editor.c
new file mode 100644
index 0000000..fc958b7
--- /dev/null
+++ b/plug-ins/metadata/metadata-editor.c
@@ -0,0 +1,5779 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * metadata-editor.c
+ * Copyright (C) 2016, 2017 Ben Touchette
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+#include <gexiv2/gexiv2.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+#include "metadata-tags.h"
+#include "metadata-xml.h"
+#include "metadata-impexp.h"
+#include "metadata-misc.h"
+
+#define PLUG_IN_PROC "plug-in-metadata-editor"
+#define PLUG_IN_BINARY "metadata-editor"
+#define PLUG_IN_ROLE "gimp-metadata"
+
+#define DEFAULT_TEMPLATE_FILE "gimp_metadata_template.xml"
+
+/* local function prototypes */
+
+static void query (void);
+static void run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals);
+
+static gboolean metadata_editor_dialog (gint32 image_id,
+ GimpMetadata *metadata);
+
+static void metadata_dialog_editor_set_metadata (GExiv2Metadata *metadata,
+ GtkBuilder *builder);
+
+void metadata_editor_write_callback (GtkWidget *dialog,
+ GtkBuilder *builder,
+ gint32 image_id);
+
+static void impex_combo_callback (GtkComboBoxText *combo,
+ gpointer data);
+
+static void gpsaltsys_combo_callback (GtkComboBoxText *combo,
+ gpointer data);
+
+static void remove_substring (const gchar *string,
+ const gchar *substring);
+
+gboolean hasCreatorTagData (GtkBuilder *builder);
+gboolean hasLocationCreationTagData (GtkBuilder *builder);
+gboolean hasImageSupplierTagData (GtkBuilder *builder);
+
+void on_date_button_clicked (GtkButton *widget,
+ GtkWidget *entry_widget,
+ gchar *tag);
+
+void on_create_date_button_clicked (GtkButton *widget,
+ gpointer data);
+
+void on_patient_dob_date_button_clicked (GtkButton *widget,
+ gpointer data);
+
+void on_study_date_button_clicked (GtkButton *widget,
+ gpointer data);
+
+void on_series_date_button_clicked (GtkButton *widget,
+ gpointer data);
+
+
+static void
+property_release_id_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+property_release_id_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+model_release_id_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+model_release_id_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+shown_location_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+shown_location_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+feat_org_name_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+feat_org_name_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+feat_org_code_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+feat_org_code_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+artwork_object_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+artwork_object_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+reg_entry_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+reg_entry_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+image_creator_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+image_creator_remove_callback (GtkWidget *widget,
+ gpointer data);
+
+static void
+copyright_own_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+copyright_own_remove_callback (GtkWidget *widget,
+ gpointer data);
+static void
+licensor_add_callback (GtkWidget *widget,
+ gpointer data);
+static void
+licensor_remove_callback (GtkWidget *widget,
+ gpointer data);
+
+static void
+list_row_remove_callback (GtkWidget *widget,
+ gpointer data,
+ gchar *tag);
+
+static void
+list_row_add_callback (GtkWidget *widget,
+ gpointer data,
+ gchar *tag);
+
+static gint
+count_tags (GExiv2Metadata *metadata,
+ const gchar *header,
+ const gchar **tags,
+ int items);
+
+static void
+get_tags (GExiv2Metadata *metadata,
+ const gchar *header,
+ const gchar **tags,
+ const int items,
+ const int count);
+
+gboolean
+hasModelReleaseTagData (GtkBuilder *builder);
+
+gboolean
+hasPropertyReleaseTagData (GtkBuilder *builder);
+
+static void
+organisation_image_code_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+organisation_image_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+prop_rel_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+loc_sho_sub_loc_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+loc_sho_city_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+loc_sho_state_prov_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+loc_sho_cntry_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+loc_sho_cntry_iso_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+reg_org_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+reg_item_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_title_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_copyright_notice_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_source_inv_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_source_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_creator_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+aoo_date_creat_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+cr_owner_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+cr_owner_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_phone1_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_phone_type1_cell_edited_callback (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_phone2_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_phone_type2_cell_edited_callback (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_email_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+static void
+licensor_web_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data);
+
+void
+cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data,
+ int index);
+
+void
+cell_edited_callback_combo (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data,
+ int index);
+
+
+/* local variables */
+
+gchar *tagdata[256][256];
+
+static int last_gpsaltsys_sel;
+
+gboolean gimpmetadata;
+gboolean force_write;
+
+static const gchar *lang_default = "lang=\"x-default\"";
+static const gchar *seq_default = "type=\"Seq\"";
+static const gchar *bag_default = "type=\"Bag\"";
+
+metadata_editor meta_args;
+
+const GimpPlugInInfo PLUG_IN_INFO =
+{
+ NULL, /* init_proc */
+ NULL, /* quit_proc */
+ query, /* query_proc */
+ run, /* run_proc */
+};
+
+/* ============================================================================
+ * ==[ ]=============================================================
+ * ==[ FUNCTIONS ]=============================================================
+ * ==[ ]=============================================================
+ * ============================================================================
+ */
+
+
+MAIN ()
+
+/* ============================================================================
+ * ==[ QUERY ]=================================================================
+ * ============================================================================
+ */
+
+static void
+query (void)
+{
+ static const GimpParamDef metadata_args[] =
+ {
+ { GIMP_PDB_INT32, "run-mode", "Run mode { RUN-INTERACTIVE (0) }" },
+ { GIMP_PDB_IMAGE, "image", "Input image" }
+ };
+
+ gimp_install_procedure (PLUG_IN_PROC,
+ N_("Edit metadata (IPTC, EXIF, XMP)"),
+ "Edit metadata information attached to the "
+ "current image. Some or all of this metadata "
+ "will be saved in the file, depending on the output "
+ "file format.",
+ "Ben Touchette",
+ "Ben Touchette",
+ "2017",
+ N_("_Edit Metadata"),
+ "*",
+ GIMP_PLUGIN,
+ G_N_ELEMENTS (metadata_args), 0,
+ metadata_args, NULL);
+
+ gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Image/Metadata");
+}
+
+/* ============================================================================
+ * ==[ RUN ]===================================================================
+ * ============================================================================
+ */
+
+static void
+run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals)
+{
+ static GimpParam values[1];
+ GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+
+ *nreturn_vals = 1;
+ *return_vals = values;
+
+ values[0].type = GIMP_PDB_STATUS;
+ values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+
+ force_write = FALSE;
+
+ INIT_I18N ();
+ gimp_ui_init (PLUG_IN_BINARY, TRUE);
+
+ if (! strcmp (name, PLUG_IN_PROC))
+ {
+ GimpMetadata *metadata;
+ gint32 image_ID = param[1].data.d_image;
+
+ metadata = gimp_image_get_metadata (image_ID);
+
+ /* Always show metadata dialog so we can add
+ appropriate iptc data as needed. Sometimes
+ license data needs to be added after the
+ fact and the image may not contain metadata
+ but should have it added as needed. */
+
+ if (!metadata)
+ {
+ metadata = gimp_metadata_new ();
+ gimp_image_set_metadata (image_ID, metadata);
+ }
+
+ metadata_editor_dialog (image_ID, metadata);
+
+ status = GIMP_PDB_SUCCESS;
+ }
+ else
+ {
+ status = GIMP_PDB_CALLING_ERROR;
+ }
+
+ values[0].data.d_status = status;
+}
+
+/* ============================================================================
+ * ==[ EDITOR DIALOG UI ]======================================================
+ * ============================================================================
+ */
+
+static GtkWidget *
+builder_get_widget (GtkBuilder *builder,
+ const gchar *name)
+{
+ GObject *object = gtk_builder_get_object (builder, name);
+
+ return GTK_WIDGET (object);
+}
+
+static gboolean
+metadata_editor_dialog (gint32 image_id,
+ GimpMetadata *g_metadata)
+{
+ GtkBuilder *builder;
+ GtkWidget *dialog;
+ GtkWidget *metadata_vbox;
+ GtkWidget *impex_combo;
+ GtkWidget *content_area;
+ GExiv2Metadata *metadata;
+ gchar *ui_file;
+ gchar *title;
+ gchar *name;
+ GError *error = NULL;
+ gboolean run;
+
+ metadata = GEXIV2_METADATA (g_metadata);
+
+ builder = gtk_builder_new ();
+
+ meta_args.image_id = image_id;
+ meta_args.builder = builder;
+ meta_args.metadata = metadata;
+ meta_args.filename = g_strconcat (g_get_home_dir (), "/", DEFAULT_TEMPLATE_FILE,
+ NULL);
+
+ ui_file = g_build_filename (gimp_data_directory (),
+ "ui", "plug-ins", "plug-in-metadata-editor.ui", NULL);
+
+ if (! gtk_builder_add_from_file (builder, ui_file, &error))
+ {
+ g_printerr ("Error occurred while loading UI file!\n");
+ g_printerr ("Message: %s\n", error->message);
+ g_clear_error (&error);
+ if (ui_file)
+ g_free (ui_file);
+ g_object_unref (builder);
+ return FALSE;
+ }
+
+ g_free (ui_file);
+
+ name = gimp_image_get_name (image_id);
+ title = g_strdup_printf (_("Metadata Editor: %s"), name);
+ if (name)
+ g_free (name);
+
+ dialog = gimp_dialog_new (title,
+ "gimp-metadata-editor-dialog",
+ NULL, 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+ _("_Cancel"), GTK_RESPONSE_NO,
+ _("_Write Metadata"), GTK_RESPONSE_YES,
+ NULL);
+
+ meta_args.dialog = dialog;
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_YES,
+ GTK_RESPONSE_NO,
+ -1);
+
+ gimp_window_set_transient (GTK_WINDOW (dialog));
+
+ if (title)
+ g_free (title);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+ metadata_vbox = builder_get_widget (builder, "metadata-vbox");
+ impex_combo = builder_get_widget (builder, "impex_combo");
+
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (impex_combo),
+ _("Select:"));
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (impex_combo),
+ _("Import metadata"));
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (impex_combo),
+ _("Export metadata"));
+ gtk_combo_box_set_active (GTK_COMBO_BOX (impex_combo), 0);
+
+ g_signal_connect (G_OBJECT (impex_combo),
+ "changed", G_CALLBACK (impex_combo_callback), &meta_args);
+
+ gtk_container_set_border_width (GTK_CONTAINER (metadata_vbox), 12);
+ gtk_box_pack_start (GTK_BOX (content_area), metadata_vbox, TRUE, TRUE, 0);
+
+ metadata_dialog_editor_set_metadata (metadata, builder);
+
+ run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_YES);
+ if (run)
+ {
+ metadata_editor_write_callback (dialog, builder, image_id);
+ }
+
+ if (meta_args.filename)
+ {
+ g_free (meta_args.filename);
+ }
+
+ return TRUE;
+}
+
+/* ============================================================================
+ * ==[ ]=====================================================
+ * ==[ PRIVATE FUNCTIONS ]=====================================================
+ * ==[ ]=====================================================
+ * ============================================================================
+ */
+static void
+remove_substring (const gchar *string,
+ const gchar *substring)
+{
+ if (string != NULL && substring != NULL && substring[0] != '\0')
+ {
+ gchar *p = strstr (string, substring);
+ if (p)
+ {
+ memmove (p, p + strlen (substring), strlen (p + strlen (substring)) + 1);
+ }
+ }
+}
+
+static gint
+count_tags (GExiv2Metadata *metadata,
+ const gchar *header,
+ const gchar **tags,
+ gint items)
+{
+ int tagcount;
+ gchar tag[256];
+ int oo;
+ int ii;
+
+ tagcount = 0;
+ for (oo = 1; oo < 256; oo++)
+ {
+ for (ii = 0; ii < items; ii++)
+ {
+ g_sprintf ((gchar*) &tag, "%s[%d]", header, oo);
+ g_sprintf ((gchar*) &tag, "%s%s",
+ (gchar*) &tag, (gchar*) tags[ii]);
+ if (gexiv2_metadata_has_tag (metadata, (gchar*) &tag))
+ {
+ tagcount++;
+ break;
+ }
+ }
+ }
+ return tagcount;
+}
+
+static void
+get_tags (GExiv2Metadata *metadata,
+ const gchar *header,
+ const gchar **tags,
+ const gint items,
+ const gint count)
+{
+ gchar tag[256];
+ int ooo;
+ int iii;
+
+ for (ooo = 1; ooo < count + 1; ooo++)
+ {
+ for (iii = 0; iii < items; iii++)
+ {
+ gchar *value;
+ g_sprintf ((gchar*) &tag, "%s[%d]", header, ooo);
+ g_sprintf ((gchar*) &tag, "%s%s", (gchar*) &tag, (gchar*) tags[iii]);
+ value = gexiv2_metadata_get_tag_string (metadata, (gchar*) &tag);
+ tagdata[ooo-1][iii] = strdup (value);
+ }
+ }
+}
+
+/* ============================================================================
+ * ==[ DATE CALLBACKS ]========================================================
+ * ============================================================================
+ */
+void
+on_create_date_button_clicked (GtkButton *widget,
+ gpointer data)
+{
+ on_date_button_clicked (widget, (GtkWidget*)data,
+ "Xmp.photoshop.DateCreated");
+}
+
+void
+on_patient_dob_date_button_clicked (GtkButton *widget,
+ gpointer data)
+{
+ on_date_button_clicked (widget, (GtkWidget*)data,
+ "Xmp.DICOM.PatientDOB");
+}
+
+void
+on_study_date_button_clicked (GtkButton *widget,
+ gpointer data)
+{
+ on_date_button_clicked (widget, (GtkWidget*)data,
+ "Xmp.DICOM.StudyDateTime");
+}
+
+void
+on_series_date_button_clicked (GtkButton *widget,
+ gpointer data)
+{
+ on_date_button_clicked (widget, (GtkWidget*)data,
+ "Xmp.DICOM.SeriesDateTime");
+}
+
+void
+on_date_button_clicked (GtkButton *widget,
+ GtkWidget *entry_widget,
+ gchar *tag)
+{
+ GtkBuilder *builder;
+ GtkWidget *calendar_dialog;
+ GtkWidget *calendar_content_area;
+ GtkWidget *calendar_vbox;
+ GtkWidget *calendar;
+ const gchar *date_text;
+ gchar *ui_file;
+ GError *error = NULL;
+ GDateTime *current_datetime;
+ guint year, month, day;
+
+ builder = gtk_builder_new ();
+
+ ui_file = g_build_filename (gimp_data_directory (),
+ "ui", "plug-ins",
+ "plug-in-metadata-editor-calendar.ui", NULL);
+
+ if (! gtk_builder_add_from_file (builder, ui_file, &error))
+ {
+ g_printerr ("Error occurred while loading UI file!\n");
+ if (error != NULL)
+ {
+ g_printerr ("Message: %s\n", error->message);
+ g_clear_error (&error);
+ }
+ if (ui_file)
+ g_free (ui_file);
+ g_object_unref (builder);
+ return;
+ }
+
+ if (ui_file)
+ g_free (ui_file);
+
+ date_text = gtk_entry_get_text (GTK_ENTRY (entry_widget));
+ if (date_text && date_text[0] != '\0')
+ {
+ sscanf (date_text, "%d-%d-%d;", &year, &month, &day);
+ month--;
+ }
+ else
+ {
+ current_datetime = g_date_time_new_now_local ();
+ year = g_date_time_get_year (current_datetime);
+ month = g_date_time_get_month (current_datetime) - 1;
+ day = g_date_time_get_day_of_month (current_datetime);
+ }
+
+ calendar_dialog =
+ gtk_dialog_new_with_buttons (_("Calendar Date:"),
+ NULL,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ _("_Cancel"), GTK_RESPONSE_NO,
+ _("Set Date"), GTK_RESPONSE_YES,
+ NULL);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (calendar_dialog),
+ GTK_RESPONSE_YES);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (calendar_dialog),
+ GTK_RESPONSE_YES,
+ GTK_RESPONSE_NO,
+ -1);
+
+ gimp_window_set_transient (GTK_WINDOW (calendar_dialog));
+
+ calendar_content_area = gtk_dialog_get_content_area (GTK_DIALOG (
+ calendar_dialog));
+
+ calendar_vbox = builder_get_widget (builder, "calendar-vbox");
+
+ gtk_container_set_border_width (GTK_CONTAINER (calendar_vbox), 12);
+ gtk_box_pack_start (GTK_BOX (calendar_content_area), calendar_vbox, TRUE, TRUE,
+ 0);
+
+ calendar = builder_get_widget (builder, "calendar");
+
+ gtk_calendar_select_month (GTK_CALENDAR (calendar), month, year);
+ gtk_calendar_select_day (GTK_CALENDAR (calendar), day);
+ gtk_calendar_mark_day (GTK_CALENDAR (calendar), day);
+
+ if (gtk_dialog_run (GTK_DIALOG (calendar_dialog)) == GTK_RESPONSE_YES)
+ {
+ gchar date[25];
+ gtk_calendar_get_date (GTK_CALENDAR (calendar), &year, &month, &day);
+ g_sprintf ((gchar*) &date, "%d-%02d-%02d", year, month+1, day);
+ gtk_entry_set_text (GTK_ENTRY (entry_widget), date);
+ }
+
+ gtk_widget_destroy (calendar_dialog);
+}
+
+/* ============================================================================
+ * ==[ SPECIAL TAGS HANDLERS ]=================================================
+ * ============================================================================
+ */
+
+gboolean
+hasImageSupplierTagData (GtkBuilder *builder)
+{
+ gint loop;
+
+ for (loop = 0; loop < imageSupplierInfoHeader.size; loop++)
+ {
+ GObject *object;
+ const gchar *text;
+
+ object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+ if (! strcmp (imageSupplierInfoTags[loop].mode, "single"))
+ {
+ text = gtk_entry_get_text (GTK_ENTRY (object));
+
+ if (text && *text)
+ return TRUE;
+ }
+ else if (! strcmp (imageSupplierInfoTags[loop].mode, "multi"))
+ {
+ text = gtk_entry_get_text (GTK_ENTRY (object));
+
+ if (text && *text)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+hasLocationCreationTagData (GtkBuilder *builder)
+{
+ gint loop;
+
+ for (loop = 0; loop < creatorContactInfoHeader.size; loop++)
+ {
+ GObject *object;
+ const gchar *text;
+
+ object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+ if (! strcmp (locationCreationInfoTags[loop].mode, "single"))
+ {
+ text = gtk_entry_get_text (GTK_ENTRY (object));
+
+ if (text && *text)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+hasModelReleaseTagData (GtkBuilder *builder)
+{
+ return FALSE;
+}
+
+gboolean
+hasPropertyReleaseTagData (GtkBuilder *builder)
+{
+ return FALSE;
+}
+
+
+gboolean
+hasCreatorTagData (GtkBuilder *builder)
+{
+ gboolean has_data = FALSE;
+ gint loop;
+
+ for (loop = 0; loop < creatorContactInfoHeader.size; loop++)
+ {
+ GObject *object;
+
+ object = gtk_builder_get_object (builder, default_metadata_tags[loop].tag);
+
+ if (GTK_IS_ENTRY (object))
+ {
+ const gchar *text = gtk_entry_get_text (GTK_ENTRY (object));
+
+ if (text && *text)
+ has_data = TRUE;
+ }
+ else if (GTK_IS_TEXT_VIEW (object))
+ {
+ GtkTextView *text_view = GTK_TEXT_VIEW (object);
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer (text_view);
+ GtkTextIter start;
+ GtkTextIter end;
+ gchar *text;
+
+ gtk_text_buffer_get_start_iter (buffer, &start);
+ gtk_text_buffer_get_end_iter (buffer, &end);
+
+ text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+
+ if (text && *text)
+ has_data = TRUE;
+
+ if (text)
+ g_free (text);
+ }
+ }
+
+ return has_data;
+}
+
+/* ============================================================================
+ * ==[ SET DIALOG METADATA ]===================================================
+ * ============================================================================
+ */
+
+/* CELL EDITED */
+
+void
+cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data,
+ int index)
+{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ model = (GtkTreeModel *)data;
+ path = gtk_tree_path_new_from_string (path_string);
+
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, index,
+ new_text, -1);
+}
+
+void
+cell_edited_callback_combo (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data,
+ int column)
+{
+ GtkWidget *widget;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ GtkTreeSelection *selection;
+
+ widget = GTK_WIDGET (data);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+
+ if (gtk_tree_selection_get_selected (GTK_TREE_SELECTION (selection),
+ NULL, &iter))
+ {
+ path = gtk_tree_model_get_path (treemodel, &iter);
+ gtk_tree_path_free (path);
+ gtk_list_store_set (liststore, &iter, column, new_text, -1);
+ }
+}
+
+static void
+licensor_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+licensor_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+licensor_phone1_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+licensor_phone_type1_cell_edited_callback (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback_combo (cell, path_string, new_text, data, 3);
+}
+
+static void
+licensor_phone2_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+licensor_phone_type2_cell_edited_callback (GtkCellRendererCombo *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback_combo (cell, path_string, new_text, data, 5);
+}
+
+static void
+licensor_email_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 6);
+}
+
+static void
+licensor_web_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 7);
+}
+
+static void
+cr_owner_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+cr_owner_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+img_cr8_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+img_cr8_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+aoo_copyright_notice_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 5);
+}
+
+static void
+aoo_source_inv_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+aoo_source_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 3);
+}
+
+static void
+aoo_creator_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+aoo_date_creat_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+aoo_title_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+reg_org_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+reg_item_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+loc_sho_sub_loc_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 0);
+}
+
+static void
+loc_sho_city_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 1);
+}
+
+static void
+loc_sho_state_prov_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 2);
+}
+
+static void
+loc_sho_cntry_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 3);
+}
+
+static void
+loc_sho_cntry_iso_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 4);
+}
+
+static void
+loc_sho_wrld_reg_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ cell_edited_callback (cell, path_string, new_text, data, 5);
+}
+
+static void
+prop_rel_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gint column;
+ model = (GtkTreeModel *)data;
+ path = gtk_tree_path_new_from_string (path_string);
+
+ column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+ new_text, -1);
+}
+
+static void
+mod_rel_id_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gint column;
+
+ model = (GtkTreeModel *)data;
+ path = gtk_tree_path_new_from_string (path_string);
+
+ column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+ new_text, -1);
+}
+
+static void
+organisation_image_name_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gint column;
+
+ model = (GtkTreeModel *)data;
+ path = gtk_tree_path_new_from_string (path_string);
+
+ column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+ new_text, -1);
+}
+
+static void
+organisation_image_code_cell_edited_callback (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
+{
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gint column;
+
+ model = (GtkTreeModel *)data;
+ path = gtk_tree_path_new_from_string (path_string);
+
+ column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
+ new_text, -1);
+}
+
+
+/* CELL / ROW REMOVE */
+
+static void
+list_row_remove_callback (GtkWidget *widget,
+ gpointer data,
+ gchar *tag)
+{
+ GtkBuilder *builder = data;
+ GtkWidget *list_widget;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ GtkTreeModel *treemodel;
+ GtkTreeSelection *selection;
+ GtkTreePath *path;
+
+ list_widget = builder_get_widget (builder, tag);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ selection = gtk_tree_view_get_selection ((GtkTreeView *)list_widget);
+
+ if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+ {
+ gint number_of_rows;
+
+ path = gtk_tree_model_get_path (treemodel, &iter);
+ gtk_list_store_remove (liststore, &iter);
+ gtk_tree_path_free (path);
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+ /* Make sur that two rows are always showing, else it looks ugly. */
+ if (number_of_rows < 2)
+ {
+ gtk_list_store_append (liststore, &iter);
+ }
+ }
+}
+
+static void
+property_release_id_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.plus.PropertyReleaseID");
+}
+
+static void
+model_release_id_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.plus.ModelReleaseID");
+}
+
+static void
+shown_location_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.iptcExt.LocationShown");
+}
+
+static void
+feat_org_name_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.iptcExt.OrganisationInImageName");
+}
+
+static void
+feat_org_code_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.iptcExt.OrganisationInImageCode");
+}
+
+static void
+artwork_object_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.iptcExt.ArtworkOrObject");
+}
+
+static void
+reg_entry_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.iptcExt.RegistryId");
+}
+
+static void
+image_creator_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.plus.ImageCreator");
+}
+
+static void
+copyright_own_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.plus.CopyrightOwner");
+}
+
+static void
+licensor_remove_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_remove_callback (widget, data, "Xmp.plus.Licensor");
+}
+
+
+/* CELL / ROW ADD */
+
+static void
+list_row_add_callback (GtkWidget *widget,
+ gpointer data,
+ gchar *tag)
+{
+ GtkBuilder *builder = data;
+ GtkWidget *list_widget;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+
+ list_widget = builder_get_widget (builder, tag);
+
+ liststore = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget)));
+
+ gtk_list_store_append (liststore, &iter);
+}
+
+static void
+property_release_id_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.plus.PropertyReleaseID");
+}
+
+static void
+model_release_id_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.plus.ModelReleaseID");
+}
+
+static void
+shown_location_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.iptcExt.LocationShown");
+}
+
+static void
+feat_org_name_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.iptcExt.OrganisationInImageName");
+}
+
+static void
+feat_org_code_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.iptcExt.OrganisationInImageCode");
+}
+
+static void
+artwork_object_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.iptcExt.ArtworkOrObject");
+}
+
+static void
+reg_entry_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.iptcExt.RegistryId");
+}
+
+static void
+image_creator_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.plus.ImageCreator");
+}
+
+static void
+copyright_own_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.plus.CopyrightOwner");
+}
+
+static void
+licensor_add_callback (GtkWidget *widget,
+ gpointer data)
+{
+ list_row_add_callback (widget, data, "Xmp.plus.Licensor");
+}
+
+
+/* Set dialog display settings and data */
+
+static void
+metadata_dialog_editor_set_metadata (GExiv2Metadata *metadata,
+ GtkBuilder *builder)
+{
+ GtkWidget *combo_widget;
+ GtkWidget *entry_widget;
+ GtkWidget *text_widget;
+ GtkWidget *button_widget;
+ gint width, height;
+ gchar *value;
+ gint i;
+
+ gint32 numele = n_default_metadata_tags;
+
+ /* Setup Buttons */
+ button_widget = builder_get_widget (builder, "add_licensor_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (licensor_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_licensor_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (licensor_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_copyright_own_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (copyright_own_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_copyright_own_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (copyright_own_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_image_creator_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (image_creator_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_image_creator_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (image_creator_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_reg_entry_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (reg_entry_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_reg_entry_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (reg_entry_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_artwork_object_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (artwork_object_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_artwork_object_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (artwork_object_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_feat_org_code_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (feat_org_code_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_feat_org_code_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (feat_org_code_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_feat_org_name_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (feat_org_name_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_feat_org_name_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (feat_org_name_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_shown_location_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (shown_location_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_shown_location_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (shown_location_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_model_rel_id_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (model_release_id_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_model_rel_id_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (model_release_id_remove_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "add_prop_rel_id_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (property_release_id_add_callback),
+ builder);
+
+ button_widget = builder_get_widget (builder, "rem_prop_rel_id_button");
+ g_signal_connect (G_OBJECT (button_widget), "clicked",
+ G_CALLBACK (property_release_id_remove_callback),
+ builder);
+
+
+ /* Setup Comboboxes */
+ combo_widget = builder_get_widget (builder, "Xmp.xmp.Rating");
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ _("Unrated"));
+ for (i = 1; i < 6; i++)
+ {
+ gchar *display = g_strdup_printf ("%d", i);
+
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ display);
+ g_free (display);
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Xmp.xmpRights.Marked");
+ for (i = 0; i < 3; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (marked[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Xmp.photoshop.Urgency");
+ for (i = 0; i < 9; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (urgency[i]));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Xmp.plus.MinorModelAgeDisclosure");
+ for (i = 0; i < 13; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (minormodelagedisclosure[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Xmp.plus.ModelReleaseStatus");
+ for (i = 0; i < 4; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (modelreleasestatus[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+ gtk_widget_get_size_request (combo_widget, &width, &height);
+ gtk_widget_set_size_request (combo_widget, 180, height);
+
+ combo_widget = builder_get_widget (builder, "Xmp.iptcExt.DigitalSourceType");
+ for (i = 0; i < 5; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (digitalsourcetype[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Xmp.plus.PropertyReleaseStatus");
+ for (i = 0; i < 4; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (propertyreleasestatus[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+ gtk_widget_get_size_request (combo_widget, &width, &height);
+ gtk_widget_set_size_request (combo_widget, 180, height);
+
+ combo_widget = builder_get_widget (builder, "Xmp.DICOM.PatientSex");
+ for (i = 0; i < 4; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (dicom[i].display));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Exif.GPSInfo.GPSLatitudeRef");
+ for (i = 0; i < 3; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (gpslatref[i]));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Exif.GPSInfo.GPSLongitudeRef");
+ for (i = 0; i < 3; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (gpslngref[i]));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "Exif.GPSInfo.GPSAltitudeRef");
+ for (i = 0; i < 3; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (gpsaltref[i]));
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ combo_widget = builder_get_widget (builder, "GPSAltitudeSystem");
+ for (i = 0; i < 2; i++)
+ {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_widget),
+ gettext (gpsaltsys[i]));
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo_widget), 0);
+
+ g_signal_connect (G_OBJECT (combo_widget), "changed",
+ G_CALLBACK (gpsaltsys_combo_callback),
+ builder);
+
+ /* Set up text view heights */
+ for (i = 0; i < numele; i++)
+ {
+ if (! strcmp ("multi", default_metadata_tags[i].mode))
+ {
+ text_widget = builder_get_widget (builder,
+ default_metadata_tags[i].tag);
+ gtk_widget_get_size_request (text_widget, &width, &height);
+ gtk_widget_set_size_request (text_widget, width, height + 60);
+ }
+ }
+
+ for (i = 0; i < creatorContactInfoHeader.size; i++)
+ {
+ if (! strcmp ("multi", creatorContactInfoTags[i].mode))
+ {
+ text_widget = builder_get_widget (builder,
+ creatorContactInfoTags[i].id);
+ gtk_widget_get_size_request (text_widget, &width, &height);
+ gtk_widget_set_size_request (text_widget, width, height + 60);
+ }
+ }
+
+ /* Set up lists */
+ for (i = 0; i < imageSupplierInfoHeader.size; i++)
+ {
+ GtkWidget *widget;
+
+ widget = builder_get_widget (builder,
+ imageSupplierInfoTags[i].id);
+
+ value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+ imageSupplierInfoTags[i].tag);
+
+ if (value)
+ {
+ gchar *value_clean;
+ gchar *value_utf;
+
+ value_clean = g_strdup (value);
+
+ if (strstr (value_clean, lang_default) != NULL)
+ {
+ remove_substring (value_clean, lang_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, bag_default) != NULL)
+ {
+ remove_substring (value_clean, bag_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, seq_default) != NULL)
+ {
+ remove_substring (value_clean, seq_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+ if (! strcmp ("single", imageSupplierInfoTags[i].mode))
+ {
+ gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+ }
+ else if (! strcmp ("multi", imageSupplierInfoTags[i].mode))
+ {
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_set_text (buffer, value_utf, -1);
+ }
+ }
+ }
+
+ for (i = 0; i < locationCreationInfoHeader.size; i++)
+ {
+ GtkWidget *widget;
+
+ widget = builder_get_widget (builder,
+ locationCreationInfoTags[i].id);
+
+ value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+ locationCreationInfoTags[i].tag);
+
+ if (value)
+ {
+ gchar *value_clean;
+ gchar *value_utf;
+
+ value_clean = g_strdup (value);
+
+ if (strstr (value_clean, lang_default) != NULL)
+ {
+ remove_substring (value_clean, lang_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, bag_default) != NULL)
+ {
+ remove_substring (value_clean, bag_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, seq_default) != NULL)
+ {
+ remove_substring (value_clean, seq_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+ if (! strcmp ("single", locationCreationInfoTags[i].mode))
+ {
+ gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+ }
+ }
+ }
+
+ /* Set up tag data */
+
+ for (i = 0; i < creatorContactInfoHeader.size; i++)
+ {
+ GtkWidget *widget;
+
+ widget = builder_get_widget (builder, creatorContactInfoTags[i].id);
+
+ value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+ creatorContactInfoTags[i].tag);
+
+ if (value)
+ {
+ gchar *value_clean;
+ gchar *value_utf;
+
+ value_clean = g_strdup (value);
+
+ if (strstr (value_clean, lang_default) != NULL)
+ {
+ remove_substring (value_clean, lang_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, bag_default) != NULL)
+ {
+ remove_substring (value_clean, bag_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, seq_default) != NULL)
+ {
+ remove_substring (value_clean, seq_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+ if (! strcmp ("single", creatorContactInfoTags[i].mode))
+ {
+ gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+ }
+ else if (! strcmp ("multi", creatorContactInfoTags[i].mode))
+ {
+ GtkTextBuffer *buffer;
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_set_text (buffer, value_utf, -1);
+ }
+ }
+ }
+
+ for (i = 0; i < numele; i++)
+ {
+ GtkWidget *widget;
+
+ widget = builder_get_widget (builder, default_metadata_tags[i].tag);
+
+ value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+ default_metadata_tags[i].tag);
+
+ if (! value || value[0] == '\0')
+ {
+ gint index;
+
+ if (value)
+ g_free (value);
+
+ index = default_metadata_tags[i].other_tag_index;
+ if (index > -1)
+ {
+ value = gexiv2_metadata_get_tag_interpreted_string (metadata,
+ equivalent_metadata_tags[index].tag);
+ }
+ }
+
+ if (value)
+ {
+ gchar *value_clean;
+ gchar *value_utf;
+
+ value_clean = g_strdup (value);
+
+ if (strstr (value_clean, lang_default) != NULL)
+ {
+ remove_substring (value_clean, lang_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, bag_default) != NULL)
+ {
+ remove_substring (value_clean, bag_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (strstr (value_clean, seq_default) != NULL)
+ {
+ remove_substring (value_clean, seq_default);
+ if (strstr (value_clean, " ") != NULL)
+ {
+ remove_substring (value_clean, " ");
+ }
+ }
+
+ if (! strcmp ("Exif.GPSInfo.GPSAltitude",
+ default_metadata_tags[i].tag) &&
+ value_clean)
+ {
+ gchar *new_value_clean[2];
+
+ new_value_clean[0] = strtok (value_clean, " ");
+ strcpy (value_clean, new_value_clean[0]);
+ }
+
+ value_utf = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
+
+ if (! strcmp ("single", default_metadata_tags[i].mode))
+ {
+ gtk_entry_set_text (GTK_ENTRY (widget), value_utf);
+ }
+ else if (! strcmp ("multi", default_metadata_tags[i].mode))
+ {
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_set_text (buffer, value_utf, -1);
+ }
+ else if (!strcmp ("list", default_metadata_tags[i].mode))
+ {
+ if (! strcmp ("Xmp.plus.CopyrightOwner",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint store_index;
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* COPYRIGHT OWNER - NAME */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_CR_OWNER_NAME);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (cr_owner_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_CR_OWNER_NAME));
+ }
+
+ /* COPYRIGHT OWNER - ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_CR_OWNER_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (cr_owner_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_CR_OWNER_ID));
+ }
+
+ store_index = 0;
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_CR_OWNER_NAME, NULL,
+ COL_CR_OWNER_ID, NULL,
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_CR_OWNER_NAME, NULL,
+ COL_CR_OWNER_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.ImageCreator",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint store_index;
+ gchar arr1[256][256];
+ gchar arr2[256][256];
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* IMAGE CREATOR - NAME */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_IMG_CR8_NAME);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (img_cr8_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_IMG_CR8_NAME));
+ }
+
+ /* IMAGE CREATOR - ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_IMG_CR8_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (img_cr8_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_IMG_CR8_ID));
+ }
+
+ store_index = 0;
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_IMG_CR8_NAME, &arr1[item],
+ COL_IMG_CR8_ID, &arr2[item],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_IMG_CR8_NAME, NULL,
+ COL_IMG_CR8_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.ArtworkOrObject",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint store_index;
+ gchar arr1[256][256];
+ gchar arr2[256][256];
+ gchar arr3[256][256];
+ gchar arr4[256][256];
+ gchar arr5[256][256];
+ gchar arr6[256][256];
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* ARTWORK OR OBJECT - TITLE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_TITLE);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_title_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_TITLE));
+ }
+
+ /* ARTWORK OR OBJECT - DATE CREATED */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_DATE_CREAT);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r != NULL; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_date_creat_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_DATE_CREAT));
+ }
+
+ /* ARTWORK OR OBJECT - CREATOR */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_CREATOR);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r != NULL; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_creator_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_CREATOR));
+ }
+
+ /* ARTWORK OR OBJECT - SOURCE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_SOURCE);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_source_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_SOURCE));
+ }
+
+ /* ARTWORK OR OBJECT - SOURCE INVENTORY ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_SRC_INV_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_source_inv_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_SRC_INV_ID));
+ }
+
+ /* ARTWORK OR OBJECT - COPYRIGHT NOTICE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_CR_NOT);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_copyright_notice_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_AOO_CR_NOT));
+ }
+
+ store_index = 0;
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_AOO_TITLE, &arr1[item],
+ COL_AOO_DATE_CREAT, &arr2[item],
+ COL_AOO_CREATOR, &arr3[item],
+ COL_AOO_SOURCE, &arr4[item],
+ COL_AOO_SRC_INV_ID, &arr5[item],
+ COL_AOO_CR_NOT, &arr6[item],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_AOO_TITLE, NULL,
+ COL_AOO_DATE_CREAT, NULL,
+ COL_AOO_CREATOR, NULL,
+ COL_AOO_SOURCE, NULL,
+ COL_AOO_SRC_INV_ID, NULL,
+ COL_AOO_CR_NOT, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.RegistryId",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint store_index;
+ gchar arr1[256][256];
+ gchar arr2[256][256];
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* LOCATION SHOWN - SUB LOCATION */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_REGSITRY_ORG_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r != NULL; r = r->next)
+ {
+ renderer = (GtkCellRenderer*) r->data;
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (reg_org_id_cell_edited_callback), treemodel);
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_REGSITRY_ORG_ID));
+ }
+
+ /* LOCATION SHOWN - CITY */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_REGSITRY_ITEM_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (reg_item_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_REGSITRY_ITEM_ID));
+ }
+
+ store_index = 0;
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_REGSITRY_ORG_ID, &arr1[item],
+ COL_REGSITRY_ITEM_ID, &arr2[item],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_REGSITRY_ORG_ID, NULL,
+ COL_REGSITRY_ITEM_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.OrganisationInImageName",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ gint i_ctr;
+ gint store_index;
+ gchar arr[256][256];
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (* str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (organisation_image_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_ORG_IMG_NAME));
+ }
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_NAME, &arr[item],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_NAME, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.OrganisationInImageCode",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (* str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (organisation_image_code_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column", GINT_TO_POINTER (COL_ORG_IMG_CODE));
+ }
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_CODE, &arr[item],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_CODE, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.PropertyReleaseID",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (* str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (prop_rel_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_PROP_REL_ID));
+ }
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_PROP_REL_ID, &arr[item],
+ -1);
+ }
+
+ if (store_index == 1)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_PROP_REL_ID, NULL,
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_PROP_REL_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.ModelReleaseID",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (*str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (mod_rel_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_PROP_REL_ID));
+ }
+
+ if (store_index > 0)
+ {
+ gint item;
+
+ for (item = 0; item < store_index; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_MOD_REL_ID, &arr[item],
+ -1);
+ }
+
+ if (store_index == 1)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_MOD_REL_ID, NULL,
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_MOD_REL_ID, NULL,
+ -1);
+ }
+ }
+ }
+ }
+ else if (! strcmp ("combo", default_metadata_tags[i].mode))
+ {
+ gint32 data = 0;
+
+ if (! strcmp ("Exif.GPSInfo.GPSLatitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ if (! strncmp ("N", value, 1))
+ {
+ data = 1;
+ }
+ else if (! strncmp ("S", value, 1))
+ {
+ data = 2;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSLongitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ if (! strncmp ("E", value, 1))
+ {
+ data = 1;
+ }
+ else if (! strncmp ("W", value, 1))
+ {
+ data = 2;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSAltitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ if (! strncmp ("A", value, 1))
+ {
+ data = 1;
+ }
+ else if (! strncmp ("B", value, 1))
+ {
+ data = 2;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Xmp.xmp.Rating", default_metadata_tags[i].tag))
+ {
+ if (! strcmp ("1", value))
+ {
+ data = 1;
+ }
+ else if (! strcmp ("2", value))
+ {
+ data = 2;
+ }
+ else if (! strcmp ("3", value))
+ {
+ data = 3;
+ }
+ else if (! strcmp ("4", value))
+ {
+ data = 4;
+ }
+ else if (! strcmp ("5", value))
+ {
+ data = 5;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Xmp.xmpRights.Marked",
+ default_metadata_tags[i].tag))
+ {
+ if (! strcmp ("True", value))
+ {
+ data = 1;
+ }
+ else if (! strcmp ("False", value))
+ {
+ data = 2;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Xmp.photoshop.Urgency",
+ default_metadata_tags[i].tag))
+ {
+ if (! strcmp ("1", value))
+ {
+ data = 1;
+ }
+ else if (! strcmp ("2", value))
+ {
+ data = 2;
+ }
+ else if (! strcmp ("3", value))
+ {
+ data = 3;
+ }
+ else if (! strcmp ("4", value))
+ {
+ data = 4;
+ }
+ else if (! strcmp ("5", value))
+ {
+ data = 5;
+ }
+ else if (! strcmp ("6", value))
+ {
+ data = 6;
+ }
+ else if (! strcmp ("7", value))
+ {
+ data = 7;
+ }
+ else if (! strcmp ("8", value))
+ {
+ data = 8;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Xmp.plus.MinorModelAgeDisclosure",
+ default_metadata_tags[i].tag))
+ {
+ if (! strcmp ("Age Unknown", value))
+ {
+ data = 0;
+ }
+ else if (! strcmp ("Age 25 or Over", value))
+ {
+ data = 1;
+ }
+ else if (! strcmp ("Age 24", value))
+ {
+ data = 2;
+ }
+ else if (! strcmp ("Age 23", value))
+ {
+ data = 3;
+ }
+ else if (! strcmp ("Age 22", value))
+ {
+ data = 4;
+ }
+ else if (! strcmp ("Age 21", value))
+ {
+ data = 5;
+ }
+ else if (! strcmp ("Age 20", value))
+ {
+ data = 6;
+ }
+ else if (! strcmp ("Age 19", value))
+ {
+ data = 7;
+ }
+ else if (! strcmp ("Age 18", value))
+ {
+ data = 8;
+ }
+ else if (! strcmp ("Age 17", value))
+ {
+ data = 9;
+ }
+ else if (! strcmp ("Age 16", value))
+ {
+ data = 10;
+ }
+ else if (! strcmp ("Age 15", value))
+ {
+ data = 11;
+ }
+ else if (! strcmp ("Age 14 or Under", value))
+ {
+ data = 12;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ else if (! strcmp ("Xmp.plus.ModelReleaseStatus",
+ default_metadata_tags[i].tag))
+ {
+ gint loop;
+
+ for (loop = 0; loop < 4; loop++)
+ {
+ if (! strcmp (modelreleasestatus[loop].data, value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+
+ if (! strcmp (gettext (modelreleasestatus[loop].display),
+ value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.DigitalSourceType",
+ default_metadata_tags[i].tag))
+ {
+ gint loop;
+
+ for (loop = 0; loop < 5; loop++)
+ {
+ if (! strcmp (digitalsourcetype[loop].data, value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+
+ if (! strcmp (gettext (digitalsourcetype[loop].display),
+ value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.PropertyReleaseStatus",
+ default_metadata_tags[i].tag))
+ {
+ gint loop;
+
+ for (loop = 0; loop < 4; loop++)
+ {
+ if (! strcmp (propertyreleasestatus[loop].data, value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+
+ if (! strcmp (gettext (propertyreleasestatus[loop].display),
+ value))
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), loop);
+ break;
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.DICOM.PatientSex",
+ default_metadata_tags[i].tag))
+ {
+ if (! strcmp ("male", value))
+ {
+ data = 1;
+ }
+ else if (! strcmp ("female", value))
+ {
+ data = 2;
+ }
+ else if (! strcmp ("other", value))
+ {
+ data = 3;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (widget), data);
+ }
+ }
+ }
+ else
+ {
+ if (! strcmp ("list", default_metadata_tags[i].mode))
+ {
+ if (! strcmp ("Xmp.plus.Licensor", default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkTreeModel *phonemodel;
+ GtkListStore *liststore;
+ GtkListStore *phonestore;
+ GtkTreeIter iter;
+ GtkTreeIter phoneiter;
+ gint counter;
+ gint j;
+
+ counter = count_tags (metadata, LICENSOR_HEADER,
+ licensor,
+ n_licensor);
+
+ get_tags (metadata, LICENSOR_HEADER,
+ licensor,
+ n_licensor, counter);
+
+ phonestore = gtk_list_store_new (1, G_TYPE_STRING);
+ gtk_list_store_append (phonestore, &phoneiter);
+ gtk_list_store_set (phonestore, &phoneiter, 0, "Unknown", -1);
+ for (j=1; j < 6; j++)
+ {
+ gtk_list_store_append (phonestore, &phoneiter);
+ gtk_list_store_set (phonestore, &phoneiter,
+ 0, gettext (phone_types[j].display),
+ -1);
+ }
+ phonemodel = GTK_TREE_MODEL (phonestore);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* LICENSOR - NAME */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_NAME);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_NAME));
+ }
+
+ /* LICENSOR - ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_ID));
+ }
+
+ /* LICENSOR - PHONE NUMBER 1 */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_PHONE1);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_phone1_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_PHONE1));
+ }
+
+ /* LICENSOR - PHONE TYPE 1 */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_PHONE_TYPE1);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ "text-column", 0,
+ "has-entry", FALSE,
+ "model", phonemodel,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_phone_type1_cell_edited_callback),
+ widget);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_PHONE_TYPE1));
+ }
+
+ /* LICENSOR - PHONE NUMBER 2 */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_PHONE2);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_phone2_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_PHONE2));
+ }
+
+ /* LICENSOR - PHONE TYPE 2 */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_PHONE_TYPE2);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ "text-column", 0,
+ "has-entry", FALSE,
+ "model", phonemodel,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_phone_type2_cell_edited_callback),
+ widget);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_PHONE_TYPE2));
+ }
+
+ /* LICENSOR - EMAIL */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_EMAIL);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_email_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_EMAIL));
+ }
+
+ /* LICENSOR - WEB ADDRESS */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LICENSOR_WEB);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (licensor_web_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LICENSOR_WEB));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ gchar type1[256];
+ gchar type2[256];
+ gint types;
+
+ strcpy (type1, gettext (phone_types[0].display));
+ strcpy (type2, gettext (phone_types[0].display));
+
+ for (types = 0; types < 6; types++)
+ {
+ if (! strcmp (tagdata[item][3],
+ phone_types[types].data))
+ {
+ strcpy (type1,
+ gettext (phone_types[types].display));
+ }
+
+ if (! strcmp (tagdata[item][5],
+ phone_types[types].data))
+ {
+ strcpy (type2,
+ gettext (phone_types[types].display));
+ }
+ }
+
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_LICENSOR_NAME, tagdata[item][0],
+ COL_LICENSOR_ID, tagdata[item][1],
+ COL_LICENSOR_PHONE1, tagdata[item][2],
+ COL_LICENSOR_PHONE_TYPE1, (gchar*)&type1,
+ COL_LICENSOR_PHONE2, tagdata[item][4],
+ COL_LICENSOR_PHONE_TYPE2, (gchar*)&type2,
+ COL_LICENSOR_EMAIL, tagdata[item][6],
+ COL_LICENSOR_WEB, tagdata[item][7],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_LICENSOR_NAME, NULL,
+ COL_LICENSOR_ID, NULL,
+ COL_LICENSOR_PHONE1, NULL,
+ COL_LICENSOR_PHONE_TYPE1, gettext (phone_types[0].display),
+ COL_LICENSOR_PHONE2, NULL,
+ COL_LICENSOR_PHONE_TYPE1, gettext (phone_types[0].display),
+ COL_LICENSOR_EMAIL, NULL,
+ COL_LICENSOR_WEB, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.CopyrightOwner",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint counter;
+
+ counter = count_tags (metadata, COPYRIGHTOWNER_HEADER,
+ copyrightowner,
+ n_copyrightowner);
+
+ get_tags (metadata, COPYRIGHTOWNER_HEADER,
+ copyrightowner,
+ n_copyrightowner, counter);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* COPYRIGHT OWNER - NAME */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_CR_OWNER_NAME);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (cr_owner_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_CR_OWNER_NAME));
+ }
+
+ /* COPYRIGHT OWNER - ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_CR_OWNER_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (cr_owner_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_CR_OWNER_ID));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_CR_OWNER_NAME, tagdata[item][0],
+ COL_CR_OWNER_ID, tagdata[item][1],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_CR_OWNER_NAME, NULL,
+ COL_CR_OWNER_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.plus.ImageCreator",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint counter;
+
+ counter = count_tags (metadata, IMAGECREATOR_HEADER,
+ imagecreator,
+ n_imagecreator);
+
+ get_tags (metadata, IMAGECREATOR_HEADER,
+ imagecreator,
+ n_imagecreator, counter);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* IMAGE CREATOR - NAME */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_IMG_CR8_NAME);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (img_cr8_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_IMG_CR8_NAME));
+ }
+
+ /* IMAGE CREATOR - ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_IMG_CR8_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (img_cr8_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_IMG_CR8_ID));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_IMG_CR8_NAME, tagdata[item][0],
+ COL_IMG_CR8_ID, tagdata[item][1],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_IMG_CR8_NAME, NULL,
+ COL_IMG_CR8_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.ArtworkOrObject",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint counter;
+
+ counter = count_tags (metadata, ARTWORKOROBJECT_HEADER,
+ artworkorobject,
+ n_artworkorobject);
+
+ get_tags (metadata, ARTWORKOROBJECT_HEADER,
+ artworkorobject,
+ n_artworkorobject, counter);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* ARTWORK OR OBJECT - TITLE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_TITLE);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_title_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_TITLE));
+ }
+
+ /* ARTWORK OR OBJECT - DATED CREATED */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_DATE_CREAT);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_date_creat_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_DATE_CREAT));
+ }
+
+ /* ARTWORK OR OBJECT - CREATOR */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_CREATOR);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_creator_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_CREATOR));
+ }
+
+ /* ARTWORK OR OBJECT - SOURCE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_SOURCE);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_source_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_SOURCE));
+ }
+
+ /* ARTWORK OR OBJECT - SOURCE INVENTORY ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_SRC_INV_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_source_inv_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_SRC_INV_ID));
+ }
+
+ /* ARTWORK OR OBJECT - COPYRIGHT NOTICE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_AOO_CR_NOT);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (aoo_copyright_notice_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_AOO_CR_NOT));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ /* remove substring for language id in title field */
+ remove_substring (tagdata[item][4], lang_default);
+ if (strstr (tagdata[item][4], " "))
+ {
+ remove_substring (tagdata[item][4], " ");
+ }
+
+ remove_substring (tagdata[item][4], bag_default);
+ if (strstr (tagdata[item][4], " "))
+ {
+ remove_substring (tagdata[item][4], " ");
+ }
+
+ remove_substring (tagdata[item][4], seq_default);
+ if (strstr (tagdata[item][4], " "))
+ {
+ remove_substring (tagdata[item][4], " ");
+ }
+
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_AOO_TITLE, tagdata[item][4],
+ COL_AOO_DATE_CREAT, tagdata[item][0],
+ COL_AOO_CREATOR, tagdata[item][5],
+ COL_AOO_SOURCE, tagdata[item][1],
+ COL_AOO_SRC_INV_ID, tagdata[item][2],
+ COL_AOO_CR_NOT, tagdata[item][3],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_AOO_TITLE, NULL,
+ COL_AOO_DATE_CREAT, NULL,
+ COL_AOO_CREATOR, NULL,
+ COL_AOO_SOURCE, NULL,
+ COL_AOO_SRC_INV_ID, NULL,
+ COL_AOO_CR_NOT, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.RegistryId",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint counter;
+
+ counter = count_tags (metadata, REGISTRYID_HEADER,
+ registryid,
+ n_registryid);
+
+ get_tags (metadata, REGISTRYID_HEADER,
+ registryid,
+ n_registryid, counter);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* REGISTRY - ORGANIZATION ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_REGSITRY_ORG_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (reg_org_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_REGSITRY_ORG_ID));
+ }
+
+ /* REGISTRY - ITEM ID */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_REGSITRY_ITEM_ID);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (reg_item_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_REGSITRY_ITEM_ID));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_REGSITRY_ORG_ID, tagdata[item][0],
+ COL_REGSITRY_ITEM_ID, tagdata[item][1],
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_REGSITRY_ORG_ID, NULL,
+ COL_REGSITRY_ITEM_ID, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.LocationShown",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gint counter;
+
+ counter = count_tags (metadata, LOCATIONSHOWN_HEADER,
+ locationshown,
+ n_locationshown);
+
+ get_tags (metadata, LOCATIONSHOWN_HEADER,
+ locationshown,
+ n_locationshown, counter);
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ /* LOCATION SHOWN - SUB LOCATION */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_SUB_LOC);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_sub_loc_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_SUB_LOC));
+ }
+
+ /* LOCATION SHOWN - CITY */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_CITY);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_city_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_CITY));
+ }
+
+ /* LOCATION SHOWN - STATE PROVINCE */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_STATE_PROV);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_state_prov_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_STATE_PROV));
+ }
+
+ /* LOCATION SHOWN - COUNTRY */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_CNTRY);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_cntry_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_CNTRY));
+ }
+
+ /* LOCATION SHOWN - COUNTRY ISO */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_CNTRY_ISO);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_cntry_iso_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_CNTRY_ISO));
+ }
+
+ /* LOCATION SHOWN - WORLD REGION */
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget),
+ COL_LOC_SHO_CNTRY_WRLD_REG);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (loc_sho_wrld_reg_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_LOC_SHO_CNTRY_WRLD_REG));
+ }
+
+ if (counter > 0)
+ {
+ gint item;
+
+ for (item = 0; item < counter; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_LOC_SHO_SUB_LOC, tagdata[item][0],
+ COL_LOC_SHO_CITY, tagdata[item][1],
+ COL_LOC_SHO_STATE_PROV, tagdata[item][2],
+ COL_LOC_SHO_CNTRY, tagdata[item][3],
+ COL_LOC_SHO_CNTRY_ISO, tagdata[item][4],
+ COL_LOC_SHO_CNTRY_WRLD_REG, tagdata[item][5],
+ -1);
+ }
+
+ if (counter == 1)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_LOC_SHO_SUB_LOC, NULL,
+ COL_LOC_SHO_CITY, NULL,
+ COL_LOC_SHO_STATE_PROV, NULL,
+ COL_LOC_SHO_CNTRY, NULL,
+ COL_LOC_SHO_CNTRY_ISO, NULL,
+ COL_LOC_SHO_CNTRY_WRLD_REG, NULL,
+ -1);
+ }
+ }
+ else
+ {
+ gint item;
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_LOC_SHO_SUB_LOC, NULL,
+ COL_LOC_SHO_CITY, NULL,
+ COL_LOC_SHO_STATE_PROV, NULL,
+ COL_LOC_SHO_CNTRY, NULL,
+ COL_LOC_SHO_CNTRY_ISO, NULL,
+ COL_LOC_SHO_CNTRY_WRLD_REG, NULL,
+ -1);
+ }
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.OrganisationInImageName",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ gint i_ctr;
+ gint store_index;
+ gchar arr[256][256];
+ gint item;
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (*str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (organisation_image_name_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_ORG_IMG_NAME));
+ }
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_NAME, NULL,
+ -1);
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.OrganisationInImageCode",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+ gint item;
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (*str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (organisation_image_code_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_ORG_IMG_CODE));
+ }
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_ORG_IMG_CODE, NULL,
+ -1);
+ }
+ }
+ else if (! strcmp ("Xmp.plus.PropertyReleaseID",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+ gint item;
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (*str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (prop_rel_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_PROP_REL_ID));
+ }
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_PROP_REL_ID, NULL,
+ -1);
+ }
+ }
+ else if (! strcmp ("Xmp.plus.ModelReleaseID",
+ default_metadata_tags[i].tag))
+ {
+ GList *rlist;
+ GList *r;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkTreeModel *treemodel;
+ GtkListStore *liststore;
+ GtkTreeIter iter;
+ gchar *str;
+ int i_ctr;
+ int store_index;
+ gchar arr[256][256];
+ gint item;
+
+ /* separate list on commas */
+ store_index = 0;
+ if (value)
+ {
+ for (i_ctr = 0, str = strtok (value, ",;");
+ str;
+ i_ctr++, str = strtok (NULL, ",;"))
+ {
+ /* remove leading whitespace */
+ gint l = strlen (str);
+
+ while (isspace (str[l - 1])) --l;
+ while (*str && isspace (*str)) ++str, --l;
+
+ /* stuff into array */
+ strcpy (arr[i_ctr], str);
+ store_index++;
+ }
+ }
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ liststore = GTK_LIST_STORE (treemodel);
+
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ GTK_SELECTION_SINGLE);
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
+ rlist = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column));
+ for (r = rlist; r; r = r->next)
+ {
+ renderer = r->data;
+
+ g_object_set (renderer,
+ "editable", TRUE,
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (mod_rel_id_cell_edited_callback),
+ treemodel);
+
+ g_object_set_data (G_OBJECT (renderer),
+ "column",
+ GINT_TO_POINTER (COL_PROP_REL_ID));
+ }
+
+ for (item = 0; item < 2; item++)
+ {
+ gtk_list_store_append (liststore, &iter);
+ gtk_list_store_set (liststore, &iter,
+ COL_PROP_REL_ID, NULL,
+ -1);
+ }
+ }
+ }
+ }
+ }
+
+ /* Set creation date */
+ entry_widget = builder_get_widget (builder, "create_date_button");
+ g_signal_connect (entry_widget, "clicked",
+ G_CALLBACK (on_create_date_button_clicked),
+ builder_get_widget (builder,
+ "Xmp.photoshop.DateCreated"));
+
+ /* Set patient dob date */
+ entry_widget = builder_get_widget (builder, "dob_date_button");
+ g_signal_connect (entry_widget, "clicked",
+ G_CALLBACK (on_patient_dob_date_button_clicked),
+ builder_get_widget (builder,
+ "Xmp.DICOM.PatientDOB"));
+
+ /* Set study date */
+ entry_widget = builder_get_widget (builder, "study_date_button");
+ g_signal_connect (entry_widget, "clicked",
+ G_CALLBACK (on_study_date_button_clicked),
+ builder_get_widget (builder,
+ "Xmp.DICOM.StudyDateTime"));
+
+ /* Set series date */
+ entry_widget = builder_get_widget (builder, "series_date_button");
+ g_signal_connect (entry_widget, "clicked",
+ G_CALLBACK (on_series_date_button_clicked),
+ builder_get_widget (builder,
+ "Xmp.DICOM.SeriesDateTime"));
+}
+
+
+/* ============================================================================
+ * ==[ WRITE METADATA ]========================================================
+ * ============================================================================
+ */
+
+static void
+set_tag_string (GimpMetadata *metadata,
+ const gchar *name,
+ const gchar *value)
+{
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (metadata), name);
+
+ if (metadata == NULL) return;
+ if (name == NULL) return;
+ if (value == NULL) return;
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
+ name, value))
+ {
+ g_printerr ("metadata-editor: failed to set tag [%s]\n", name);
+ }
+}
+
+void
+metadata_editor_write_callback (GtkWidget *dialog,
+ GtkBuilder *builder,
+ gint32 image_id)
+{
+ GimpMetadata *g_metadata;
+ gint max_elements;
+ gint i;
+ GtkWidget *list_widget;
+ GtkTreeIter iter;
+ GtkTreeModel *treemodel;
+ gchar *rc_data;
+ gint number_of_rows;
+ gchar output_data[256 * 1024];
+ gchar tag[1024];
+ gint counter;
+ gint row;
+
+ i = 0;
+
+ g_metadata = gimp_image_get_metadata (image_id);
+
+ gimp_metadata_add_xmp_history (g_metadata, "metadata");
+
+ /* DO ORG IMG NAME (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder,
+ "Xmp.iptcExt.OrganisationInImageName");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ output_data[0] = 0;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gtk_tree_model_get (treemodel, &iter,
+ COL_ORG_IMG_NAME, &rc_data,
+ -1);
+ if (rc_data && *rc_data)
+ {
+ strcat (output_data, rc_data);
+ if (row + 1 < number_of_rows)
+ strcat (output_data, ", ");
+ }
+ }
+ }
+
+ set_tag_string (g_metadata,
+ "Xmp.iptcExt.OrganisationInImageName",
+ output_data);
+
+ /* DO ORG IMG CODE (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder,
+ "Xmp.iptcExt.OrganisationInImageCode");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ output_data[0] = 0;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gtk_tree_model_get (treemodel, &iter,
+ COL_ORG_IMG_CODE, &rc_data,
+ -1);
+ if (rc_data && *rc_data)
+ {
+ strcat (output_data, rc_data);
+ if (row + 1 < number_of_rows)
+ strcat (output_data, ", ");
+ }
+ }
+ }
+
+ set_tag_string (g_metadata,
+ "Xmp.iptcExt.OrganisationInImageCode",
+ output_data);
+
+ /* DO MODEL RELEASE (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.plus.ModelReleaseID");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ output_data[0] = 0;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gtk_tree_model_get (treemodel, &iter,
+ COL_MOD_REL_ID, &rc_data,
+ -1);
+ if (rc_data && *rc_data)
+ {
+ strcat (output_data, rc_data);
+ if (row + 1 < number_of_rows)
+ strcat (output_data, ", ");
+ }
+ }
+ }
+
+ set_tag_string (g_metadata,
+ "Xmp.plus.ModelReleaseID",
+ output_data);
+
+ /* DO PROPERTY RELEASE (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.plus.PropertyReleaseID");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ output_data[0] = 0;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gtk_tree_model_get (treemodel, &iter,
+ COL_PROP_REL_ID, &rc_data,
+ -1);
+ if (rc_data && *rc_data)
+ {
+ strcat (output_data, rc_data);
+ if (row + 1 < number_of_rows)
+ strcat (output_data, ", ");
+ }
+ }
+ }
+
+ set_tag_string (g_metadata,
+ "Xmp.plus.PropertyReleaseID",
+ output_data);
+
+ /* DO LOCATION SHOWN (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.iptcExt.LocationShown");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR LOCATION SHOW DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ LOCATIONSHOWN_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_locationshown; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, row, locationshown[item]);
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET LOCATION SHOW DATA */
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.iptcExt.LocationShown",
+ GEXIV2_STRUCTURE_XA_BAG);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_SUB_LOC, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_CITY, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_STATE_PROV, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[2]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_CNTRY, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[3]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_CNTRY_ISO, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[4]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LOC_SHO_CNTRY_WRLD_REG, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LOCATIONSHOWN_HEADER, counter, locationshown[5]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO ARTWORK OR OBJECT (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.iptcExt.ArtworkOrObject");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR ARTWORK OR OBJECT DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ ARTWORKOROBJECT_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_artworkorobject; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, row, artworkorobject[item]);
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET ARTWORK OR OBJECT DATA */
+
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.iptcExt.ArtworkOrObject",
+ GEXIV2_STRUCTURE_XA_BAG);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_TITLE, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_DATE_CREAT, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_CREATOR, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[2]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_SOURCE, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[3]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_SRC_INV_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[4]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_AOO_CR_NOT, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ ARTWORKOROBJECT_HEADER, counter, artworkorobject[5]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO REGISTRY ID (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.iptcExt.RegistryId");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR REGISTRY ID DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ REGISTRYID_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_registryid; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ REGISTRYID_HEADER, row, registryid[item]);
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET REGISTRY ID DATA */
+
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.iptcExt.RegistryId",
+ GEXIV2_STRUCTURE_XA_BAG);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_REGSITRY_ORG_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ REGISTRYID_HEADER, counter, registryid[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_REGSITRY_ITEM_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ REGISTRYID_HEADER, counter, registryid[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO IMAGE CREATOR (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.plus.ImageCreator");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR IMAGE CREATOR DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ IMAGECREATOR_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_imagecreator; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ IMAGECREATOR_HEADER, row, imagecreator[item]);
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET IMAGE CREATOR DATA */
+
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.plus.ImageCreator",
+ GEXIV2_STRUCTURE_XA_SEQ);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_IMG_CR8_NAME, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ IMAGECREATOR_HEADER, counter, imagecreator[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_IMG_CR8_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ IMAGECREATOR_HEADER, counter, imagecreator[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO COPYRIGHT OWNER (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.plus.CopyrightOwner");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR COPYRIGHT OWNER DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ COPYRIGHTOWNER_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_copyrightowner; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ COPYRIGHTOWNER_HEADER, row, copyrightowner[item]);
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET COPYRIGHT OWNER DATA */
+
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.plus.CopyrightOwner",
+ GEXIV2_STRUCTURE_XA_SEQ);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_CR_OWNER_NAME, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ COPYRIGHTOWNER_HEADER, counter, copyrightowner[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_CR_OWNER_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ COPYRIGHTOWNER_HEADER, counter, copyrightowner[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO LICENSOR (LISTSTORE) */
+
+ list_widget = builder_get_widget (builder, "Xmp.plus.Licensor");
+
+ treemodel = gtk_tree_view_get_model (GTK_TREE_VIEW (list_widget));
+
+ number_of_rows = gtk_tree_model_iter_n_children (treemodel, NULL);
+
+ /* CLEAR LICENSOR DATA */
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ LICENSOR_HEADER);
+
+ output_data[0] = 0;
+ for (row = 0; row < 256; row++)
+ {
+ gint item;
+
+ for (item = 0; item < n_licensor; item++)
+ {
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, row, licensor[item]);
+
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata), tag);
+ }
+ }
+
+ /* SET LICENSOR DATA */
+
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ "Xmp.plus.Licensor",
+ GEXIV2_STRUCTURE_XA_SEQ);
+
+ counter = 1;
+ for (row = 0; row < number_of_rows; row++)
+ {
+ if (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, row))
+ {
+ gchar *tag_data;
+ gchar type1[256];
+ gchar type2[256];
+ gint types;
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_NAME, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[0]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_ID, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[1]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_PHONE1, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[2]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_PHONE_TYPE1, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[3]);
+
+ strcpy (type1, phone_types[0].data);
+
+ if (tag_data != NULL)
+ {
+ for (types = 0; types < 6; types++)
+ {
+ if (! strcmp (tag_data, gettext (phone_types[types].display)))
+ {
+ strcpy (type1, phone_types[types].data);
+ break;
+ }
+ }
+ }
+
+ set_tag_string (g_metadata, tag, type1);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_PHONE2, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[4]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_PHONE_TYPE2, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[5]);
+
+ strcpy (type2, phone_types[0].data);
+
+ if (tag_data != NULL)
+ {
+ for (types = 0; types < 6; types++)
+ {
+ g_print ("%d %s %s\n", types, tag_data,
+ gettext (phone_types[types].display));
+ if (! strcmp (tag_data, gettext (phone_types[types].display)))
+ {
+ g_print ("%d %s \n", types, phone_types[types].data);
+ strcpy (type2, phone_types[types].data);
+ break;
+ }
+ }
+ }
+ set_tag_string (g_metadata, tag, type2);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_EMAIL, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[6]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ gtk_tree_model_get (treemodel, &iter,
+ COL_LICENSOR_WEB, &tag_data,
+ -1);
+
+ g_snprintf (tag, sizeof (tag), "%s[%d]%s",
+ LICENSOR_HEADER, counter, licensor[7]);
+
+ set_tag_string (g_metadata, tag, tag_data);
+ g_free (tag_data);
+
+ counter++;
+ }
+ }
+
+ /* DO CREATOR TAGS */
+
+ if (hasCreatorTagData (builder))
+ {
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ creatorContactInfoHeader.header,
+ "type=\"Struct\""))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ creatorContactInfoTags[i].tag);
+ }
+
+ for (i = 0; i < creatorContactInfoHeader.size; i++)
+ {
+ GObject *object = gtk_builder_get_object (builder,
+ creatorContactInfoTags[i].id);
+
+ if (! strcmp ("single", creatorContactInfoTags[i].mode))
+ {
+ GtkEntry *entry = GTK_ENTRY (object);
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ creatorContactInfoTags[i].tag,
+ gtk_entry_get_text (entry)))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ creatorContactInfoTags[i].tag);
+ }
+ }
+ else if (! strcmp ("multi", default_metadata_tags[i].mode))
+ {
+ GtkTextView *text_view = GTK_TEXT_VIEW (object);
+ GtkTextBuffer *buffer;
+ GtkTextIter start;
+ GtkTextIter end;
+ gchar *text;
+
+ buffer = gtk_text_view_get_buffer (text_view);
+ gtk_text_buffer_get_start_iter (buffer, &start);
+ gtk_text_buffer_get_end_iter (buffer, &end);
+
+ text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ creatorContactInfoTags[i].tag,
+ text))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ creatorContactInfoTags[i].tag);
+ }
+
+ g_free (text);
+ }
+ }
+ }
+
+ /* DO SINGLE, MULTI AND COMBO TAGS */
+
+ else
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ creatorContactInfoHeader.header);
+
+ for (i = 0; i < creatorContactInfoHeader.size; i++)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ creatorContactInfoTags[i].tag);
+ }
+ }
+
+ max_elements = n_default_metadata_tags;
+
+ for (i = 0; i < max_elements; i++)
+ {
+ GObject *object = gtk_builder_get_object (builder,
+ default_metadata_tags[i].tag);
+
+ /* SINGLE TAGS */
+
+ if (! strcmp ("single", default_metadata_tags[i].mode))
+ {
+ GtkEntry *entry = GTK_ENTRY (object);
+ gchar *value_entry = g_strdup (gtk_entry_get_text (entry));
+
+ if (! strcmp ("Exif.GPSInfo.GPSLongitude",
+ default_metadata_tags[i].tag))
+ {
+ const gchar delimiters_dms[] = " deg'\"";
+ gchar lng[256];
+ gchar *s = g_strdup (value_entry);
+ gchar *str1 = NULL;
+ gchar *str2 = NULL;
+ gchar *str3 = NULL;
+
+ if (s && strstr (s, "."))
+ {
+ gdouble degs;
+ gint deg;
+ gint min;
+ gint sec;
+
+ degs = atof (s);
+ if (degs < 0)
+ degs *= -1;
+ deg = (gint) degs;
+ min = (gint) ((degs - deg) * 60.f);
+ sec = (gint) ((degs - (float) deg - (float) (min / 60.f)) * 60.f * 60.f);
+ str1 = malloc (256);
+ str2 = malloc (256);
+ str3 = malloc (256);
+ g_sprintf (str1, "%d", deg);
+ g_sprintf (str2, "%d", min);
+ g_sprintf (str3, "%d", sec);
+ }
+ else if (s)
+ {
+ str1 = strtok (s, delimiters_dms);
+ str2 = strtok (NULL, delimiters_dms);
+ str3 = strtok (NULL, delimiters_dms);
+ }
+
+ if (str1)
+ {
+ strcpy (lng, str1);
+ strcat (lng, "/1");
+ }
+ else
+ {
+ strcpy (lng, "0/1");
+ }
+
+ if (str2)
+ {
+ strcat (lng, " ");
+ strcat (lng, str2);
+ strcat (lng, "/1");
+ }
+ else
+ {
+ strcat (lng, " ");
+ strcat (lng, "0/1");
+ }
+
+ if (str3)
+ {
+ strcat (lng, " ");
+ strcat (lng, str3);
+ strcat (lng, "/1");
+ }
+ else
+ {
+ strcat (lng, " ");
+ strcat (lng, "0/1");
+ }
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ lng))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+
+ if (s && strstr (s, "."))
+ {
+ free (str1);
+ free (str2);
+ free (str3);
+ }
+
+ free (s);
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSLatitude",
+ default_metadata_tags[i].tag))
+ {
+ const gchar delimiters_dms[] = " deg'\"";
+ gchar lat[256];
+ gchar *s = g_strdup (value_entry);
+ gchar *str1 = NULL;
+ gchar *str2 = NULL;
+ gchar *str3 = NULL;
+
+ if (s && strstr (s, "."))
+ {
+ gdouble degs;
+ gint deg;
+ gint min;
+ gint sec;
+
+ degs = atof (s);
+ if (degs < 0)
+ degs *= -1;
+ deg = (gint) (degs);
+ min = (gint) ((degs - deg) * 60.f);
+ sec = (gint) ((degs - (float) deg - (float) (min / 60.f)) * 60.f * 60.f);
+ str1 = malloc (256);
+ str2 = malloc (256);
+ str3 = malloc (256);
+ g_sprintf (str1, "%d", deg);
+ g_sprintf (str2, "%d", min);
+ g_sprintf (str3, "%d", sec);
+ }
+ else if (s)
+ {
+ str1 = strtok (s, delimiters_dms);
+ str2 = strtok (NULL, delimiters_dms);
+ str3 = strtok (NULL, delimiters_dms);
+ }
+
+ if (str1)
+ {
+ strcpy (lat, str1);
+ strcat (lat, "/1");
+ }
+ else
+ {
+ strcpy (lat, "0/1");
+ }
+
+ if (str2)
+ {
+ strcat (lat, " ");
+ strcat (lat, str2);
+ strcat (lat, "/1");
+ }
+ else
+ {
+ strcat (lat, " ");
+ strcat (lat, "0/1");
+ }
+
+ if (str3)
+ {
+ strcat (lat, " ");
+ strcat (lat, str3);
+ strcat (lat, "/1");
+ }
+ else
+ {
+ strcat (lat, " ");
+ strcat (lat, "0/1");
+ }
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ lat))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+
+ if (s)
+ free (s);
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSAltitude",
+ default_metadata_tags[i].tag))
+ {
+ GtkWidget *combo_widget;
+ gchar alt_str[256];
+ gdouble alt_d;
+ gint msr;
+
+ combo_widget = builder_get_widget (builder,
+ "GPSAltitudeSystem");
+ msr = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_widget));
+
+ alt_d = atof (gtk_entry_get_text (entry));
+ if (msr == 1)
+ alt_d = (alt_d * 12 * 2.54) / 100;
+ alt_d *= 10.f;
+
+ g_snprintf (alt_str, sizeof (alt_str), "%d/10", (gint) alt_d);
+
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ alt_str))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ else
+ {
+ const gchar *text_value = gtk_entry_get_text (entry);
+
+ if (default_metadata_tags[i].xmp_type == GIMP_XMP_TEXT ||
+ default_metadata_tags[i].xmp_type == GIMP_XMP_NONE)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_NONE);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text_value))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ else if (default_metadata_tags[i].xmp_type == GIMP_XMP_BAG)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_BAG);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text_value))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ else if (default_metadata_tags[i].xmp_type == GIMP_XMP_SEQ)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_SEQ);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text_value))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ }
+ }
+
+ /* MULTI TAGS */
+
+ else if (! strcmp ("multi", default_metadata_tags[i].mode))
+ {
+ GtkTextView *text_view = GTK_TEXT_VIEW (object);
+ GtkTextBuffer *buffer;
+ GtkTextIter start;
+ GtkTextIter end;
+ gchar *text;
+
+ buffer = gtk_text_view_get_buffer (text_view);
+ gtk_text_buffer_get_start_iter (buffer, &start);
+ gtk_text_buffer_get_end_iter (buffer, &end);
+
+ text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+
+ if (default_metadata_tags[i].xmp_type == GIMP_XMP_TEXT ||
+ default_metadata_tags[i].xmp_type == GIMP_XMP_NONE)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_NONE);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ else if (default_metadata_tags[i].xmp_type == GIMP_XMP_BAG)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_BAG);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+ else if (default_metadata_tags[i].xmp_type == GIMP_XMP_SEQ)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ gexiv2_metadata_set_xmp_tag_struct (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ GEXIV2_STRUCTURE_XA_SEQ);
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ text))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ }
+
+ if (text)
+ g_free (text);
+ }
+ else if (! strcmp ("list", default_metadata_tags[i].mode))
+ {
+ /* MIGHT DO SOMETHING HERE */
+ }
+
+ /* COMBO TAGS */
+
+ else if (! strcmp ("combo", default_metadata_tags[i].mode))
+ {
+ GtkComboBoxText *combo;
+ gint32 value;
+
+ combo = GTK_COMBO_BOX_TEXT (object);
+ value = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+
+ if (! strcmp ("Xmp.xmp.Rating", default_metadata_tags[i].tag))
+ {
+ if (value == 0)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ }
+ else
+ {
+ gchar *save;
+
+ save = g_strdup_printf ("%d", value);
+
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ save);
+ g_free (save);
+ }
+ }
+ else if (! strcmp ("Xmp.DICOM.PatientSex",
+ default_metadata_tags[i].tag))
+ {
+ switch (value)
+ {
+ case 0:
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ break;
+
+ case 1:
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "male"))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ break;
+
+ case 2:
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "female"))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ break;
+
+ case 3:
+ if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "other"))
+ {
+ g_printerr ("failed to set tag [%s]\n",
+ default_metadata_tags[i].tag);
+ }
+ break;
+ }
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSLongitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ switch (value)
+ {
+ case 0:
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ break;
+
+ case 1:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "E");
+ break;
+
+ case 2:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "W");
+ break;
+ }
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSLatitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ switch (value)
+ {
+ case 0:
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ break;
+
+ case 1:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "N");
+ break;
+
+ case 2:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "S");
+ break;
+ }
+ }
+ else if (! strcmp ("Exif.GPSInfo.GPSAltitudeRef",
+ default_metadata_tags[i].tag))
+ {
+ switch (value)
+ {
+ case 0:
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ break;
+
+ case 1:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "0");
+ break;
+
+ case 2:
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ "1");
+ break;
+ }
+ }
+ else if (! strcmp ("Xmp.plus.ModelReleaseStatus",
+ default_metadata_tags[i].tag))
+ {
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ modelreleasestatus[value].data);
+ }
+ else if (! strcmp ("Xmp.plus.PropertyReleaseStatus",
+ default_metadata_tags[i].tag))
+ {
+ if (value == 0)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ }
+ else
+ {
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ propertyreleasestatus[value].data);
+ }
+ }
+ else if (! strcmp ("Xmp.plus.MinorModelAgeDisclosure",
+ default_metadata_tags[i].tag))
+ {
+ if (value == 0)
+ {
+ gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag);
+ }
+ else
+ {
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ minormodelagedisclosure[value].data);
+ }
+ }
+ else if (! strcmp ("Xmp.iptcExt.DigitalSourceType",
+ default_metadata_tags[i].tag))
+ {
+ gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
+ default_metadata_tags[i].tag,
+ digitalsourcetype[value].data);
+ }
+ }
+ }
+
+ gimp_image_set_metadata (image_id, g_metadata);
+}
+
+/* ============================================================================
+ * ==[ METADATA IMPORT / EXPORT FILE DIALOG UI ]===============================
+ * ============================================================================
+ */
+
+static void
+import_dialog_metadata (metadata_editor *args)
+{
+ GtkWidget *file_dialog;
+ gchar *filename;
+
+ file_dialog = gtk_file_chooser_dialog_new (_("Import Metadata File"),
+ NULL,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Import"), GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (file_dialog),
+ args->filename);
+
+ if (gtk_dialog_run (GTK_DIALOG (file_dialog)) == GTK_RESPONSE_ACCEPT)
+ {
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+
+ if (filename)
+ {
+ if (args->filename)
+ {
+ g_free (args->filename);
+ }
+
+ args->filename = g_strdup (filename);
+ import_file_metadata (args);
+ }
+ }
+
+ gtk_widget_destroy (file_dialog);
+}
+
+static void
+export_dialog_metadata (metadata_editor *args)
+{
+ GtkWidget *file_dialog;
+ gchar *filename;
+
+ file_dialog = gtk_file_chooser_dialog_new (_("Export Metadata File"),
+ NULL,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Export"), GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (file_dialog),
+ TRUE);
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (file_dialog),
+ args->filename);
+
+ if (gtk_dialog_run (GTK_DIALOG (file_dialog)) == GTK_RESPONSE_ACCEPT)
+ {
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog));
+
+ if (filename)
+ {
+ if (args->filename)
+ {
+ g_free (args->filename);
+ }
+
+ args->filename = g_strdup (filename);
+ export_file_metadata (args);
+ }
+ }
+
+ gtk_widget_destroy (file_dialog);
+}
+
+static void
+impex_combo_callback (GtkComboBoxText *combo,
+ gpointer data)
+{
+ metadata_editor *args;
+ gint32 selection;
+
+ args = data;
+ selection = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+
+ switch (selection)
+ {
+ case 1: /* Import */
+ import_dialog_metadata (args);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+ break;
+
+ case 2: /* Export */
+ export_dialog_metadata (args);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+ break;
+ }
+}
+
+
+static void
+gpsaltsys_combo_callback (GtkComboBoxText *combo,
+ gpointer data)
+{
+ GtkWidget *entry;
+ GtkBuilder *builder;
+ gint32 selection;
+ gchar alt_str[256];
+ double alt_d;
+
+ builder = data;
+ selection = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+
+ entry = builder_get_widget (builder, "Exif.GPSInfo.GPSAltitude");
+
+ switch (selection)
+ {
+ case 0: /* Meters */
+ if (last_gpsaltsys_sel != 0)
+ {
+ alt_d = atof (gtk_entry_get_text (GTK_ENTRY (entry)));
+ alt_d = (alt_d * (12 * 2.54)) / 100;
+
+ g_snprintf (alt_str, sizeof (alt_str), "%2f", (float)alt_d);
+
+ gtk_entry_set_text (GTK_ENTRY (entry), alt_str);
+ }
+ break;
+
+ case 1: /* Feet */
+ if (last_gpsaltsys_sel != 1)
+ {
+ alt_d = atof (gtk_entry_get_text (GTK_ENTRY (entry)));
+ alt_d = alt_d * 3.28;
+
+ g_snprintf (alt_str, sizeof (alt_str), "%2f", (float)alt_d);
+
+ gtk_entry_set_text (GTK_ENTRY (entry), alt_str);
+ }
+ break;
+ }
+
+ last_gpsaltsys_sel = selection;
+}