[gnumeric] Permit addition of various property types
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Permit addition of various property types
- Date: Fri, 1 Jul 2011 02:30:35 +0000 (UTC)
commit 138a3426f8d4dfe90ebda520b28529e51d68c368
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date: Thu Jun 30 20:29:02 2011 -0600
Permit addition of various property types
2011-06-30 Andreas J. Guelzow <aguelzow pyrshep ca>
* doc-meta-data.ui: add GtkTreeModelFilter
* dialog-doc-metadata.c (dialog_doc_metadata_set_gsf_prop): add
argument change all callers
(dialog_doc_metadata_set_prop): ditto
(dialog_doc_metadata_set_gsf_prop): use selected type
(cb_dialog_doc_metadata_add_clicked): use selected type
(cb_dialog_doc_metadata_ppt_changed): check combobox
(cb_dialog_doc_metadata_ppt_type_changed): new
(dialog_doc_metadata_init_properties_page): setup combo box
(dialog_doc_metadata_init_widgets): handle new store
src/dialogs/ChangeLog | 17 +++++-
src/dialogs/dialog-doc-metadata.c | 112 +++++++++++++++++++++++++++++--------
src/dialogs/doc-meta-data.ui | 21 ++-----
3 files changed, 109 insertions(+), 41 deletions(-)
---
diff --git a/src/dialogs/ChangeLog b/src/dialogs/ChangeLog
index 96e3770..b3b2213 100644
--- a/src/dialogs/ChangeLog
+++ b/src/dialogs/ChangeLog
@@ -1,4 +1,17 @@
-2011-06-29 Andreas J. Guelzow <aguelzow pyrshep ca>
+2011-06-30 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ * doc-meta-data.ui: add GtkTreeModelFilter
+ * dialog-doc-metadata.c (dialog_doc_metadata_set_gsf_prop): add
+ argument change all callers
+ (dialog_doc_metadata_set_prop): ditto
+ (dialog_doc_metadata_set_gsf_prop): use selected type
+ (cb_dialog_doc_metadata_add_clicked): use selected type
+ (cb_dialog_doc_metadata_ppt_changed): check combobox
+ (cb_dialog_doc_metadata_ppt_type_changed): new
+ (dialog_doc_metadata_init_properties_page): setup combo box
+ (dialog_doc_metadata_init_widgets): handle new store
+
+2011-06-30 Andreas J. Guelzow <aguelzow pyrshep ca>
* dialog-doc-metadata.c (dialog_doc_metadata_get_prop_val): add
argument and change all callers
@@ -14,7 +27,7 @@
(cb_dialog_doc_metadata_add_clicked): implement
(cb_dialog_doc_metadata_ppt_changed): new
(dialog_doc_metadata_init_properties_page): connect callbacks
- (dialog_doc_metadata_init_widgets): handle new widgets
+ (dialog_doc_metadata_init_widgets): handle new widget
2011-06-29 Andreas J. Guelzow <aguelzow pyrshep ca>
diff --git a/src/dialogs/dialog-doc-metadata.c b/src/dialogs/dialog-doc-metadata.c
index fc64011..4a1ce45 100644
--- a/src/dialogs/dialog-doc-metadata.c
+++ b/src/dialogs/dialog-doc-metadata.c
@@ -3,6 +3,7 @@
* dialog-doc-metadata.c: Edit document metadata
*
* Copyright (C) 2005 Jody Goldberg (jody gnome org)
+ * Copyright (C) 2011 Andreas J. Guelzow (aguelzow pyrshep ca)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -118,6 +119,7 @@ typedef struct {
GtkEntry *ppt_value;
GtkComboBox *ppt_type;
GtkListStore *type_store;
+ GtkTreeModelFilter *type_store_filter;
GtkButton *add_button;
GtkButton *remove_button;
@@ -149,6 +151,11 @@ typedef struct {
static gchar *dialog_doc_metadata_get_prop_val (DialogDocMetaData *state, char const *prop_name,
GValue *prop_value);
+static gboolean cb_dialog_doc_metadata_ppt_changed (G_GNUC_UNUSED GtkEntry *entry,
+ G_GNUC_UNUSED GdkEventFocus *event,
+ DialogDocMetaData *state);
+
+
static GType
dialog_doc_metadata_get_value_type_from_name (gchar const *name)
{
@@ -685,7 +692,8 @@ static GType
dialog_doc_metadata_set_gsf_prop (DialogDocMetaData *state,
const gchar *name,
const gchar *value,
- const gchar *link)
+ const gchar *link,
+ GType type)
{
GsfDocProp *existing_prop = NULL;
GsfDocProp *doc_prop;
@@ -729,7 +737,7 @@ dialog_doc_metadata_set_gsf_prop (DialogDocMetaData *state,
if (existing_value == NULL)
value_changed = (value != NULL);
- else if (G_VALUE_HOLDS_STRING (existing_value)) {
+ else if (G_VALUE_HOLDS_STRING (existing_value) && (type == 0 || type == G_TYPE_STRING)) {
char const * existing_val_str = g_value_get_string (existing_value);
if (existing_val_str != NULL && *existing_val_str == 0)
existing_val_str = NULL;
@@ -748,7 +756,10 @@ dialog_doc_metadata_set_gsf_prop (DialogDocMetaData *state,
/* Create a new GsfDocProp */
doc_prop = gsf_doc_prop_new (g_strdup (name));
- val_type = dialog_doc_metadata_get_gsf_prop_val_type (state, name);
+ if (type == 0)
+ val_type = dialog_doc_metadata_get_gsf_prop_val_type (state, name);
+ else
+ val_type = type;
if (val_type != G_TYPE_INVALID) {
GValue *doc_prop_value;
@@ -785,7 +796,8 @@ static void
dialog_doc_metadata_set_prop (DialogDocMetaData *state,
const gchar *prop_name,
const gchar *prop_value,
- const gchar *link_value)
+ const gchar *link_value,
+ GType type)
{
GtkTreeIter tree_iter;
GValue *value;
@@ -797,7 +809,8 @@ dialog_doc_metadata_set_prop (DialogDocMetaData *state,
g_return_if_fail (state->metadata != NULL);
- val_type = dialog_doc_metadata_set_gsf_prop (state, prop_name, prop_value, link_value);
+ val_type = dialog_doc_metadata_set_gsf_prop (state, prop_name, prop_value,
+ link_value, type);
/* Due to changes in type, prop_value may have changed */
updated_prop = gsf_doc_meta_data_lookup (state->metadata, prop_name);
@@ -805,9 +818,9 @@ dialog_doc_metadata_set_prop (DialogDocMetaData *state,
GValue *new_value = (GValue *) gsf_doc_prop_get_val (updated_prop);
if (new_value != NULL)
new_prop_value = dialog_doc_metadata_get_prop_val (state, prop_name, new_value);
+ if (new_prop_value == NULL)
+ new_prop_value = g_strdup ("");
}
- if (new_prop_value == NULL)
- new_prop_value = g_strdup ("");
found = FALSE;
@@ -854,7 +867,7 @@ dialog_doc_metadata_set_prop (DialogDocMetaData *state,
}
if (val_type != G_TYPE_INVALID && found == FALSE)
- dialog_doc_metadata_add_prop (state, prop_name, prop_value, "", val_type);
+ dialog_doc_metadata_add_prop (state, prop_name, new_prop_value, "", val_type);
/* Free all data */
g_free (value);
@@ -872,7 +885,7 @@ cb_dialog_doc_metadata_title_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_TITLE,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -884,7 +897,7 @@ cb_dialog_doc_metadata_subject_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_SUBJECT,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -896,7 +909,7 @@ cb_dialog_doc_metadata_author_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_INITIAL_CREATOR,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -908,7 +921,7 @@ cb_dialog_doc_metadata_manager_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_MANAGER,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -920,7 +933,7 @@ cb_dialog_doc_metadata_company_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_COMPANY,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -932,7 +945,7 @@ cb_dialog_doc_metadata_category_changed (GtkEntry *entry,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_CATEGORY,
gtk_entry_get_text (entry),
- NULL);
+ NULL, G_TYPE_STRING );
return FALSE;
}
@@ -954,7 +967,7 @@ cb_dialog_doc_metadata_comments_changed (GtkTextView *view,
dialog_doc_metadata_set_prop (state,
GSF_META_NAME_DESCRIPTION,
text,
- NULL);
+ NULL, G_TYPE_STRING);
return FALSE;
}
@@ -1041,7 +1054,8 @@ dialog_doc_metadata_update_keywords_changed (DialogDocMetaData *state)
dialog_doc_metadata_set_prop
(state, GSF_META_NAME_KEYWORDS,
- dialog_doc_metadata_get_prop_val (state, GSF_META_NAME_KEYWORDS, &val), NULL);
+ dialog_doc_metadata_get_prop_val (state, GSF_META_NAME_KEYWORDS, &val),
+ NULL, GSF_DOCPROP_VECTOR_TYPE);
g_value_unset (&val);
}
@@ -1187,7 +1201,7 @@ cb_dialog_doc_metadata_value_edited (GtkCellRendererText *renderer,
0, &prop_name,
2, &link_value,
-1);
- dialog_doc_metadata_set_prop (state, prop_name, new_text, link_value);
+ dialog_doc_metadata_set_prop (state, prop_name, new_text, link_value, 0);
g_free (prop_name);
g_free (link_value);
}
@@ -1210,11 +1224,21 @@ cb_dialog_doc_metadata_add_clicked (GtkWidget *w,
const gchar *value = gtk_entry_get_text (state->ppt_value);
gchar *name_trimmed = pango_trim_string (name);
GType t;
-
- t = dialog_doc_metadata_get_value_type_from_name (name_trimmed);
- dialog_doc_metadata_add_prop (state, name_trimmed, value, NULL, t);
+ GtkTreeIter filter_iter;
+
+ if (gtk_combo_box_get_active_iter (state->ppt_type, &filter_iter)) {
+ GtkTreeIter child_iter;
+ gtk_tree_model_filter_convert_iter_to_child_iter
+ (state->type_store_filter, &child_iter, &filter_iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (state->type_store), &child_iter,
+ 1, &t, -1);
+ } else
+ t = dialog_doc_metadata_get_value_type_from_name (name_trimmed);
+ dialog_doc_metadata_set_prop (state, name_trimmed, value, NULL, t);
g_free (name_trimmed);
+
+ cb_dialog_doc_metadata_ppt_changed (NULL, NULL, state);
}
/**
@@ -1480,8 +1504,8 @@ dialog_doc_metadata_populate_tree_view (gchar *name,
}
static gboolean
-cb_dialog_doc_metadata_ppt_changed (GtkEntry *entry,
- GdkEventFocus *event,
+cb_dialog_doc_metadata_ppt_changed (G_GNUC_UNUSED GtkEntry *entry,
+ G_GNUC_UNUSED GdkEventFocus *event,
DialogDocMetaData *state)
{
const gchar *name = gtk_entry_get_text (state->ppt_name);
@@ -1491,9 +1515,13 @@ cb_dialog_doc_metadata_ppt_changed (GtkEntry *entry,
|| strlen (value) == 0);
gchar *str = NULL;
GsfDocProp *prop = NULL;
+ GtkTreeIter iter;
prop = gsf_doc_meta_data_lookup (state->metadata, name_trimmed);
+ if (enable)
+ enable = gtk_combo_box_get_active_iter (state->ppt_type, &iter);
+
if (enable) {
if (prop != NULL) {
str = g_strdup_printf
@@ -1523,6 +1551,12 @@ cb_dialog_doc_metadata_ppt_changed (GtkEntry *entry,
return FALSE;
}
+static void
+cb_dialog_doc_metadata_ppt_type_changed (G_GNUC_UNUSED GtkComboBox *widget,
+ DialogDocMetaData *state)
+{
+ cb_dialog_doc_metadata_ppt_changed (NULL, NULL, state);
+}
/**
* dialog_doc_metadata_init_properties_page
@@ -1537,6 +1571,17 @@ dialog_doc_metadata_init_properties_page (DialogDocMetaData *state)
{
GtkTreeSelection *sel;
GtkCellRenderer *cell;
+ guint i;
+
+ struct types {
+ char const *type_name;
+ GType type;
+ } ppt_types[] = {
+ {N_("String"), G_TYPE_STRING},
+ {N_("Integer"), G_TYPE_INT},
+ /* {N_("Decimal Number"), G_TYPE_FLOAT}, */
+ {N_("TRUE/FALSE"), G_TYPE_BOOLEAN}
+ };
g_return_if_fail (state->metadata != NULL);
g_return_if_fail (state->properties != NULL);
@@ -1544,13 +1589,26 @@ dialog_doc_metadata_init_properties_page (DialogDocMetaData *state)
/* Set Remove and Apply buttons insensitive */
gtk_widget_set_sensitive (GTK_WIDGET (state->add_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET (state->remove_button), FALSE);
- gtk_widget_set_sensitive (GTK_WIDGET (state->ppt_type), FALSE);
/* Intialize Combo Box */
/* gtk_combo_box_set_id_column (state->ppt_type, 0); */
cell = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(state->ppt_type), cell, TRUE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(state->ppt_type), cell, "text", 0, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (ppt_types); i++)
+ gtk_list_store_insert_with_values (state->type_store, NULL, G_MAXINT,
+ 0, _(ppt_types[i].type_name),
+ 1, ppt_types[i].type,
+ 2, TRUE,
+ -1);
+ gtk_list_store_insert_with_values (state->type_store, NULL, G_MAXINT,
+ 0, _("Date & Time"),
+ 1, GSF_TIMESTAMP_TYPE,
+ 2, TRUE,
+ -1);
+ gtk_tree_model_filter_set_visible_column (state->type_store_filter, 2);
+ gtk_tree_model_filter_refilter (state->type_store_filter);
/* Populate Treeview */
state->properties_store = gtk_tree_store_new (5,
@@ -1613,6 +1671,11 @@ dialog_doc_metadata_init_properties_page (DialogDocMetaData *state)
"focus-out-event",
G_CALLBACK (cb_dialog_doc_metadata_ppt_changed),
state);
+ /* ComboBox */
+ g_signal_connect (G_OBJECT (state->ppt_type),
+ "changed",
+ G_CALLBACK (cb_dialog_doc_metadata_ppt_type_changed),
+ state);
/* 'Add', 'Remove' and 'Apply' Button Signals */
g_signal_connect (G_OBJECT (state->add_button),
@@ -1826,7 +1889,8 @@ dialog_doc_metadata_init_widgets (DialogDocMetaData *state)
state->ppt_name = GTK_ENTRY (go_gtk_builder_get_widget (state->gui, "property-name"));
state->ppt_value = GTK_ENTRY (go_gtk_builder_get_widget (state->gui, "property-value"));
state->ppt_type = GTK_COMBO_BOX (go_gtk_builder_get_widget (state->gui, "type-combo"));
- state->type_store = GTK_LIST_STORE (gtk_combo_box_get_model (state->ppt_type));
+ state->type_store = GTK_LIST_STORE (gtk_builder_get_object (state->gui, "typestore"));
+ state->type_store_filter = GTK_TREE_MODEL_FILTER (gtk_combo_box_get_model (state->ppt_type));
state->add_button = GTK_BUTTON (go_gtk_builder_get_widget (state->gui, "add_button"));
state->remove_button = GTK_BUTTON (go_gtk_builder_get_widget (state->gui, "remove_button"));
diff --git a/src/dialogs/doc-meta-data.ui b/src/dialogs/doc-meta-data.ui
index ef66cf7..acd6479 100644
--- a/src/dialogs/doc-meta-data.ui
+++ b/src/dialogs/doc-meta-data.ui
@@ -1255,7 +1255,7 @@
<object class="GtkComboBox" id="type-combo">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="model">typestore</property>
+ <property name="model">typestorefilter</property>
<property name="active">0</property>
</object>
<packing>
@@ -1794,20 +1794,11 @@
<column type="gchararray"/>
<!-- column-name typeid -->
<column type="gint"/>
+ <!-- column-name visibility -->
+ <column type="gboolean"/>
</columns>
- <data>
- <row>
- <col id="0" translatable="yes">String</col>
- <col id="1">1</col>
- </row>
- <row>
- <col id="0" translatable="yes">Complex Type</col>
- <col id="1">0</col>
- </row>
- <row>
- <col id="0" translatable="yes">Date </col>
- <col id="1">2</col>
- </row>
- </data>
+ </object>
+ <object class="GtkTreeModelFilter" id="typestorefilter">
+ <property name="child_model">typestore</property>
</object>
</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]