diff options
Diffstat (limited to 'plug-ins/metadata/metadata-editor.c')
-rw-r--r-- | plug-ins/metadata/metadata-editor.c | 5779 |
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; +} |