2014-09-30 07:56:16 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
#include "common.h"
|
|
|
|
|
2015-09-17 06:56:37 -07:00
|
|
|
#define UNFOCUS_DELAY 0.2
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
typedef struct goto_s
|
|
|
|
{
|
|
|
|
Evas_Object *win;
|
|
|
|
Evas_Object *layout;
|
2014-06-01 00:34:34 -07:00
|
|
|
Evas_Object *entry;
|
2014-05-31 23:35:54 -07:00
|
|
|
Evas_Object *btn;
|
2015-09-17 06:56:37 -07:00
|
|
|
Ecore_Timer *timer;
|
2016-07-01 23:39:10 -07:00
|
|
|
Enventor_Item *it;
|
2014-05-31 23:35:54 -07:00
|
|
|
} goto_data;
|
|
|
|
|
|
|
|
static goto_data *g_gd = NULL;
|
|
|
|
static Evas_Coord win_x = -1;
|
|
|
|
static Evas_Coord win_y = -1;
|
|
|
|
static Evas_Coord win_w = DEFAULT_GOTO_WIN_W;
|
|
|
|
static Evas_Coord win_h = DEFAULT_GOTO_WIN_H;
|
|
|
|
|
2016-07-01 02:58:26 -07:00
|
|
|
/*****************************************************************************/
|
|
|
|
/* Internal method implementation */
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
static void
|
|
|
|
win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_close();
|
|
|
|
}
|
|
|
|
|
2015-09-17 06:56:37 -07:00
|
|
|
static Eina_Bool
|
|
|
|
timer_cb(void *data EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_close();
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
win_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_data *gd = (goto_data*) data;
|
|
|
|
if (gd->timer) return;
|
|
|
|
evas_object_hide(gd->win);
|
|
|
|
gd->timer = ecore_timer_add(UNFOCUS_DELAY, timer_cb, gd);
|
|
|
|
}
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
static void
|
|
|
|
win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
/* Move the window with the previous remembered position when the window is
|
|
|
|
moved by window manager first time. */
|
|
|
|
if ((win_x != -1) || (win_y != -1)) evas_object_move(obj, win_x, win_y);
|
|
|
|
evas_object_smart_callback_del(obj, "moved", win_moved_cb);
|
|
|
|
}
|
|
|
|
|
2014-06-01 00:34:34 -07:00
|
|
|
static void
|
|
|
|
goto_line(goto_data *gd)
|
|
|
|
{
|
|
|
|
const char *txt = elm_entry_entry_get(gd->entry);
|
2016-06-02 00:01:13 -07:00
|
|
|
int line = 0;
|
|
|
|
if (txt) line = atoi(txt);
|
2016-07-01 23:39:10 -07:00
|
|
|
enventor_item_line_goto(gd->it, line);
|
2014-06-01 00:34:34 -07:00
|
|
|
goto_close();
|
|
|
|
}
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
static void
|
2014-08-06 02:02:54 -07:00
|
|
|
entry_activated_cb(void *data, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void* event_info EINA_UNUSED)
|
2014-05-31 23:35:54 -07:00
|
|
|
{
|
|
|
|
goto_data *gd = data;
|
|
|
|
if (elm_object_disabled_get(gd->btn)) return;
|
2014-06-01 00:34:34 -07:00
|
|
|
goto_line(gd);
|
2014-05-31 23:35:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
entry_changed_cb(void *data, Evas_Object *obj, void* event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_data *gd = data;
|
|
|
|
const char *txt = elm_entry_entry_get(obj);
|
2016-03-04 06:39:35 -08:00
|
|
|
|
|
|
|
if (!txt) return;
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
if (txt[0] == 0) return;
|
|
|
|
|
|
|
|
int line = atoi(txt);
|
|
|
|
|
2016-01-22 02:41:51 -08:00
|
|
|
if ((line < 1) ||
|
2016-07-01 23:39:10 -07:00
|
|
|
(line > enventor_item_max_line_get(gd->it)))
|
2014-05-31 23:35:54 -07:00
|
|
|
{
|
|
|
|
elm_object_part_text_set(gd->layout, "elm.text.msg",
|
2015-11-17 09:39:22 -08:00
|
|
|
_("Invalid line number"));
|
2014-05-31 23:35:54 -07:00
|
|
|
elm_object_disabled_set(gd->btn, EINA_TRUE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
elm_object_part_text_set(gd->layout, "elm.text.msg", "");
|
|
|
|
elm_object_disabled_set(gd->btn, EINA_FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-01 00:34:34 -07:00
|
|
|
static void
|
|
|
|
btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_data *gd = data;
|
|
|
|
goto_line(gd);
|
|
|
|
}
|
|
|
|
|
2015-08-26 21:03:54 -07:00
|
|
|
static void
|
|
|
|
keygrabber_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
goto_close();
|
|
|
|
}
|
|
|
|
|
2016-07-01 02:58:26 -07:00
|
|
|
/*****************************************************************************/
|
|
|
|
/* Externally accessible calls */
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
void
|
2016-01-22 02:41:51 -08:00
|
|
|
goto_open(void)
|
2014-05-31 23:35:54 -07:00
|
|
|
{
|
2014-08-02 01:40:51 -07:00
|
|
|
static Elm_Entry_Filter_Accept_Set digits_filter_data;
|
2014-05-31 23:35:54 -07:00
|
|
|
goto_data *gd = g_gd;
|
|
|
|
|
|
|
|
if (gd)
|
|
|
|
{
|
|
|
|
elm_win_activate(gd->win);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
search_close();
|
|
|
|
|
|
|
|
gd = calloc(1, sizeof(goto_data));
|
2014-07-27 21:40:58 -07:00
|
|
|
if (!gd)
|
|
|
|
{
|
2016-06-29 04:41:39 -07:00
|
|
|
mem_fail_msg();
|
2014-07-27 21:40:58 -07:00
|
|
|
return;
|
|
|
|
}
|
2014-05-31 23:35:54 -07:00
|
|
|
g_gd = gd;
|
|
|
|
|
2016-07-01 23:39:10 -07:00
|
|
|
Enventor_Item *it = enventor_object_focused_item_get(base_enventor_get());
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(it);
|
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
//Win
|
2015-11-17 09:39:22 -08:00
|
|
|
Evas_Object *win = elm_win_add(base_win_get(), _("Enventor Goto Line"),
|
2014-05-31 23:35:54 -07:00
|
|
|
ELM_WIN_DIALOG_BASIC);
|
|
|
|
elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
|
|
|
|
|
2015-11-17 09:39:22 -08:00
|
|
|
elm_win_title_set(win, _("Go to Line"));
|
2014-07-15 06:59:39 -07:00
|
|
|
win_w = (Evas_Coord) ((double) win_w * elm_config_scale_get());
|
|
|
|
win_h = (Evas_Coord) ((double) win_h * elm_config_scale_get());
|
2014-05-31 23:35:54 -07:00
|
|
|
evas_object_resize(win, win_w, win_h);
|
2015-09-17 06:56:37 -07:00
|
|
|
evas_object_smart_callback_add(win, "unfocused", win_unfocused_cb, gd);
|
2014-05-31 23:35:54 -07:00
|
|
|
evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
|
|
|
|
gd);
|
|
|
|
evas_object_smart_callback_add(win, "moved", win_moved_cb, gd);
|
|
|
|
|
|
|
|
//Bg
|
|
|
|
Evas_Object *bg = elm_bg_add(win);
|
|
|
|
evas_object_show(bg);
|
|
|
|
elm_win_resize_object_add(win, bg);
|
|
|
|
|
|
|
|
//Layout
|
|
|
|
Evas_Object *layout = elm_layout_add(win);
|
2014-07-30 01:02:08 -07:00
|
|
|
elm_layout_file_set(layout, EDJE_PATH, "goto_layout");
|
2014-05-31 23:35:54 -07:00
|
|
|
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(layout);
|
|
|
|
elm_win_resize_object_add(win, layout);
|
|
|
|
|
|
|
|
char buf[256];
|
2015-11-17 09:39:22 -08:00
|
|
|
snprintf(buf, sizeof(buf), _("Enter line number [1..%d]:"),
|
2016-07-01 23:39:10 -07:00
|
|
|
enventor_item_max_line_get(it));
|
2014-05-31 23:35:54 -07:00
|
|
|
elm_object_part_text_set(layout, "elm.text.goto", buf);
|
|
|
|
|
|
|
|
//Entry (line)
|
|
|
|
Evas_Object *entry = elm_entry_add(layout);
|
|
|
|
elm_entry_single_line_set(entry, EINA_TRUE);
|
|
|
|
elm_entry_scrollable_set(entry, EINA_TRUE);
|
2014-08-02 01:40:51 -07:00
|
|
|
|
|
|
|
digits_filter_data.accepted = "0123456789";
|
|
|
|
digits_filter_data.rejected = NULL;
|
|
|
|
elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set,
|
|
|
|
&digits_filter_data);
|
2014-05-31 23:35:54 -07:00
|
|
|
evas_object_smart_callback_add(entry, "activated", entry_activated_cb,
|
|
|
|
gd);
|
|
|
|
evas_object_smart_callback_add(entry, "changed,user", entry_changed_cb, gd);
|
|
|
|
evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0);
|
|
|
|
evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0);
|
|
|
|
evas_object_show(entry);
|
|
|
|
elm_object_focus_set(entry, EINA_TRUE);
|
|
|
|
elm_object_part_content_set(layout, "elm.swallow.entry", entry);
|
|
|
|
|
|
|
|
//Button (ok)
|
|
|
|
Evas_Object *btn = elm_button_add(layout);
|
2015-11-17 09:39:22 -08:00
|
|
|
elm_object_text_set(btn, _("Ok"));
|
2014-06-01 00:34:34 -07:00
|
|
|
evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, gd);
|
2014-05-31 23:35:54 -07:00
|
|
|
elm_object_part_content_set(layout, "elm.swallow.btn",
|
|
|
|
btn);
|
|
|
|
evas_object_show(win);
|
|
|
|
|
2015-08-26 21:03:54 -07:00
|
|
|
//Keygrabber
|
|
|
|
Evas_Object *keygrabber =
|
|
|
|
evas_object_rectangle_add(evas_object_evas_get(win));
|
|
|
|
evas_object_event_callback_add(keygrabber, EVAS_CALLBACK_KEY_DOWN,
|
|
|
|
keygrabber_key_down_cb, gd);
|
|
|
|
if (!evas_object_key_grab(keygrabber, "Escape", 0, 0, EINA_TRUE))
|
2015-11-17 09:39:22 -08:00
|
|
|
EINA_LOG_ERR(_("Failed to grab key - Escape"));
|
2015-08-26 21:03:54 -07:00
|
|
|
|
2016-01-22 02:30:29 -08:00
|
|
|
tools_goto_update();
|
2015-06-22 06:45:40 -07:00
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
gd->win = win;
|
|
|
|
gd->layout = layout;
|
2014-06-01 00:34:34 -07:00
|
|
|
gd->entry = entry;
|
2014-05-31 23:35:54 -07:00
|
|
|
gd->btn = btn;
|
2016-07-01 23:39:10 -07:00
|
|
|
gd->it = it;
|
2014-05-31 23:35:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Eina_Bool
|
2014-08-04 23:32:12 -07:00
|
|
|
goto_is_opened(void)
|
2014-05-31 23:35:54 -07:00
|
|
|
{
|
|
|
|
goto_data *gd = g_gd;
|
|
|
|
return (gd ? EINA_TRUE : EINA_FALSE);
|
|
|
|
}
|
|
|
|
|
2016-01-22 03:22:46 -08:00
|
|
|
Eina_Bool
|
2014-08-04 23:32:12 -07:00
|
|
|
goto_close(void)
|
2014-05-31 23:35:54 -07:00
|
|
|
{
|
|
|
|
goto_data *gd = g_gd;
|
2016-07-01 07:59:17 -07:00
|
|
|
if (!gd) return EINA_FALSE;
|
2015-06-22 06:45:40 -07:00
|
|
|
|
2014-05-31 23:35:54 -07:00
|
|
|
//Save last state
|
|
|
|
evas_object_geometry_get(gd->win, NULL, NULL, &win_w, &win_h);
|
|
|
|
elm_win_screen_position_get(gd->win, &win_x, &win_y);
|
|
|
|
evas_object_del(gd->win);
|
2015-09-17 06:56:37 -07:00
|
|
|
if (gd->timer)
|
|
|
|
ecore_timer_del(gd->timer);
|
2014-05-31 23:35:54 -07:00
|
|
|
free(gd);
|
|
|
|
g_gd = NULL;
|
2015-06-22 06:45:40 -07:00
|
|
|
|
2016-01-22 02:30:29 -08:00
|
|
|
tools_goto_update();
|
2016-01-22 03:22:46 -08:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
2014-05-31 23:35:54 -07:00
|
|
|
}
|