right mouse pops up entry menu now too.

SVN revision: 58255
This commit is contained in:
Carsten Haitzler 2011-04-01 12:10:24 +00:00
parent 0b74203480
commit e6ba1dfbf1
1 changed files with 56 additions and 27 deletions

View File

@ -120,6 +120,7 @@ struct _Widget_Data
Eina_List *text_filters;
Ecore_Job *hovdeljob;
Mod_Api *api; // module api if supplied
int cursor_pos;
Eina_Bool changed : 1;
Eina_Bool linewrap : 1;
Eina_Bool char_linewrap : 1;
@ -136,7 +137,7 @@ struct _Widget_Data
Eina_Bool can_write : 1;
Eina_Bool autosave : 1;
Eina_Bool textonly : 1;
int cursor_pos;
Eina_Bool usedown : 1;
};
struct _Elm_Entry_Context_Menu_Item
@ -680,9 +681,20 @@ _hoversel_position(Evas_Object *obj)
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Coord cx, cy, cw, ch, x, y, mw, mh;
if (!wd) return;
cx = cy = 0;
cw = ch = 1;
evas_object_geometry_get(wd->ent, &x, &y, NULL, NULL);
edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text",
&cx, &cy, &cw, &ch);
if (wd->usedown)
{
cx = wd->downx - x;
cy = wd->downy - y;
cw = 1;
ch = 1;
}
else
edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text",
&cx, &cy, &cw, &ch);
evas_object_size_hint_min_get(wd->hoversel, &mw, &mh);
if (cw < mw)
{
@ -739,6 +751,7 @@ _dismissed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Widget_Data *wd = elm_widget_data_get(data);
if (!wd) return;
wd->usedown = 0;
if (wd->hoversel) evas_object_hide(wd->hoversel);
if (wd->selmode)
{
@ -843,46 +856,46 @@ _item_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED
if (it->func) it->func(it->data, obj2, NULL);
}
static Eina_Bool
_long_press(void *data)
static void
_menu_press(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(data);
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *top;
const Eina_List *l;
const Elm_Entry_Context_Menu_Item *it;
if (!wd) return ECORE_CALLBACK_CANCEL;
if (!wd) return;
if ((wd->api) && (wd->api->obj_longpress))
{
wd->api->obj_longpress(data);
wd->api->obj_longpress(obj);
}
else if (wd->context_menu)
{
const char *context_menu_orientation;
if (wd->hoversel) evas_object_del(wd->hoversel);
else elm_widget_scroll_freeze_push(data);
wd->hoversel = elm_hoversel_add(data);
else elm_widget_scroll_freeze_push(obj);
wd->hoversel = elm_hoversel_add(obj);
context_menu_orientation = edje_object_data_get
(wd->ent, "context_menu_orientation");
if ((context_menu_orientation) &&
(!strcmp(context_menu_orientation, "horizontal")))
elm_hoversel_horizontal_set(wd->hoversel, EINA_TRUE);
elm_object_style_set(wd->hoversel, "entry");
elm_widget_sub_object_add(data, wd->hoversel);
elm_widget_sub_object_add(obj, wd->hoversel);
elm_hoversel_label_set(wd->hoversel, "Text");
top = elm_widget_top_get(data);
top = elm_widget_top_get(obj);
if (top) elm_hoversel_hover_parent_set(wd->hoversel, top);
evas_object_smart_callback_add(wd->hoversel, "dismissed", _dismissed, data);
evas_object_smart_callback_add(wd->hoversel, "dismissed", _dismissed, obj);
if (!wd->selmode)
{
if (!wd->password)
elm_hoversel_item_add(wd->hoversel, E_("Select"), NULL, ELM_ICON_NONE,
_select, data);
_select, obj);
if (1) // need way to detect if someone has a selection
{
if (wd->editable)
elm_hoversel_item_add(wd->hoversel, E_("Paste"), NULL, ELM_ICON_NONE,
_paste, data);
_paste, obj);
}
}
else
@ -892,13 +905,13 @@ _long_press(void *data)
if (wd->have_selection)
{
elm_hoversel_item_add(wd->hoversel, E_("Copy"), NULL, ELM_ICON_NONE,
_copy, data);
_copy, obj);
if (wd->editable)
elm_hoversel_item_add(wd->hoversel, E_("Cut"), NULL, ELM_ICON_NONE,
_cut, data);
_cut, obj);
}
elm_hoversel_item_add(wd->hoversel, E_("Cancel"), NULL, ELM_ICON_NONE,
_cancel, data);
_cancel, obj);
}
}
EINA_LIST_FOREACH(wd->items, l, it)
@ -908,13 +921,21 @@ _long_press(void *data)
}
if (wd->hoversel)
{
_hoversel_position(data);
_hoversel_position(obj);
evas_object_show(wd->hoversel);
elm_hoversel_hover_begin(wd->hoversel);
}
edje_object_part_text_select_allow_set(wd->ent, "elm.text", EINA_FALSE);
edje_object_part_text_select_abort(wd->ent, "elm.text");
}
}
static Eina_Bool
_long_press(void *data)
{
Widget_Data *wd = elm_widget_data_get(data);
if (!wd) return ECORE_CALLBACK_CANCEL;
_menu_press(data);
wd->longpress_timer = NULL;
evas_object_smart_callback_call(data, SIG_LONGPRESSED, NULL);
return ECORE_CALLBACK_CANCEL;
@ -928,12 +949,13 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void
if (!wd) return;
if (wd->disabled) return;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if (ev->button != 1) return;
// if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
if (wd->longpress_timer) ecore_timer_del(wd->longpress_timer);
wd->longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _long_press, data);
wd->downx = ev->canvas.x;
wd->downy = ev->canvas.y;
if (ev->button == 1)
{
if (wd->longpress_timer) ecore_timer_del(wd->longpress_timer);
wd->longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _long_press, data);
}
}
static void
@ -943,11 +965,18 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
Evas_Event_Mouse_Up *ev = event_info;
if (!wd) return;
if (wd->disabled) return;
if (ev->button != 1) return;
if (wd->longpress_timer)
if (ev->button == 1)
{
ecore_timer_del(wd->longpress_timer);
wd->longpress_timer = NULL;
if (wd->longpress_timer)
{
ecore_timer_del(wd->longpress_timer);
wd->longpress_timer = NULL;
}
}
else if (ev->button == 3)
{
wd->usedown = 1;
_menu_press(data);
}
}