static PlannerCmd * property_cmd_label_edited (PlannerWindow *window, MrpProperty *property, MrpProject *project, GType owner, const gchar *new_text) { PlannerCmd *cmd_base; PropertyCmdLabelEdited *cmd; cmd_base = planner_cmd_new (PropertyCmdLabelEdited, _("Edit property label"), property_cmd_label_edited_do, property_cmd_label_edited_undo, property_cmd_label_edited_free); cmd = (PropertyCmdLabelEdited *) cmd_base; cmd->window = window; cmd->new_text = g_strdup (new_text); cmd->old_text = g_strdup (mrp_property_get_label (property)); cmd->project = project; cmd->name = g_strdup (mrp_property_get_name (property)); cmd->owner = owner; planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (window), cmd_base); return cmd_base; }
static gboolean property_model_property_changed_helper (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { MrpProperty *property; const gchar *property_name; gchar *name; g_return_val_if_fail (data != NULL, FALSE); property = MRP_PROPERTY (data); property_name = mrp_property_get_name (property); gtk_tree_model_get (model, iter, COL_NAME, &name, -1); if (!strcmp (name, property_name)) { gtk_list_store_set (GTK_LIST_STORE (model), iter, COL_LABEL, mrp_property_get_label (property), -1); return TRUE; } return FALSE; }
static void property_model_property_added_cb (MrpProject *project, GType owner_type, MrpProperty *property, MrpPropertyStore *shop) { GtkTreeIter iter; MrpPropertyType type; GtkListStore *store; if (owner_type != shop->owner_type) { return; } store = shop->store; if (store) { type = mrp_property_get_property_type (property); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, COL_NAME, mrp_property_get_name (property), COL_LABEL, mrp_property_get_label (property), COL_TYPE, mrp_property_type_as_string (type), COL_PROPERTY, property, -1); } }
static void property_model_property_removed_cb (MrpProject *project, MrpProperty *property, GtkTreeModel *model) { gtk_tree_model_foreach (model, property_model_property_removed_helper, (gchar *)mrp_property_get_name (property)); }
static gchar * mpp_property_to_string (MrpObject *object, MrpProperty *property) { const gchar *name; gchar *str; gchar buffer[G_ASCII_DTOSTR_BUF_SIZE]; gint i; gfloat f; mrptime date; GArray *array; name = mrp_property_get_name (property); switch (mrp_property_get_property_type (property)) { case MRP_PROPERTY_TYPE_STRING: mrp_object_get (object, name, &str, NULL); return str; case MRP_PROPERTY_TYPE_STRING_LIST: mrp_object_get (object, name, &array, NULL); if (!array) { return NULL; } /* FIXME */ str = g_strdup ("text-list-foo"); return str; case MRP_PROPERTY_TYPE_INT: mrp_object_get (object, name, &i, NULL); return g_strdup_printf ("%d", i); case MRP_PROPERTY_TYPE_FLOAT: mrp_object_get (object, name, &f, NULL); g_ascii_dtostr (buffer, sizeof (buffer), (double) f); return g_strdup (buffer); case MRP_PROPERTY_TYPE_DURATION: mrp_object_get (object, name, &i, NULL); return g_strdup_printf ("%d", i); case MRP_PROPERTY_TYPE_DATE: mrp_object_get (object, name, &date, NULL); str = mrp_time_to_string (date); return str; case MRP_PROPERTY_TYPE_COST: /* FIXME: implement cost */ return NULL; default: g_warning ("Not implemented support for type %d", mrp_property_get_property_type (property)); break; } return NULL; }
static void mpp_write_custom_properties (MrpParser *parser, xmlNodePtr node, MrpObject *object) { GList *properties, *l; xmlNodePtr child; MrpProperty *property; gchar *value; properties = mrp_project_get_properties_from_type (parser->project, G_OBJECT_TYPE (object)); if (properties == NULL) { return; } node = xmlNewChild (node, NULL, "properties", NULL); for (l = properties; l; l = l->next) { property = l->data; child = xmlNewChild (node, NULL, "property", NULL); xmlSetProp (child, "name", mrp_property_get_name (property)); if (mrp_property_get_property_type (property) == MRP_PROPERTY_TYPE_STRING_LIST) { mpp_write_string_list (child, property, object); } else { value = mpp_property_to_string (object, property); xmlSetProp (child, "value", value); g_free (value); } } g_list_free (properties); }
static void mpp_write_string_list (xmlNodePtr node, MrpProperty *property, MrpObject *object) { xmlNodePtr child; GArray *array; GValue *value; gint i; mrp_object_get (object, mrp_property_get_name (property), &array, NULL); if (!array) { return; } for (i = 0; i < array->len; i++) { value = g_array_index (array, GValue *, i); child = xmlNewChild (node, NULL, "list-item", NULL); xmlSetProp (child, "value", g_value_get_string (value)); } g_array_free (array, TRUE); }
GtkTreeModel * planner_property_model_new (MrpProject *project, GType owner_type, MrpPropertyStore *shop) { GtkListStore *store; GList *properties, *l; MrpProperty *property; MrpPropertyType type; GtkTreeIter iter; store = gtk_list_store_new (5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); shop->store = store; shop->owner_type = owner_type; properties = mrp_project_get_properties_from_type (project, owner_type); for (l = properties; l; l = l->next) { property = l->data; type = mrp_property_get_property_type (property); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, COL_NAME, mrp_property_get_name (property), COL_LABEL, mrp_property_get_label (property), COL_TYPE, mrp_property_type_as_string (type), COL_PROPERTY, property, -1); } /* We need to know which store to add the property so we pass the shop * reference not the store. The shop is a structure that correlates * which store currently holds which owner. We don't have to bother with * this when changing or removing - just adding. */ g_signal_connect (project, "property_added", G_CALLBACK (property_model_property_added_cb), shop); g_signal_connect (project, "property_removed", G_CALLBACK (property_model_property_removed_cb), store); g_signal_connect (project, "property_changed", G_CALLBACK (property_model_property_changed_cb), store); return GTK_TREE_MODEL (store); }
static void mpp_write_property_specs (MrpParser *parser, xmlNodePtr node) { GList *properties, *l; xmlNodePtr child; MrpProperty *property; MrpPropertyType type; properties = mrp_project_get_properties_from_type (parser->project, MRP_TYPE_PROJECT); node = xmlNewChild (node, NULL, "properties", NULL); for (l = properties; l; l = l->next) { property = l->data; child = xmlNewChild (node, NULL, "property", NULL); xmlSetProp (child, "name", mrp_property_get_name (property)); type = mrp_property_get_property_type (property); xmlSetProp (child, "type", mpp_property_type_to_string (type)); xmlSetProp (child, "owner", "project"); xmlSetProp (child, "label", mrp_property_get_label (property)); xmlSetProp (child, "description", mrp_property_get_description (property)); } g_list_free (properties); properties = mrp_project_get_properties_from_type (parser->project, MRP_TYPE_TASK); for (l = properties; l; l = l->next) { property = l->data; child = xmlNewChild (node, NULL, "property", NULL); xmlSetProp (child, "name", mrp_property_get_name (property)); type = mrp_property_get_property_type (property); xmlSetProp (child, "type", mpp_property_type_to_string (type)); xmlSetProp (child, "owner", "task"); xmlSetProp (child, "label", mrp_property_get_label (property)); xmlSetProp (child, "description", mrp_property_get_description (property)); } g_list_free (properties); properties = mrp_project_get_properties_from_type (parser->project, MRP_TYPE_RESOURCE); for (l = properties; l; l = l->next) { property = l->data; child = xmlNewChild (node, NULL, "property", NULL); xmlSetProp (child, "name", mrp_property_get_name (property)); type = mrp_property_get_property_type (property); xmlSetProp (child, "type", mpp_property_type_to_string (type)); xmlSetProp (child, "owner", "resource"); xmlSetProp (child, "label", mrp_property_get_label (property)); xmlSetProp (child, "description", mrp_property_get_description (property)); } g_list_free (properties); }