From e0477ff3cbac47c8e9d629e7c523129f273ee3e9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 28 Feb 2015 13:22:38 +0000 Subject: [PATCH] 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. --- elm_code/src/bin/elm_code_test_main.c | 8 +++--- elm_code/src/lib/elm_code_diff_widget.c | 8 +++--- elm_code/src/lib/elm_code_widget.c | 24 ++++++++++++++-- elm_code/src/lib/elm_code_widget.eo | 5 +++- elm_code/src/tests/elm_code_test_widget.c | 34 +++++++++++++++++++++++ src/bin/edi_consolepanel.c | 8 +++--- src/bin/edi_logpanel.c | 4 +-- 7 files changed, 74 insertions(+), 17 deletions(-) diff --git a/elm_code/src/bin/elm_code_test_main.c b/elm_code/src/bin/elm_code_test_main.c index e6235fc..336459b 100644 --- a/elm_code/src/bin/elm_code_test_main.c +++ b/elm_code/src/bin/elm_code_test_main.c @@ -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)); diff --git a/elm_code/src/lib/elm_code_diff_widget.c b/elm_code/src/lib/elm_code_diff_widget.c index 21790e9..6148f6a 100644 --- a/elm_code/src/lib/elm_code_diff_widget.c +++ b/elm_code/src/lib/elm_code_diff_widget.c @@ -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); diff --git a/elm_code/src/lib/elm_code_widget.c b/elm_code/src/lib/elm_code_widget.c index 3d89507..8f9b468 100644 --- a/elm_code/src/lib/elm_code_widget.c +++ b/elm_code/src/lib/elm_code_widget.c @@ -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); diff --git a/elm_code/src/lib/elm_code_widget.eo b/elm_code/src/lib/elm_code_widget.eo index 3bc81b8..36c6c98 100644 --- a/elm_code/src/lib/elm_code_widget.eo +++ b/elm_code/src/lib/elm_code_widget.eo @@ -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; diff --git a/elm_code/src/tests/elm_code_test_widget.c b/elm_code/src/tests/elm_code_test_widget.c index 2836bb4..ed5e91b 100644 --- a/elm_code/src/tests/elm_code_test_widget.c +++ b/elm_code/src/tests/elm_code_test_widget.c @@ -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); } diff --git a/src/bin/edi_consolepanel.c b/src/bin/edi_consolepanel.c index 9979bc0..8dee6bf 100644 --- a/src/bin/edi_consolepanel.c +++ b/src/bin/edi_consolepanel.c @@ -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), diff --git a/src/bin/edi_logpanel.c b/src/bin/edi_logpanel.c index 87cdcda..3b187bd 100644 --- a/src/bin/edi_logpanel.c +++ b/src/bin/edi_logpanel.c @@ -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));