gimp/plug-ins/metadata/metadata-editor.c

5857 lines
220 KiB
C

/* 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"
typedef struct _Metadata Metadata;
typedef struct _MetadataClass MetadataClass;
struct _Metadata
{
GimpPlugIn parent_instance;
};
struct _MetadataClass
{
GimpPlugInClass parent_class;
};
#define METADATA_TYPE (metadata_get_type ())
#define METADATA (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METADATA_TYPE, Metadata))
GType metadata_get_type (void) G_GNUC_CONST;
static GList * metadata_query_procedures (GimpPlugIn *plug_in);
static GimpProcedure * metadata_create_procedure (GimpPlugIn *plug_in,
const gchar *name);
static GimpValueArray * metadata_run (GimpProcedure *procedure,
const GimpValueArray *args,
gpointer run_data);
static gboolean metadata_editor_dialog (GimpImage *image,
GimpMetadata *metadata,
GError **error);
static void metadata_dialog_editor_set_metadata (GExiv2Metadata *metadata,
GtkBuilder *builder);
void metadata_editor_write_callback (GtkWidget *dialog,
GtkBuilder *builder,
GimpImage *image);
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);
static gchar * clean_xmp_string (const gchar *value);
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);
G_DEFINE_TYPE (Metadata, metadata, GIMP_TYPE_PLUG_IN)
GIMP_MAIN (METADATA_TYPE)
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;
#define ME_LOG_DOMAIN "metadata-editor"
static void
metadata_class_init (MetadataClass *klass)
{
GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS (klass);
plug_in_class->query_procedures = metadata_query_procedures;
plug_in_class->create_procedure = metadata_create_procedure;
}
static void
metadata_init (Metadata *metadata)
{
}
static GList *
metadata_query_procedures (GimpPlugIn *plug_in)
{
return g_list_append (NULL, g_strdup (PLUG_IN_PROC));
}
static GimpProcedure *
metadata_create_procedure (GimpPlugIn *plug_in,
const gchar *name)
{
GimpProcedure *procedure = NULL;
if (! strcmp (name, PLUG_IN_PROC))
{
procedure = gimp_procedure_new (plug_in, name,
GIMP_PDB_PROC_TYPE_PLUGIN,
metadata_run, NULL, NULL);
gimp_procedure_set_image_types (procedure, "*");
gimp_procedure_set_menu_label (procedure, N_("_Edit Metadata"));
gimp_procedure_add_menu_path (procedure, "<Image>/Image/Metadata");
gimp_procedure_set_documentation (procedure,
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.",
name);
gimp_procedure_set_attribution (procedure,
"Ben Touchette",
"Ben Touchette",
"2017");
GIMP_PROC_ARG_ENUM (procedure, "run-mode",
"Run mode",
"The run mode",
GIMP_TYPE_RUN_MODE,
GIMP_RUN_INTERACTIVE,
G_PARAM_READWRITE);
GIMP_PROC_ARG_IMAGE (procedure, "image",
"Image",
"The input image",
FALSE,
G_PARAM_READWRITE);
}
return procedure;
}
static GimpValueArray *
metadata_run (GimpProcedure *procedure,
const GimpValueArray *args,
gpointer run_data)
{
GimpImage *image;
GimpMetadata *metadata;
GError *error = NULL;
INIT_I18N ();
gimp_ui_init (PLUG_IN_BINARY);
image = GIMP_VALUES_GET_IMAGE (args, 1);
metadata = gimp_image_get_metadata (image);
/* 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, metadata);
}
if (metadata_editor_dialog (image, metadata, &error))
return gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS, NULL);
else
return gimp_procedure_new_return_values (procedure, GIMP_PDB_EXECUTION_ERROR, error);
}
/* ============================================================================
* ==[ 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 (GimpImage *image,
GimpMetadata *g_metadata,
GError **error)
{
GtkBuilder *builder;
GtkWidget *dialog;
GtkWidget *metadata_vbox;
GtkWidget *impex_combo;
GtkWidget *content_area;
GExiv2Metadata *metadata;
gchar *ui_file;
gchar *title;
gchar *name;
GError *local_error = NULL;
gboolean run;
metadata = GEXIV2_METADATA (g_metadata);
builder = gtk_builder_new ();
meta_args.image = image;
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, &local_error))
{
if (! local_error)
local_error = g_error_new_literal (G_FILE_ERROR, 0,
_("Error loading metadata-editor dialog."));
g_propagate_error (error, local_error);
g_free (ui_file);
g_object_unref (builder);
return FALSE;
}
g_free (ui_file);
name = gimp_image_get_name (image);
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_CANCEL,
_("_Write Metadata"), GTK_RESPONSE_OK,
NULL);
meta_args.dialog = dialog;
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
gimp_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-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_OK);
if (run)
{
metadata_editor_write_callback (dialog, builder, image);
}
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 gchar *
clean_xmp_string (const gchar *value)
{
gchar *value_clean;
gchar *value_utf8;
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 (! g_utf8_validate (value_clean, -1, NULL))
{
value_utf8 = g_locale_to_utf8 (value_clean, -1, NULL, NULL, NULL);
}
else
{
value_utf8 = g_strdup (value_clean);
}
g_free (value_clean);
return value_utf8;
}
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_log ("", G_LOG_LEVEL_MESSAGE,
_("Error loading calendar. %s"),
error ? 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_CANCEL,
_("Set Date"), GTK_RESPONSE_OK,
NULL);
gtk_dialog_set_default_response (GTK_DIALOG (calendar_dialog),
GTK_RESPONSE_OK);
gimp_dialog_set_alternative_button_order (GTK_DIALOG (calendar_dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-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_OK)
{
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");
}
const gchar *gpstooltips[] =
{
N_ ("Enter or edit GPS value here.\n"
"Valid values consist of 1, 2 or 3 numbers "
"(degrees, minutes, seconds), see the following examples:\n"
"10deg 15' 20\", or 10\u00b0 15' 20\", or 10:15:20.45, or "
"10 15 20, or 10 15.30, or 10.45\n"
"Delete all text to remove the current value."),
N_ ("Enter or edit GPS altitude value here.\n"
"A valid value consists of one number:\n"
"e.g. 100, or 12.24\n"
"Depending on the selected measurement type "
"the value should be entered in meter (m) "
"or feet (ft)\n"
"Delete all text to remove the current value.")
};
enum
{
GPS_LONG_LAT_TOOLTIP,
GPS_ALTITUDE_TOOLTIP,
};
/* 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_utf;
value_utf = clean_xmp_string (value);
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_utf;
value_utf = clean_xmp_string (value);
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_utf;
value_utf = clean_xmp_string (value);
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;
gint index;
widget = builder_get_widget (builder, default_metadata_tags[i].tag);
if (! strcmp ("Exif.GPSInfo.GPSLongitude",
default_metadata_tags[i].tag))
{
gdouble gps_value;
gchar *str;
if (gexiv2_metadata_get_gps_longitude (metadata, &gps_value))
{
str = metadata_format_gps_longitude_latitude (gps_value);
gtk_entry_set_text (GTK_ENTRY (widget), str);
g_free (str);
}
gtk_widget_set_tooltip_text (widget,
gettext (gpstooltips[GPS_LONG_LAT_TOOLTIP]));
continue;
}
else if (! strcmp ("Exif.GPSInfo.GPSLatitude",
default_metadata_tags[i].tag))
{
gdouble gps_value;
gchar *str;
if (gexiv2_metadata_get_gps_latitude (metadata, &gps_value))
{
str = metadata_format_gps_longitude_latitude (gps_value);
gtk_entry_set_text (GTK_ENTRY (widget), str);
g_free (str);
}
gtk_widget_set_tooltip_text (widget,
gettext (gpstooltips[GPS_LONG_LAT_TOOLTIP]));
continue;
}
else if (! strcmp ("Exif.GPSInfo.GPSAltitude",
default_metadata_tags[i].tag))
{
gdouble gps_value;
gchar *str;
if (gexiv2_metadata_get_gps_altitude (metadata, &gps_value))
{
str = metadata_format_gps_altitude (gps_value, TRUE, "");
gtk_entry_set_text (GTK_ENTRY (widget), str);
g_free (str);
}
gtk_widget_set_tooltip_text (widget,
gettext (gpstooltips[GPS_ALTITUDE_TOOLTIP]));
continue;
}
value = gexiv2_metadata_get_tag_interpreted_string (metadata,
default_metadata_tags[i].tag);
if (value)
{
gchar *value_utf8 = clean_xmp_string (value);
g_free (value);
if (value_utf8 && value_utf8[0] != '\0')
{
value = g_strdup (value_utf8);
}
else
{
value = NULL;
}
g_free (value_utf8);
}
index = default_metadata_tags[i].other_tag_index;
if (index > -1)
{
gchar **values;
/* These are all IPTC tags some of which can appear multiple times so
* we will use get_tag_multiple. Also IPTC most commonly uses UTF-8
* not current locale so get_tag_interpreted was wrong anyway.
* FIXME For now lets interpret as UTF-8 and in the future read
* and interpret based on the CharacterSet tag.
*/
values = gexiv2_metadata_get_tag_multiple (metadata,
equivalent_metadata_tags[index].tag);
if (values)
{
gint i;
GString *str = NULL;
for (i = 0; values[i] != NULL; i++)
{
if (values[i][0] != '\0')
{
if (! str)
{
str = g_string_new (values[i]);
}
else
{
if (! strcmp ("multi", equivalent_metadata_tags[index].mode))
{
g_string_append (str, "\n");
}
else
{
g_string_append (str, ", ");
}
g_string_append (str, values[i]);
}
}
}
if (str)
{
/* If we got values from both Xmp and Iptc then compare those
* values and if they are different concatenate them. Usually they
* should be the same in which case we won't duplicate the string.
*/
if (value && strcmp (value, str->str))
{
if (! strcmp ("multi", equivalent_metadata_tags[index].mode))
{
g_string_prepend (str, "\n");
}
else
{
g_string_prepend (str, ", ");
}
g_string_prepend (str, value);
g_free (value);
}
value = g_string_free (str, FALSE);
}
}
}
if (value)
{
if (! strcmp ("single", default_metadata_tags[i].mode))
{
gtk_entry_set_text (GTK_ENTRY (widget), value);
}
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, -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 (tagdata[item][3] &&
! strcmp (tagdata[item][3],
phone_types[types].data))
{
strcpy (type1,
gettext (phone_types[types].display));
}
if (tagdata[item][5] &&
! 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_failed (const gchar *tag)
{
g_log ("", G_LOG_LEVEL_MESSAGE,
_("Failed to set metadata tag %s"), tag);
}
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))
{
set_tag_failed (name);
}
}
static void
set_gps_longitude_latitude (GimpMetadata *metadata,
const gchar *tag,
const gchar *value)
{
/* \u00b0 - degree symbol */
const gchar delimiters_dms[] = " deg'\":\u00b0";
gchar lng_lat[256];
gchar *s = g_strdup (value);
gchar *str1 = NULL;
gchar *str2 = NULL;
gchar *str3 = NULL;
gdouble val = 0.f;
gint degrees, minutes;
gdouble seconds;
gboolean remove_val = FALSE;
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "set_gps_longitude_latitude - Tag %s, Input value: %s", tag, value);
if (s && s[0] != '\0')
{
str1 = strtok (s, delimiters_dms);
str2 = strtok (NULL, delimiters_dms);
str3 = strtok (NULL, delimiters_dms);
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "String split into: %s - %s - %s", str1, str2, str3);
}
g_free (s);
if (str1 && str2 && str3)
{
/* Assuming degrees, minutes, seconds */
degrees = g_ascii_strtoll (str1, NULL, 10);
minutes = g_ascii_strtoll (str2, NULL, 10);
seconds = g_ascii_strtod (str3, NULL);
}
else if (str1 && str2)
{
/* Assuming degrees, minutes */
gdouble min;
degrees = g_ascii_strtoll (str1, NULL, 10);
min = g_ascii_strtod (str2, NULL);
minutes = (gint) min;
seconds = (min - (gdouble) minutes) * 60.f;
}
else if (str1)
{
/* Assuming degrees only */
val = g_ascii_strtod (str1, NULL);
degrees = (gint) val;
minutes = (gint) ((val - (gdouble) degrees) * 60.f);
seconds = ((val - (gdouble) degrees - (gdouble) (minutes / 60.f)) * 60.f * 60.f);
}
else
remove_val = TRUE;
if (!remove_val)
{
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Converted values: %d - %d - %f", degrees, minutes, seconds);
g_snprintf (lng_lat, sizeof (lng_lat),
"%d/1 %d/1 %d/1000",
abs (degrees), abs (minutes), abs ((gint) (seconds * 1000.f)));
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Tag: %s, output string: %s", tag, lng_lat);
if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (metadata),
tag, lng_lat))
{
set_tag_failed (tag);
}
}
else
{
gexiv2_metadata_clear_tag (GEXIV2_METADATA (metadata), tag);
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_INFO, "Removed tag %s (no value).", tag);
}
}
void
metadata_editor_write_callback (GtkWidget *dialog,
GtkBuilder *builder,
GimpImage *image)
{
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);
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_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%d %s %s", types, tag_data,
gettext (phone_types[types].display));
if (! strcmp (tag_data, gettext (phone_types[types].display)))
{
g_log (ME_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%d %s", 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\""))
{
set_tag_failed (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)))
{
set_tag_failed (creatorContactInfoTags[i].tag);
}
}
else if (! strcmp ("multi", creatorContactInfoTags[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))
{
set_tag_failed (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) ||
! strcmp ("Exif.GPSInfo.GPSLatitude",
default_metadata_tags[i].tag))
{
set_gps_longitude_latitude (g_metadata,
default_metadata_tags[i].tag,
value_entry);
}
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);
else
alt_d *= 100.f;
g_snprintf (alt_str, sizeof (alt_str), "%d/100", (gint) alt_d);
if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag,
alt_str))
{
set_tag_failed (default_metadata_tags[i].tag);
}
}
else
{
gint index;
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))
{
set_tag_failed (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))
{
set_tag_failed (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))
{
set_tag_failed (default_metadata_tags[i].tag);
}
}
index = default_metadata_tags[i].other_tag_index;
if (index > -1)
{
gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
equivalent_metadata_tags[index].tag);
if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
equivalent_metadata_tags[index].tag,
text_value))
{
set_tag_failed (equivalent_metadata_tags[index].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;
gint index;
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))
{
set_tag_failed (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))
{
set_tag_failed (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))
{
set_tag_failed (default_metadata_tags[i].tag);
}
}
index = default_metadata_tags[i].other_tag_index;
if (index > -1)
{
gchar **multi;
gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
equivalent_metadata_tags[index].tag);
multi = g_strsplit (text, "\n", 0);
if (! gexiv2_metadata_set_tag_multiple (GEXIV2_METADATA (g_metadata),
equivalent_metadata_tags[index].tag,
(const gchar **) multi))
{
set_tag_failed (equivalent_metadata_tags[index].tag);
}
g_strfreev (multi);
}
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.photoshop.Urgency", default_metadata_tags[i].tag))
{
/* IPTC tab - Urgency */
if (value == 0)
{
gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag);
gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
"Iptc.Application2.Urgency");
}
else
{
gchar *save;
save = g_strdup_printf ("%d", value);
gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag,
save);
gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
"Iptc.Application2.Urgency",
save);
g_free (save);
}
}
else if (! strcmp ("Xmp.xmpRights.Marked",
default_metadata_tags[i].tag))
{
/* Description tab - Copyright Status */
if (value == 0)
{
gexiv2_metadata_clear_tag (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag);
}
else
{
gchar *save_value;
if (value == 1)
save_value = g_strdup_printf ("%s", "True");
else /* (value == 2) */
save_value = g_strdup_printf ("%s", "False");
gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag,
save_value);
g_free (save_value);
}
}
else 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"))
{
set_tag_failed (default_metadata_tags[i].tag);
}
break;
case 2:
if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag,
"female"))
{
set_tag_failed (default_metadata_tags[i].tag);
}
break;
case 3:
if (! gexiv2_metadata_set_tag_string (GEXIV2_METADATA (g_metadata),
default_metadata_tags[i].tag,
"other"))
{
set_tag_failed (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, 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;
}