/* sets up the widgets for a single rule */ static void rule_editor_setup_widgets (struct changeRequest *changeRequest, rulePtr rule) { GtkWidget *widget; ruleInfoPtr ruleInfo; ruleInfo = g_slist_nth_data (rule_get_available_rules (), changeRequest->rule); g_object_set_data (G_OBJECT (changeRequest->paramHBox), "rule", rule); /* remove of old widgets */ gtk_container_foreach (GTK_CONTAINER (changeRequest->paramHBox), rule_editor_destroy_param_widget, NULL); /* add popup menu for selection of positive or negative logic */ widget = gtk_combo_box_text_new (); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), ruleInfo->positive); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), ruleInfo->negative); gtk_combo_box_set_active ((GtkComboBox*)widget, (rule->additive)?0:1); g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (on_rule_changed_additive), rule); gtk_widget_show_all (widget); gtk_box_pack_start (GTK_BOX (changeRequest->paramHBox), widget, FALSE, FALSE, 0); /* add new value entry if needed */ if (ruleInfo->needsParameter) { widget = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (widget), rule->value); gtk_widget_show (widget); g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK(on_rulevalue_changed), rule); gtk_box_pack_start (GTK_BOX (changeRequest->paramHBox), widget, FALSE, FALSE, 0); } else { /* nothing needs to be added */ } }
static void do_ruletype_changed (struct changeRequest *changeRequest) { ruleInfoPtr ruleInfo; rulePtr rule; rule = g_object_get_data (G_OBJECT (changeRequest->paramHBox), "rule"); if (rule) { changeRequest->editor->priv->newRules = g_slist_remove (changeRequest->editor->priv->newRules, rule); rule_free (rule); } ruleInfo = g_slist_nth_data (rule_get_available_rules (), changeRequest->rule); rule = rule_new (ruleInfo->ruleId, "", TRUE); changeRequest->editor->priv->newRules = g_slist_append (changeRequest->editor->priv->newRules, rule); rule_editor_setup_widgets (changeRequest, rule); }
rulePtr rule_new (const gchar *ruleId, const gchar *value, gboolean additive) { GSList *iter; iter = rule_get_available_rules (); while (iter) { ruleInfoPtr ruleInfo = (ruleInfoPtr)iter->data; if (0 == strcmp (ruleInfo->ruleId, ruleId)) { rulePtr rule = (rulePtr) g_new0 (struct rule, 1); rule->ruleInfo = ruleInfo; rule->additive = additive; rule->value = common_strreplace (g_strdup (value), "'", ""); return rule; } iter = g_slist_next (iter); }
void rule_editor_add_rule (RuleEditor *re, rulePtr rule) { GSList *ruleIter; GtkWidget *hbox, *hbox2, *widget; GtkListStore *store; struct changeRequest *changeRequest, *selected = NULL; gint i = 0, active = 0; hbox = gtk_hbox_new (FALSE, 2); /* hbox to contain all rule widgets */ hbox2 = gtk_hbox_new (FALSE, 2); /* another hbox where the rule specific widgets are added */ /* set up the rule type selection popup */ store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); ruleIter = rule_get_available_rules (); while (ruleIter) { ruleInfoPtr ruleInfo = (ruleInfoPtr)ruleIter->data; GtkTreeIter iter; /* we add a change request to each popup option */ changeRequest = g_new0 (struct changeRequest, 1); changeRequest->paramHBox = hbox2; changeRequest->rule = i; changeRequest->editor = re; if (0 == i) selected = changeRequest; /* build the menu option */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, ruleInfo->title, 1, changeRequest, -1); if (rule) { if (ruleInfo == rule->ruleInfo) { selected = changeRequest; active = i; } } ruleIter = g_slist_next (ruleIter); i++; } widget = gtk_combo_box_new (); ui_common_setup_combo_text (GTK_COMBO_BOX (widget), 0); gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store)); gtk_combo_box_set_active (GTK_COMBO_BOX (widget), active); g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (on_ruletype_changed), NULL); gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0); if (!rule) { /* fake a rule type change to initialize parameter widgets */ do_ruletype_changed (selected); } else { rulePtr newRule = rule_new (rule->ruleInfo->ruleId, rule->value, rule->additive); /* set up widgets with existing rule type and value */ rule_editor_setup_widgets (selected, newRule); /* add the rule to the list of new rules */ re->priv->newRules = g_slist_append (re->priv->newRules, newRule); } /* add remove button */ changeRequest = g_new0 (struct changeRequest, 1); changeRequest->hbox = hbox; changeRequest->paramHBox = hbox2; changeRequest->editor = re; widget = gtk_button_new_from_stock ("gtk-remove"); gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (on_ruleremove_clicked), changeRequest); /* and insert everything in the dialog */ gtk_widget_show_all (hbox); gtk_box_pack_start (GTK_BOX (re->priv->root), hbox, FALSE, TRUE, 0); }