Ejemplo n.º 1
0
void
purple_request_field_list_set_selected(PurpleRequestField *field, GList *items)
{
	GList *l;

	g_return_if_fail(field != NULL);
	g_return_if_fail(items != NULL);
	g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);

	purple_request_field_list_clear_selected(field);

	if (!purple_request_field_list_get_multi_select(field) &&
		items && items->next)
	{
		purple_debug_warning("request",
						   "More than one item added to non-multi-select "
						   "field %s\n",
						   purple_request_field_get_id(field));
		return;
	}

	for (l = items; l != NULL; l = l->next)
	{
		field->u.list.selected = g_list_append(field->u.list.selected,
					g_strdup(l->data));
		g_hash_table_insert(field->u.list.selected_table,
							g_strdup((char *)l->data), NULL);
	}
}
Ejemplo n.º 2
0
static GntWidget*
create_list_field(PurpleRequestField *field)
{
	GntWidget *ret = NULL;
	GList *list;
	gboolean multi = purple_request_field_list_get_multi_select(field);
	if (multi)
	{
		GntWidget *tree = gnt_tree_new();

		list = purple_request_field_list_get_items(field);
		for (; list; list = list->next)
		{
			const char *text = list->data;
			gpointer key = purple_request_field_list_get_data(field, text);
			gnt_tree_add_choice(GNT_TREE(tree), key,
					gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL);
			if (purple_request_field_list_is_selected(field, text))
				gnt_tree_set_choice(GNT_TREE(tree), key, TRUE);
		}
		ret = tree;
	}
	else
	{
		GntWidget *combo = gnt_combo_box_new();

		list = purple_request_field_list_get_items(field);
		for (; list; list = list->next)
		{
			const char *text = list->data;
			gpointer key = purple_request_field_list_get_data(field, text);
			gnt_combo_box_add_data(GNT_COMBO_BOX(combo), key, text);
			if (purple_request_field_list_is_selected(field, text))
				gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), key);
		}
		ret = combo;
	}
	return ret;
}
Ejemplo n.º 3
0
void
purple_request_field_list_add_selected(PurpleRequestField *field, const char *item)
{
	g_return_if_fail(field != NULL);
	g_return_if_fail(item  != NULL);
	g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST);

	if (!purple_request_field_list_get_multi_select(field) &&
		field->u.list.selected != NULL)
	{
		purple_debug_warning("request",
						   "More than one item added to non-multi-select "
						   "field %s\n",
						   purple_request_field_get_id(field));
		return;
	}

	field->u.list.selected = g_list_append(field->u.list.selected,
										   g_strdup(item));

	g_hash_table_insert(field->u.list.selected_table, g_strdup(item), NULL);
}
Ejemplo n.º 4
0
static void
request_fields_cb(GntWidget *button, PurpleRequestFields *fields)
{
	PurpleRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback");
	gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata");
	GList *list;

	/* Update the data of the fields. Pidgin does this differently. Instead of
	 * updating the fields at the end like here, it updates the appropriate field
	 * instantly whenever a change is made. That allows it to make sure the
	 * 'required' fields are entered before the user can hit OK. It's not the case
	 * here, althought it can be done. */
	for (list = purple_request_fields_get_groups(fields); list; list = list->next)
	{
		PurpleRequestFieldGroup *group = list->data;
		GList *fields = purple_request_field_group_get_fields(group);

		for (; fields ; fields = fields->next)
		{
			PurpleRequestField *field = fields->data;
			PurpleRequestFieldType type = purple_request_field_get_type(field);
			if (type == PURPLE_REQUEST_FIELD_BOOLEAN)
			{
				GntWidget *check = FINCH_GET_DATA(field);
				gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check));
				purple_request_field_bool_set_value(field, value);
			}
			else if (type == PURPLE_REQUEST_FIELD_STRING)
			{
				GntWidget *entry = FINCH_GET_DATA(field);
				const char *text = gnt_entry_get_text(GNT_ENTRY(entry));
				purple_request_field_string_set_value(field, (text && *text) ? text : NULL);
			}
			else if (type == PURPLE_REQUEST_FIELD_INTEGER)
			{
				GntWidget *entry = FINCH_GET_DATA(field);
				const char *text = gnt_entry_get_text(GNT_ENTRY(entry));
				int value = (text && *text) ? atoi(text) : 0;
				purple_request_field_int_set_value(field, value);
			}
			else if (type == PURPLE_REQUEST_FIELD_CHOICE)
			{
				GntWidget *combo = FINCH_GET_DATA(field);
				int id;
				id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)));
				purple_request_field_choice_set_value(field, id);
			}
			else if (type == PURPLE_REQUEST_FIELD_LIST)
			{
				GList *list = NULL;
				if (purple_request_field_list_get_multi_select(field))
				{
					GList *iter;
					GntWidget *tree = FINCH_GET_DATA(field);

					iter = purple_request_field_list_get_items(field);
					for (; iter; iter = iter->next)
					{
						const char *text = iter->data;
						gpointer key = purple_request_field_list_get_data(field, text);
						if (gnt_tree_get_choice(GNT_TREE(tree), key))
							list = g_list_prepend(list, key);
					}
				}
				else
				{
					GntWidget *combo = FINCH_GET_DATA(field);
					gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
					list = g_list_append(list, data);
				}

				purple_request_field_list_set_selected(field, list);
				g_list_free(list);
			}
			else if (type == PURPLE_REQUEST_FIELD_ACCOUNT)
			{
				GntWidget *combo = FINCH_GET_DATA(field);
				PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo));
				purple_request_field_account_set_value(field, acc);
			}
		}
	}

	purple_notify_close_with_handle(button);

	if (!g_object_get_data(G_OBJECT(button), "cancellation-function") &&
			!purple_request_fields_all_required_filled(fields)) {
		purple_notify_error(button, _("Error"),
				_("You must fill all the required fields."),
				_("The required fields are underlined."));
		return;
	}

	if (callback)
		callback(data, fields);

	while (button->parent)
		button = button->parent;

	purple_request_close(PURPLE_REQUEST_FIELDS, button);
}
Ejemplo n.º 5
0
Request::FieldsDialog::FieldsDialog(const char *title, const char *primary,
                                    const char *secondary, PurpleRequestFields *request_fields,
                                    const char *ok_text, GCallback ok_cb, const char *cancel_text,
                                    GCallback cancel_cb, void *user_data)
    : RequestDialog(title, primary, secondary, ok_text, ok_cb, cancel_text,
                    cancel_cb, user_data), fields(request_fields)
{
    tree = new CppConsUI::TreeView(AUTOSIZE, AUTOSIZE);
    lbox->AppendWidget(*tree);

    bool grouping = true;
    GList *groups = purple_request_fields_get_groups(fields);
    if (!groups)
        return;
    if (!purple_request_field_group_get_title(
                reinterpret_cast<PurpleRequestFieldGroup*>(groups->data))
            && !groups->next)
        grouping = false;
    for (; groups; groups = groups->next) {
        PurpleRequestFieldGroup *group
            = reinterpret_cast<PurpleRequestFieldGroup*>(groups->data);

        CppConsUI::TreeView::NodeReference parent = tree->GetRootNode();
        if (grouping) {
            const char *title = purple_request_field_group_get_title(group);
            if (!title)
                title = _("Settings group");

            CppConsUI::TreeView::ToggleCollapseButton *button
                = new CppConsUI::TreeView::ToggleCollapseButton(title);
            parent = tree->AppendNode(tree->GetRootNode(), *button);
        }

        for (GList *gfields = purple_request_field_group_get_fields(group);
                gfields; gfields = gfields->next) {
            PurpleRequestField *field
                = reinterpret_cast<PurpleRequestField*>(gfields->data);

            if (!purple_request_field_is_visible(field))
                continue;

            PurpleRequestFieldType type = purple_request_field_get_type(field);

            switch (type) {
            case PURPLE_REQUEST_FIELD_STRING:
                tree->AppendNode(parent, *(new StringField(field)));
                break;
            case PURPLE_REQUEST_FIELD_INTEGER:
                tree->AppendNode(parent, *(new IntegerField(field)));
                break;
            case PURPLE_REQUEST_FIELD_BOOLEAN:
                tree->AppendNode(parent, *(new BooleanField(field)));
                break;
            case PURPLE_REQUEST_FIELD_CHOICE:
                tree->AppendNode(parent, *(new ChoiceField(field)));
                break;
            case PURPLE_REQUEST_FIELD_LIST:
                if (purple_request_field_list_get_multi_select(field))
                    tree->AppendNode(parent, *(new ListFieldMultiple(field)));
                else
                    tree->AppendNode(parent, *(new ListFieldSingle(field)));
                break;
            case PURPLE_REQUEST_FIELD_LABEL:
                tree->AppendNode(parent, *(new LabelField(field)));
                break;
            case PURPLE_REQUEST_FIELD_IMAGE:
                tree->AppendNode(parent, *(new ImageField(field)));
                break;
            case PURPLE_REQUEST_FIELD_ACCOUNT:
                tree->AppendNode(parent, *(new AccountField(field)));
                break;
            default:
                LOG->Error(_("Unimplemented Request field type."));
                break;
            }
        }
    }
}