Ejemplo n.º 1
0
/* 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 */
    }
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
	}	
Ejemplo n.º 4
0
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);
}