6 #include "stuffkeeper-data-item.h"
10 #include "stuffkeeper-data-backend.h"
15 PRIVATE_FIELD_DEFAULT = 0
20 class Stuffkeeper:Data:Entry from Gtk:Entry
22 private StuffkeeperDataItem *item = {NULL};
23 private gchar *field = {NULL} destroywith g_free;
24 private gulong changed_item_entry = {0};
25 private gulong changed_entry = {0};
27 private guint changed_entry_timeout = {0};
28 private GdkColor writing ;
29 private GdkColor base;
30 private GdkColor text;
33 private gulong signal_backend_locked = {0};
41 const gchar *text = gtk_entry_get_text(GTK_ENTRY(self));
42 self->_priv->changed_entry_timeout = 0;
44 gtk_widget_modify_text(GTK_WIDGET(self), GTK_STATE_NORMAL, &(self->_priv->text));
45 gtk_widget_modify_base(GTK_WIDGET(self), GTK_STATE_NORMAL, &(self->_priv->base));
47 if(self->_priv->field)
49 stuffkeeper_data_item_set_string(self->_priv->item, self->_priv->field, text);
51 stuffkeeper_data_item_set_title(self->_priv->item, text);
62 changed(self, gpointer data)
64 printf("entry changed\n");
65 if(self->_priv->changed_entry_timeout)
67 g_source_remove(self->_priv->changed_entry_timeout);
69 self->_priv->changed_entry_timeout = g_timeout_add(1000,(GSourceFunc)self_save_changes,self);
71 gtk_widget_modify_text(GTK_WIDGET(self), GTK_STATE_NORMAL, &(GTK_WIDGET(self)->style->black));
72 gtk_widget_modify_base(GTK_WIDGET(self), GTK_STATE_NORMAL, &(self->_priv->writing));
77 item_changed(self,const gchar *field, StuffkeeperDataItem *item)
79 const gchar *text = gtk_entry_get_text(GTK_ENTRY(self));
81 if(self->_priv->field)
83 if(field && strcmp(field, self->_priv->field) == 0)
85 value = stuffkeeper_data_item_get_string(item, self->_priv->field);
88 value = stuffkeeper_data_item_get_title(item);
89 if(stuffkeeper_data_item_has_generated_title(item))
90 gtk_editable_set_editable(GTK_EDITABLE(self), FALSE);
92 gtk_editable_set_editable(GTK_EDITABLE(self), TRUE);
96 if(strcmp(text,value))
99 g_signal_handler_block(self,self->_priv->changed_entry);
100 gtk_entry_set_text(GTK_ENTRY(self), value);
101 g_signal_handler_unblock(self,self->_priv->changed_entry);
108 style_set(self, GtkStyle *prev, GtkWidget *wid)
110 if(self->_priv->changed_entry_timeout == 0) {
111 if(self->_priv->field == NULL &&
112 !stuffkeeper_data_item_has_generated_title(self->_priv->item)
114 /* Special case: Item is an editable title - use default system colors */
115 self->_priv->base = (GTK_WIDGET(self)->style->base[GTK_STATE_NORMAL]);
116 self->_priv->text = (GTK_WIDGET(self)->style->text[GTK_STATE_NORMAL]);
119 /* Normal case: match colors with parent (hereby making enrty "transparent") */
120 GtkWidget *parent_bin = NULL;
122 g_debug("Matching colors for StuffkeeperDataEntry with parent\n");
123 parent_bin = wid->parent;
124 while(parent_bin && !GTK_IS_BIN(parent_bin)) {
125 parent_bin = GTK_WIDGET(parent_bin)->parent;
128 g_signal_handlers_block_by_func(G_OBJECT(self), self_style_set, wid);
129 self->_priv->base = (GTK_WIDGET(parent_bin)->style->bg[GTK_STATE_NORMAL]);
130 self->_priv->text = (GTK_WIDGET(parent_bin)->style->text[GTK_STATE_NORMAL]);
131 gtk_widget_modify_base(GTK_WIDGET(wid), GTK_STATE_NORMAL, &(self->_priv->base));
132 gtk_widget_modify_text(GTK_WIDGET(wid), GTK_STATE_NORMAL, &(self->_priv->text));
133 g_signal_handlers_unblock_by_func(G_OBJECT(self),self_style_set , wid);
136 g_debug("No GtkBin parent found for StuffkeeperDataEntr\n");
143 backend_locked(self, GParamSpec *arg1, StuffkeeperDataBackend *backend)
145 gboolean locked = stuffkeeper_data_backend_get_locked(backend);
146 if(self->_priv->field == NULL) /* if it is an title */
148 if(stuffkeeper_data_item_has_generated_title(self->_priv->item))
150 gtk_editable_set_editable(GTK_EDITABLE(self), FALSE);
154 gtk_editable_set_editable(GTK_EDITABLE(self), !locked);
158 new(StuffkeeperDataItem *item, const gchar *field)
163 if(!g_key_file_get_boolean(config_file, "interface", "has-border",NULL))
164 gtk_entry_set_has_frame(GTK_ENTRY(obj), FALSE);
166 obj->_priv->base = (GTK_WIDGET(obj)->style->base[GTK_STATE_NORMAL]);
167 obj->_priv->text = (GTK_WIDGET(obj)->style->text[GTK_STATE_NORMAL]);
168 obj->_priv->writing.red = 255*255;
169 obj->_priv->writing.green = 253*255;
170 obj->_priv->writing.blue = 197*255;
171 gdk_colormap_alloc_color(gtk_widget_get_default_colormap(), &(obj->_priv->writing), TRUE,TRUE);
172 g_signal_connect_swapped(G_OBJECT(obj), "style-set", G_CALLBACK(self_style_set),obj);
175 obj->_priv->item = item;
177 obj->_priv->field = g_strdup(field);
179 obj->_priv->changed_item_entry = g_signal_connect_swapped(G_OBJECT(item), "item-changed", G_CALLBACK(self_item_changed), obj);
181 /* update the entry */
182 if(obj->_priv->field)
184 value = stuffkeeper_data_item_get_string(item, obj->_priv->field);
186 value = stuffkeeper_data_item_get_title(item);
187 if(stuffkeeper_data_item_has_generated_title(item)) {
188 gtk_editable_set_editable(GTK_EDITABLE(obj), FALSE);
189 GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(obj), GTK_CAN_FOCUS);
192 gtk_editable_set_editable(GTK_EDITABLE(obj), TRUE);
193 GTK_WIDGET_SET_FLAGS(GTK_WIDGET(obj), GTK_CAN_FOCUS);
198 gtk_entry_set_text(GTK_ENTRY(obj), value);
202 gchar *field = stuffkeeper_data_schema_get_custom_field_string(stuffkeeper_data_item_get_schema(item),
204 PRIVATE_FIELD_DEFAULT);
206 gtk_entry_set_text(GTK_ENTRY(obj), field);
208 self_changed(obj,NULL);
212 obj->_priv->signal_backend_locked = g_signal_connect_swapped(G_OBJECT(stuffkeeper_data_item_get_backend(item)),
213 "notify::locked", G_CALLBACK(self_backend_locked), obj);
214 self_backend_locked(obj,NULL, STUFFKEEPER_DATA_BACKEND(stuffkeeper_data_item_get_backend(item)));
216 /* this is destroyed when self is destroyed, so no need to disconnect myself */
217 obj->_priv->changed_entry = g_signal_connect(G_OBJECT(obj), "changed", G_CALLBACK(self_changed), NULL);
218 return GTK_WIDGET(obj);
223 finalize (G:Object *obj)
225 Self *self = SELF(obj);
226 if(self->_priv->signal_backend_locked) {
227 g_signal_handler_disconnect(G_OBJECT(stuffkeeper_data_item_get_backend(self->_priv->item)), self->_priv->signal_backend_locked);
228 self->_priv->signal_backend_locked = 0;
230 if(self->_priv->changed_item_entry)
232 g_signal_handler_disconnect(self->_priv->item,self->_priv->changed_item_entry);
233 self->_priv->changed_item_entry = 0;
235 if(self->_priv->changed_entry_timeout)
237 g_source_remove(self->_priv->changed_entry_timeout);
238 self->_priv->changed_entry_timeout = 0;
239 printf("Finalize: %p\n", self);
240 self_save_changes(self);