* [Editable] Improve e_editable_char_size_get()

* [Entry] Prepares the entry for copy/paste support but it's just not
possible for now


SVN revision: 24918
This commit is contained in:
moom 2006-08-19 20:29:02 +00:00 committed by moom
parent 004cab8539
commit b2e1c43afd
2 changed files with 48 additions and 22 deletions

View File

@ -744,24 +744,37 @@ e_editable_char_size_get(Evas_Object *editable, int *w, int *h)
{
int tw = 0, th = 0;
Evas *evas;
Evas_Object *text_obj;
E_Editable_Smart_Data *sd;
char *text = "Tout est bon dans l'abricot sauf le noyau!"
"Wakey wakey! Eggs and Bakey!";
const char *font, *font_source;
Evas_Text_Style_Type style;
int font_size;
if (w) *w = 0;
if (h) *h = 0;
if ((!editable) || (!(evas = evas_object_evas_get(editable))))
return;
if ((!(sd = evas_object_smart_data_get(editable))))
if (!(sd = evas_object_smart_data_get(editable)))
return;
if (!(text_obj = edje_object_part_object_get(sd->text_object, "text")))
return;
if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0))
{
/* TODO: 1st method */
edje_object_part_text_set(sd->text_object, "text", text);
edje_object_size_min_calc(sd->text_object, &tw, &th);
edje_object_part_text_set(sd->text_object, "text", sd->text ? sd->text : "NULL");
font_source = evas_object_text_font_source_get(text_obj);
evas_object_text_font_get(text_obj, &font, &font_size);
style = evas_object_text_style_get(text_obj);
text_obj = evas_object_text_add(evas);
evas_object_text_font_source_set(text_obj, font_source);
evas_object_text_font_set(text_obj, font, font_size);
evas_object_text_style_set(text_obj, style);
evas_object_text_text_set(text_obj, text);
evas_object_geometry_get(text_obj, NULL, NULL, &tw, &th);
evas_object_del(text_obj);
sd->average_char_w = tw / strlen(text);
sd->average_char_h = th;

View File

@ -282,6 +282,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
int start_pos, end_pos;
int selecting;
int changed = 0;
char *range;
if ((!obj) || (!(sd = evas_object_smart_data_get(obj))))
return;
@ -295,11 +296,6 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos;
selecting = (start_pos != end_pos);
/* TODO: CTRL + A, X, C, V */
if (!sd->enabled)
return;
/* Move the cursor/selection to the left */
if (strcmp(event->key, "Left") == 0)
{
@ -339,9 +335,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
}
}
/* Move the cursor/selection to the start of the entry */
else if ((strcmp(event->keyname, "Home") == 0) ||
((event->string) && (strlen(event->string) == 1) &&
(event->string[0] == 0x1)))
else if (strcmp(event->keyname, "Home") == 0)
{
e_editable_cursor_move_to_start(editable);
if (!evas_key_modifier_is_set(event->modifiers, "Shift"))
@ -349,9 +343,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
e_editable_cursor_pos_get(editable));
}
/* Move the cursor/selection to the end of the entry */
else if ((strcmp(event->keyname, "End") == 0) ||
((event->string) && (strlen(event->string) == 1) &&
(event->string[0] == 0x5)))
else if (strcmp(event->keyname, "End") == 0)
{
e_editable_cursor_move_to_end(editable);
if (!evas_key_modifier_is_set(event->modifiers, "Shift"))
@ -359,9 +351,7 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
e_editable_cursor_pos_get(editable));
}
/* Remove the previous character */
else if ((strcmp(event->keyname, "BackSpace") == 0) ||
((event->string) && (strlen(event->string) == 1) &&
(event->string[0] == 0x8)))
else if ((sd->enabled) && (strcmp(event->keyname, "BackSpace") == 0))
{
if (selecting)
changed = e_editable_delete(editable, start_pos, end_pos);
@ -369,15 +359,38 @@ _e_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
changed = e_editable_delete(editable, cursor_pos - 1, cursor_pos);
}
/* Remove the next character */
else if ((!strcmp(event->keyname, "Delete")) ||
((event->string) && (strlen(event->string) == 1) &&
(event->string[0] == 0x4)))
else if ((sd->enabled) && (strcmp(event->keyname, "Delete") == 0))
{
if (selecting)
changed = e_editable_delete(editable, start_pos, end_pos);
else
changed = e_editable_delete(editable, cursor_pos, cursor_pos + 1);
}
/* Ctrl + A,C,X,V */
else if (evas_key_modifier_is_set(event->modifiers, "Control"))
{
if (strcmp(event->keyname, "a") == 0)
e_editable_select_all(editable);
else if ((strcmp(event->keyname, "x") == 0) ||
(strcmp(event->keyname, "c") == 0))
{
if (selecting)
{
range = e_editable_text_range_get(editable, start_pos, end_pos);
if (range)
{
//ecore_x_selection_clipboard_set();
free(range);
}
if ((sd->enabled) && (strcmp(event->keyname, "x") == 0))
changed = e_editable_delete(editable, start_pos, end_pos);
}
}
else if (strcmp(event->keyname, "v") == 0)
{
//ecore_x_selection_clipboard_request();
}
}
/* Otherwise, we insert the corresponding character */
else if ((event->string) &&
((strlen(event->string) != 1) || (event->string[0] >= 0x20)))