elm_code: require an elm_code for each widget

In our finalizer we ensure that an elm_code is set.
No longer allow code_set to be called after construction.
This commit is contained in:
Andy Williams 2015-02-28 13:22:38 +00:00
parent e8297bc390
commit e0477ff3cb
7 changed files with 74 additions and 17 deletions

View File

@ -69,9 +69,9 @@ _elm_code_test_welcome_setup(Evas_Object *parent)
Elm_Code_Widget *widget;
code = elm_code_create();
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(code));
eo_do(widget,
elm_code_widget_code_set(code),
elm_code_widget_font_size_set(12),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _elm_code_test_line_done_cb, NULL);
eo_event_callback_add(ELM_CODE_WIDGET_EVENT_LINE_CLICKED, _elm_code_test_line_clicked_cb, code));
@ -95,9 +95,9 @@ _elm_code_test_editor_setup(Evas_Object *parent)
Elm_Code_Widget *widget;
code = elm_code_create();
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(code));
eo_do(widget,
elm_code_widget_code_set(code),
elm_code_widget_font_size_set(14),
elm_code_widget_editable_set(EINA_TRUE),
elm_code_widget_line_numbers_set(EINA_TRUE));

View File

@ -102,9 +102,9 @@ elm_code_diff_widget_add(Evas_Object *parent, Elm_Code *code)
// left side of diff
wcode1 = elm_code_create();
widget_left = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget_left = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(wcode1));
eo_do(widget_left,
elm_code_widget_code_set(wcode1),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _elm_code_diff_widget_line_cb, NULL));
evas_object_size_hint_weight_set(widget_left, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@ -115,9 +115,9 @@ elm_code_diff_widget_add(Evas_Object *parent, Elm_Code *code)
// right side of diff
wcode2 = elm_code_create();
widget_right = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget_right = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(wcode2));
eo_do(widget_right,
elm_code_widget_code_set(wcode2),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _elm_code_diff_widget_line_cb, NULL));
evas_object_size_hint_weight_set(widget_right, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

View File

@ -27,9 +27,15 @@ Eina_Unicode status_icons[] = {
0
};
#define EO_CONSTRUCTOR_CHECK_RETURN(obj) \
if (eo_do(obj, eo_finalized_get())) \
{ \
ERR("This function is only allowed during construction."); \
return; \
}
EOLIAN static void
_elm_code_widget_eo_base_constructor(Eo *obj, Elm_Code_Widget_Data *pd EINA_UNUSED)
_elm_code_widget_eo_base_constructor(Eo *obj, Elm_Code_Widget_Data *pd)
{
eo_do_super(obj, ELM_CODE_WIDGET_CLASS, eo_constructor());
@ -37,6 +43,18 @@ _elm_code_widget_eo_base_constructor(Eo *obj, Elm_Code_Widget_Data *pd EINA_UNUS
pd->cursor_col = 1;
}
EOLIAN static Eo *
_elm_code_widget_eo_base_finalize(Eo *obj, Elm_Code_Widget_Data *pd)
{
eo_do_super(obj, ELM_CODE_WIDGET_CLASS, eo_finalize());
if (pd->code)
return obj;
ERR("Elm_Code_Widget cannot finalize without calling elm_code_widget_code_set.");
return NULL;
}
EOLIAN static void
_elm_code_widget_class_constructor(Eo_Class *klass EINA_UNUSED)
{
@ -582,8 +600,10 @@ _elm_code_widget_font_size_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd)
}
EOLIAN static void
_elm_code_widget_code_set(Eo *obj, Elm_Code_Widget_Data *pd EINA_UNUSED, Elm_Code *code)
_elm_code_widget_code_set(Eo *obj, Elm_Code_Widget_Data *pd, Elm_Code *code)
{
EO_CONSTRUCTOR_CHECK_RETURN(obj);
pd->code = code;
code->widgets = eina_list_append(code->widgets, obj);

View File

@ -5,7 +5,9 @@ class Elm_Code_Widget (Elm_Layout, Elm_Interface_Atspi_Text)
code {
set {
/*@
Set the underlying code object that this widget renders
Set the underlying code object that this widget renders.
This can only be set during construction, once the widget is created the
backing code object cannot be changed.
@ingroup Data */
}
@ -109,6 +111,7 @@ class Elm_Code_Widget (Elm_Layout, Elm_Interface_Atspi_Text)
implements {
class.constructor;
Eo.Base.constructor;
Eo.Base.finalize;
Evas.Object_Smart.add;
Elm_Widget.focus_next_manager_is;
Elm_Widget.focus_direction_manager_is;

View File

@ -41,8 +41,42 @@ START_TEST (elm_code_widget_token_render_simple_test)
}
END_TEST
START_TEST (elm_code_widget_construct)
{
Elm_Code *code;
Elm_Code_Widget *widget, *win;
elm_init(1, NULL);
code = elm_code_create();
win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
widget = eo_add(ELM_CODE_WIDGET_CLASS, win,
elm_code_widget_code_set(code));
ck_assert(!!widget);
elm_code_free(code);
elm_shutdown();
}
END_TEST
START_TEST (elm_code_widget_construct_nocode)
{
Elm_Code_Widget *widget, *win;
elm_init(1, NULL);
win = elm_win_add(NULL, "entry", ELM_WIN_BASIC);
widget = eo_add(ELM_CODE_WIDGET_CLASS, win);
ck_assert(!widget);
elm_shutdown();
}
END_TEST
void elm_code_test_widget(TCase *tc)
{
tcase_add_test(tc, elm_code_widget_token_render_simple_test);
tcase_add_test(tc, elm_code_widget_construct);
tcase_add_test(tc, elm_code_widget_construct_nocode);
}

View File

@ -316,9 +316,9 @@ void edi_consolepanel_add(Evas_Object *parent)
code = elm_code_create();
_edi_console_code = code;
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(code));
eo_do(widget,
elm_code_widget_code_set(code),
elm_code_widget_font_size_set(_edi_cfg->font.size),
elm_code_widget_gravity_set(0.0, 1.0),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_consolepanel_line_cb, NULL),
@ -342,9 +342,9 @@ void edi_testpanel_add(Evas_Object *parent)
code = elm_code_create();
_edi_test_code = code;
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(code));
eo_do(widget,
elm_code_widget_code_set(code),
elm_code_widget_font_size_set(_edi_cfg->font.size),
elm_code_widget_gravity_set(0.0, 1.0),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_testpanel_line_cb, NULL),

View File

@ -52,9 +52,9 @@ void edi_logpanel_add(Evas_Object *parent)
Elm_Code *code;
code = elm_code_create();
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent);
widget = eo_add(ELM_CODE_WIDGET_CLASS, parent,
elm_code_widget_code_set(code));
eo_do(widget,
elm_code_widget_code_set(code),
elm_code_widget_font_size_set(_edi_cfg->font.size),
elm_code_widget_gravity_set(0.0, 1.0),
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_logpanel_line_cb, NULL));