Enlightenment CVS committal
Author : moom
Project : e17
Module : apps/e
Dir : e17/apps/e/src/bin
Modified Files:
e_editable.c
Log Message:
* [Entry] The entry now works with UTF-8 char
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_editable.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- e_editable.c 22 Aug 2006 07:39:10 -0000 1.10
+++ e_editable.c 23 Aug 2006 09:41:19 -0000 1.11
@@ -43,6 +43,7 @@
static void _e_editable_selection_update(Evas_Object *editable);
static void _e_editable_text_update(Evas_Object *editable);
static void _e_editable_text_position_update(Evas_Object *editable, Evas_Coord
real_w);
+static int _e_editable_char_geometry_get_from_pos(Evas_Object *editable, int
utf_pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch);
static void _e_editable_smart_add(Evas_Object *object);
static void _e_editable_smart_del(Evas_Object *object);
@@ -689,7 +690,7 @@
* @param x the x coord, relative to the editable object
* @param y the y coord, relative to the editable object
* @return Returns the position where to place the cursor according to the
- * given coords, or -1 on failure
+ * given coords
*/
EAPI int
e_editable_pos_get_from_coords(Evas_Object *editable, Evas_Coord x, Evas_Coord
y)
@@ -700,12 +701,13 @@
Evas_Coord tx, ty, tw, th;
Evas_Coord cx, cw;
Evas_Coord canvas_x, canvas_y;
- int pos;
+ int index, pos, i, j;
+ const char *text;
if ((!editable) || (!(sd = evas_object_smart_data_get(editable))))
- return -1;
+ return 0;
if (!(text_obj = edje_object_part_object_get(sd->text_object,
"e.text.text")))
- return -1;
+ return 0;
evas_object_geometry_get(editable, &ox, &oy, NULL, NULL);
evas_object_geometry_get(text_obj, &tx, &ty, &tw, &th);
@@ -718,18 +720,30 @@
pos = sd->unicode_length;
else
{
- pos = evas_object_text_char_coords_get(text_obj,
+ index = evas_object_text_char_coords_get(text_obj,
canvas_x - tx, canvas_y - ty,
&cx, NULL, &cw, NULL);
- if (pos >= 0)
+ text = evas_object_text_text_get(text_obj);
+ if ((index >= 0) && (text))
{
if ((canvas_x - tx) > (cx + (cw / 2)))
- pos++;
+ index++;
+
+ i = 0;
+ j = -1;
+ pos = 0;
+ while ((i < index) && (j != i))
+ {
+ pos++;
+ j = i;
+ i = evas_string_char_next_get(text, i, NULL);
+ }
+
if (pos > sd->unicode_length)
pos = sd->unicode_length;
}
else
- pos = -1;
+ pos = 0;
}
return pos;
@@ -901,30 +915,12 @@
return;
evas_object_geometry_get(text_obj, &tx, &ty, NULL, NULL);
+ _e_editable_char_geometry_get_from_pos(editable, sd->cursor_pos,
+ &cx, &cy, NULL, &ch);
- if ((sd->unicode_length <= 0) || (sd->cursor_pos <= 0))
- {
- e_editable_char_size_get(editable, &cw, &ch);
- evas_object_move(sd->cursor_object, tx, ty);
- evas_object_resize(sd->cursor_object, 1, ch);
- }
- else
- {
- if (sd->cursor_pos >= sd->unicode_length)
- {
- evas_object_text_char_pos_get(text_obj, sd->unicode_length - 1,
- &cx, &cy, &cw, &ch);
- evas_object_move(sd->cursor_object, tx + cx + cw - 1, ty + cy);
- evas_object_resize(sd->cursor_object, 1, ch);
- }
- else
- {
- evas_object_text_char_pos_get(text_obj, sd->cursor_pos,
- &cx, &cy, &cw, &ch);
- evas_object_move(sd->cursor_object, tx + cx - 1, ty + cy);
- evas_object_resize(sd->cursor_object, 1, ch);
- }
- }
+ evas_object_move(sd->cursor_object, tx + cx, ty + cy);
+ /* TODO: cursor_width */
+ evas_object_resize(sd->cursor_object, 1, ch);
if (sd->cursor_visible && evas_object_visible_get(editable))
{
@@ -963,38 +959,14 @@
end_pos = (sd->cursor_pos >= sd->selection_pos) ?
sd->cursor_pos : sd->selection_pos;
- /* Position of the start cursor (note, the start cursor can not be at
- * the end of the editable object, and the editable object can not be
- * empty, or it would have returned before)*/
- if (!evas_object_text_char_pos_get(text_obj, start_pos,
- &cx, &cy, &cw, &ch))
- return;
-
- sx = tx + cx - 1;
+ _e_editable_char_geometry_get_from_pos(editable, start_pos,
+ &cx, &cy, NULL, NULL);
+ sx = tx + cx;
sy = ty + cy;
-
- /* Position of the end cursor (note, the editable object can not be
- * empty, or it would have returned before)*/
- if (end_pos >= sd->unicode_length)
- {
- if (!evas_object_text_char_pos_get(text_obj,
- sd->unicode_length - 1,
- &cx, &cy, &cw, &ch))
- return;
-
- sw = (tx + cx + cw - 1) - sx;
- sh = ch;
- }
- else
- {
- if (!evas_object_text_char_pos_get(text_obj, end_pos,
- &cx, &cy, &cw, &ch))
- return;
-
- sw = (tx + cx - 1) - sx;
- sh = ch;
- }
+ _e_editable_char_geometry_get_from_pos(editable, end_pos,
+ &cx, NULL, NULL, &sh);
+ sw = tx + cx - sx;
evas_object_move(sd->selection_object, sx, sy);
evas_object_resize(sd->selection_object, sw, sh);
@@ -1026,8 +998,7 @@
}
else
{
- edje_object_part_text_set(sd->text_object, "e.text.text",
- sd->text ? sd->text : "");
+ edje_object_part_text_set(sd->text_object, "e.text.text", sd->text);
}
edje_object_size_min_calc(sd->text_object, &minw, &minh);
@@ -1079,6 +1050,57 @@
}
}
+/* Gets the geometry of the char according to its utf-8 pos */
+static int
+_e_editable_char_geometry_get_from_pos(Evas_Object *editable, int utf_pos,
Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
+{
+ E_Editable_Smart_Data *sd;
+ Evas_Object *text_obj;
+ const char *text;
+ Evas_Coord x, w;
+ int index, i;
+ int last_pos;
+ int ret;
+
+ if (cx) *cx = 0;
+ if (cy) *cy = 0;
+ if (cw) *cw = 0;
+ if (ch) *ch = 0;
+
+ if ((!editable) || (!(sd = evas_object_smart_data_get(editable))))
+ return 0;
+ if (!(text_obj = edje_object_part_object_get(sd->text_object,
"e.text.text")))
+ return 0;
+
+ text = evas_object_text_text_get(text_obj);
+ if ((!text) || (sd->unicode_length <= 0) || (utf_pos <= 0))
+ {
+ if (cx) *cx = 0;
+ if (cy) *cy = 0;
+ e_editable_char_size_get(editable, cw, ch);
+ return 1;
+ }
+ else
+ {
+ if (utf_pos >= sd->unicode_length)
+ {
+ utf_pos = sd->unicode_length - 1;
+ last_pos = 1;
+ }
+ else
+ last_pos = 0;
+
+
+ index = 0;
+ for (i = 0; i < utf_pos; i++)
+ index = evas_string_char_next_get(text, index, NULL);
+
+ ret = evas_object_text_char_pos_get(text_obj, index, &x, cy, &w, ch);
+ if (cx) *cx = x - 1 + (last_pos ? w : 0);
+ if (cw) *cw = last_pos ? 1 : w;
+ return ret;
+ }
+}
/* Editable object's smart methods */
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs