178 lines
4.8 KiB
C
178 lines
4.8 KiB
C
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
|
/*
|
|
* Copyright (C) 2011 Ruby-GNOME2 Project Team
|
|
* Copyright (C) 2003 Masao Mutoh
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "rbatkprivate.h"
|
|
|
|
#define RG_TARGET_NAMESPACE mEditableText
|
|
#define _SELF(s) (RVAL2ATKEDITABLETEXT(s))
|
|
|
|
struct rval2atkattributegslist_args {
|
|
VALUE ary;
|
|
long n;
|
|
GSList *result;
|
|
};
|
|
|
|
static VALUE
|
|
rbatk_rval2atkattributegslist_body(VALUE value)
|
|
{
|
|
long i;
|
|
struct rval2atkattributegslist_args *args = (struct rval2atkattributegslist_args *)value;
|
|
|
|
for (i = 0; i < args->n; i++) {
|
|
VALUE ary = rb_ary_to_ary(RARRAY_PTR(args->ary)[i]);
|
|
AtkAttribute *attribute;
|
|
|
|
if (RARRAY_LEN(ary) != 2)
|
|
rb_raise(rb_eArgError, "attribute %ld should be an array of length 2", i);
|
|
|
|
attribute = g_new(AtkAttribute, 1);
|
|
args->result = g_slist_append(args->result, attribute);
|
|
attribute->name = g_strdup(RVAL2CSTR(RARRAY_PTR(ary)[0]));
|
|
attribute->value = g_strdup(RVAL2CSTR(RARRAY_PTR(ary)[1]));
|
|
}
|
|
|
|
return Qnil;
|
|
}
|
|
|
|
static void
|
|
rbatk_atkattributegslist_free(GSList *list)
|
|
{
|
|
GSList *p;
|
|
|
|
for (p = list; p != NULL; p = g_slist_next(p)) {
|
|
AtkAttribute *attribute = (AtkAttribute *)p->data;
|
|
|
|
g_free(attribute->value);
|
|
g_free(attribute->name);
|
|
g_free(attribute);
|
|
}
|
|
|
|
g_slist_free(list);
|
|
}
|
|
|
|
static G_GNUC_NORETURN VALUE
|
|
rbatk_rval2atkattributegslist_rescue(VALUE value)
|
|
{
|
|
rbatk_atkattributegslist_free(((struct rval2atkattributegslist_args *)value)->result);
|
|
|
|
rb_exc_raise(rb_errinfo());
|
|
}
|
|
|
|
static GSList *
|
|
rbatk_rval2atkattributegslist(VALUE value)
|
|
{
|
|
struct rval2atkattributegslist_args args;
|
|
|
|
args.ary = rb_ary_to_ary(value);
|
|
args.n = RARRAY_LEN(args.ary);
|
|
args.result = NULL;
|
|
|
|
rb_rescue(rbatk_rval2atkattributegslist_body, (VALUE)&args,
|
|
rbatk_rval2atkattributegslist_rescue, (VALUE)&args);
|
|
|
|
return args.result;
|
|
}
|
|
|
|
#define RVAL2ATKATTRIBUTEGSLIST(value) rbatk_rval2atkattributegslist(value)
|
|
|
|
static VALUE
|
|
rg_set_run_attributes(VALUE self,
|
|
VALUE attributes,
|
|
VALUE rbstart_offset,
|
|
VALUE rbend_offset)
|
|
{
|
|
AtkEditableText *editable;
|
|
gint start_offset, end_offset;
|
|
AtkAttributeSet *list;
|
|
gboolean result;
|
|
|
|
if (NIL_P(attributes))
|
|
return Qfalse;
|
|
|
|
editable = _SELF(self);
|
|
start_offset = NUM2INT(rbstart_offset);
|
|
end_offset = NUM2INT(rbend_offset);
|
|
list = RVAL2ATKATTRIBUTEGSLIST(attributes);
|
|
result = atk_editable_text_set_run_attributes(editable, list, start_offset, end_offset);
|
|
rbatk_atkattributegslist_free(list);
|
|
|
|
return CBOOL2RVAL(result);
|
|
}
|
|
|
|
static VALUE
|
|
rg_set_text_contents(VALUE self, VALUE str)
|
|
{
|
|
atk_editable_text_set_text_contents(_SELF(self), RVAL2CSTR(str));
|
|
return self;
|
|
}
|
|
|
|
static VALUE
|
|
rg_insert_text(VALUE self, VALUE str, VALUE position)
|
|
{
|
|
gint pos = NUM2INT(position);
|
|
|
|
StringValue(str);
|
|
atk_editable_text_insert_text(_SELF(self), RVAL2CSTR(str), RSTRING_LEN(str), &pos);
|
|
return INT2NUM(pos);
|
|
}
|
|
|
|
static VALUE
|
|
rg_copy_text(VALUE self, VALUE start_pos, VALUE end_pos)
|
|
{
|
|
atk_editable_text_copy_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
|
|
return self;
|
|
}
|
|
|
|
static VALUE
|
|
rg_cut_text(VALUE self, VALUE start_pos, VALUE end_pos)
|
|
{
|
|
atk_editable_text_cut_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
|
|
return self;
|
|
}
|
|
|
|
static VALUE
|
|
rg_delete_text(VALUE self, VALUE start_pos, VALUE end_pos)
|
|
{
|
|
atk_editable_text_delete_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
|
|
return self;
|
|
}
|
|
|
|
static VALUE
|
|
rg_paste_text(VALUE self, VALUE position)
|
|
{
|
|
atk_editable_text_paste_text(_SELF(self), NUM2INT(position));
|
|
return self;
|
|
}
|
|
|
|
void
|
|
Init_atk_editabletext(VALUE mAtk)
|
|
{
|
|
VALUE RG_TARGET_NAMESPACE = G_DEF_INTERFACE(ATK_TYPE_EDITABLE_TEXT, "EditableText", mAtk);
|
|
|
|
RG_DEF_METHOD(set_run_attributes, 3);
|
|
RG_DEF_METHOD(set_text_contents, 1);
|
|
RG_DEF_METHOD(insert_text, 2);
|
|
RG_DEF_METHOD(copy_text, 2);
|
|
RG_DEF_METHOD(cut_text, 2);
|
|
RG_DEF_METHOD(delete_text, 2);
|
|
RG_DEF_METHOD(paste_text, 1);
|
|
}
|