Enlightenment CVS committal
Author : rbdpngn
Project : e17
Module : libs/ewl
Dir : e17/libs/ewl/src
Modified Files:
Ewl.h Makefile.am ewl_entry.c ewl_entry.h ewl_menu.c
ewl_menu.h ewl_text.c ewl_text.h
Removed Files:
ewl_textarea.c ewl_textarea.h
Log Message:
Minor theme changes.
Moved the textarea code to the text file since that matches the API.
A little work on real menus.
Ctrl-w word deletion support from Vincent Torri.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/Ewl.h,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -3 -r1.52 -r1.53
--- Ewl.h 13 May 2004 06:03:00 -0000 1.52
+++ Ewl.h 27 May 2004 20:15:16 -0000 1.53
@@ -329,7 +329,7 @@
#include <ewl_embed.h>
#include <ewl_window.h>
-#include <ewl_textarea.h>
+#include <ewl_text.h>
#include <ewl_entry.h>
#include <ewl_password.h>
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/Makefile.am,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -3 -r1.49 -r1.50
--- Makefile.am 21 May 2004 19:12:30 -0000 1.49
+++ Makefile.am 27 May 2004 20:15:16 -0000 1.50
@@ -47,7 +47,7 @@
ewl_spacer.h \
ewl_spectrum.h \
ewl_spinner.h \
- ewl_textarea.h \
+ ewl_text.h \
ewl_table.h \
ewl_tree.h \
ewl_tooltip.h \
@@ -95,7 +95,7 @@
ewl_spectrum.c \
ewl_spinner.c \
ewl_table.c \
- ewl_textarea.c \
+ ewl_text.c \
ewl_theme.c \
ewl_tree.c \
ewl_tooltip.c \
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_entry.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -3 -r1.90 -r1.91
--- ewl_entry.c 25 May 2004 14:22:10 -0000 1.90
+++ ewl_entry.c 27 May 2004 20:15:16 -0000 1.91
@@ -299,6 +299,11 @@
ewl_entry_delete_to_left(e);
else if (!strcmp(ev->keyname, "Delete"))
ewl_entry_delete_to_right(e);
+ else if (((!strcmp(ev->keyname, "w")) &&
+ (ev->modifiers & EWL_KEY_MODIFIER_CTRL)) ||
+ ((!strcmp(ev->keyname, "W")) &&
+ (ev->modifiers & EWL_KEY_MODIFIER_CTRL)))
+ ewl_entry_delete_to_word_begin(e);
else if (!strcmp(ev->keyname, "Return") || !strcmp(ev->keyname,
"KP_Return") || !strcmp(ev->keyname, "Enter")
|| !strcmp(ev->keyname, "KP_Enter")) {
@@ -720,7 +725,7 @@
if (!s)
DRETURN(DLEVEL_STABLE);
- if (!strlen(s) || ep == strlen(s) + 1)
+ if (!strlen(s) || sp == strlen(s) + 1)
DRETURN(DLEVEL_STABLE);
strcpy(&(s[sp - 1]), &(s[ep]));
@@ -735,6 +740,40 @@
}
void
+ewl_entry_delete_to_word_begin(Ewl_Entry * e)
+{
+ char *s;
+ int bp, index;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+ DCHECK_PARAM_PTR("e", e);
+
+ s = ewl_entry_get_text(e);
+ if (!s)
+ DRETURN(DLEVEL_STABLE);
+
+ bp = ewl_cursor_get_base_position(EWL_CURSOR(e->cursor));
+ index = bp-2;
+
+ while ((index-->0) && (s[index] == ' ')){}
+ if (index < 0)
+ index = 0;
+ while ((index-->0) && (s[index] != ' ')){}
+ index++;
+ strcpy(&(s[index]), &(s[bp]));
+ ewl_entry_set_text(e, s);
+
+ FREE(s);
+
+ if (index <= 0)
+ index = 1;
+ ewl_cursor_set_base(EWL_CURSOR(e->cursor), index);
+ ewl_widget_configure(EWL_WIDGET(e));
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+void
ewl_entry_child_show_cb(Ewl_Container * c, Ewl_Widget * w)
{
Ewl_Entry *e;
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_entry.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -3 -r1.34 -r1.35
--- ewl_entry.h 24 May 2004 19:25:20 -0000 1.34
+++ ewl_entry.h 27 May 2004 20:15:16 -0000 1.35
@@ -56,6 +56,7 @@
void ewl_entry_insert_text(Ewl_Entry * e, char *s);
void ewl_entry_delete_to_left(Ewl_Entry * e);
void ewl_entry_delete_to_right(Ewl_Entry * e);
+void ewl_entry_delete_to_word_begin(Ewl_Entry * e);
/*
* Internally used callbacks, override at your own risk.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_menu.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- ewl_menu.c 4 Apr 2004 22:28:14 -0000 1.16
+++ ewl_menu.c 27 May 2004 20:15:16 -0000 1.17
@@ -4,13 +4,12 @@
/**
* @param image: the image icon to use for this menu
* @param title: the text to place in the menu
+ * @return Returns a pointer to a new menu on success, NULL on failure.
* @brief Create a new internal menu
- *
- * @return Returns a new menu on success, NULL on failure.
*/
Ewl_Widget *ewl_menu_new(char *image, char *title)
{
- Ewl_Menu *menu;
+ Ewl_Menu *menu;
DENTER_FUNCTION(DLEVEL_STABLE);
@@ -27,7 +26,7 @@
/**
* @param menu: the menu to initialize
* @param image: the path to the icon image
- * @param title: the text label to be displayed
+ * @param title: the string displayed in the title
* @return Returns no value.
* @brief Initialize an internal menu to starting values
*/
@@ -41,61 +40,77 @@
* Initialize the defaults of the inherited fields.
*/
ewl_menu_base_init(EWL_MENU_BASE(menu), image, title);
- ewl_widget_set_appearance(EWL_WIDGET(menu), "menu");
+
+ ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_SELECT,
+ ewl_menu_expand_cb, NULL);
+ ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_CONFIGURE,
+ ewl_menu_configure_cb, NULL);
/*
- * The realize needs to create the pop-up.
+ * Create the popup menu portion of the widget.
*/
- ewl_callback_prepend(EWL_WIDGET(menu), EWL_CALLBACK_SELECT,
- ewl_menu_expand_cb, NULL);
+ menu->base.popup = ewl_window_new();
+ ewl_widget_set_internal(menu->base.popup, TRUE);
+ ewl_widget_set_layer(menu->base.popup, 1000);
+ ewl_widget_set_appearance(EWL_WIDGET(menu->base.popup), "menu");
+ ewl_box_set_orientation(EWL_BOX(menu->base.popup),
+ EWL_ORIENTATION_VERTICAL);
+ ewl_object_set_fill_policy(EWL_OBJECT(menu->base.popup),
+ EWL_FLAG_FILL_NONE);
+ ewl_object_set_alignment(EWL_OBJECT(menu->base.popup),
+ EWL_FLAG_ALIGN_LEFT | EWL_FLAG_ALIGN_TOP);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-
-void ewl_menu_expand_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+void ewl_menu_configure_cb(Ewl_Widget *w, void *ev_data, void *user_data)
{
- int x = 0, y = 0, xx = 0, yy = 0;
- Ewl_Menu *menu;
- Ewl_Embed *emb;
+ int x, y;
+ Ewl_Menu *menu = EWL_MENU(w);
+ Ewl_Embed *emb;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("w", w);
- menu = EWL_MENU(w);
emb = ewl_embed_find_by_widget(w);
- /*
- * Create the popup menu portion of the menu. Do this prior to
- * initializing the rest of the fields to avoid the add callback being
- * called.
- */
-
- menu->base.popup = ewl_window_new();
- ewl_window_set_borderless(EWL_WINDOW(menu->base.popup));
- ewl_object_set_fill_policy(EWL_OBJECT(menu->base.popup),
- EWL_FLAG_FILL_NONE);
+ if (ewl_widget_is_type(EWL_WIDGET(emb), "window"))
+ ewl_window_get_position(EWL_WINDOW(emb), &x, &y);
+ else {
+ x = CURRENT_X(w);
+ y = CURRENT_Y(w);
+ }
/*
* Position the popup menu relative to the menu.
*/
if (EWL_MENU_ITEM(w)->inmenu) {
- xx = CURRENT_X(w) + CURRENT_W(w);
- yy = CURRENT_Y(w);
- } else {
- xx = CURRENT_X(w);
- yy = CURRENT_Y(w) + CURRENT_H(w);
-
- ewl_object_set_minimum_size(EWL_OBJECT(menu->base.popup),
- CURRENT_W(menu),
- MINIMUM_H(menu->base.popup));
+ ewl_window_move(EWL_WINDOW(menu->base.popup),
+ x + CURRENT_W(w), y);
}
+ else {
+ ewl_window_move(EWL_WINDOW(menu->base.popup), x,
+ y + CURRENT_H(w));
+ }
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
- ewl_embed_coord_to_screen(emb, xx, yy, &x, &y);
- printf("Coords %d, %d, mapped to %d, %d\n", xx, yy, x, y);
+void ewl_menu_expand_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+{
+ Ewl_Menu *menu;
+ Ewl_Embed *emb;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ menu = EWL_MENU(w);
+
+ if (!REALIZED(menu->base.popup)) {
+ emb = ewl_embed_find_by_widget(w);
+ ewl_container_append_child(EWL_CONTAINER(emb),
+ menu->base.popup);
+ }
- ewl_widget_realize(EWL_WIDGET(menu->base.popup));
- ewl_window_move(EWL_WINDOW(menu->base.popup), x, y);
+ ewl_widget_show(menu->base.popup);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_menu.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ewl_menu.h 19 Nov 2003 20:18:34 -0000 1.6
+++ ewl_menu.h 27 May 2004 20:15:16 -0000 1.7
@@ -2,8 +2,9 @@
#define __EWL_MENU_H__
/**
- * @defgroup Ewl_Menu Menu: A Popup Menu
- * Provides a popup menu for displaying a list of options.
+ * @defgroup Ewl_Imenu Imenu: A Simple Internal Menu
+ * Defines a menu used internally. The contents on the menu are not drawn
+ * outside of the Evas.
*
* @{
*/
@@ -14,8 +15,7 @@
*/
/**
- * A simple popup menu widget, with the capability of being nested inside
- * another menu.
+ * A simple internal menu, it is limited to drawing within the current evas.
*/
typedef struct Ewl_Menu Ewl_Menu;
@@ -27,23 +27,24 @@
/**
* @struct Ewl_Menu
- * Inherits from Ewl_Menu_Base and adds on functionality for displaying a
- * pop-up menu that is in a window of it's own.
+ * Inherits from the Ewl_Menu_Base and does not extend the structure, but
+ * provides policy for drawing on the current evas.
*/
struct Ewl_Menu
{
- Ewl_Menu_Base base; /**< Inherit from Ewl_Menu_Base */
+ Ewl_Menu_Base base;
};
-Ewl_Widget *ewl_menu_new(char *image, char *title);
-void ewl_menu_init(Ewl_Menu * menu, char *image, char *title);
+Ewl_Widget *ewl_menu_new(char *image, char *title);
+void ewl_menu_init(Ewl_Menu * menu, char *image, char *title);
/*
* Internally used callbacks, override at your own risk.
*/
-void ewl_menu_expand_cb(Ewl_Widget * w, void *ev_data, void *user_data);
-void ewl_menu_item_clicked_cb(Ewl_Widget * w, void *ev_data, void *user_data);
-void ewl_menu_realize_cb(Ewl_Widget * w, void *ev_data, void *user_data);
+void ewl_menu_configure_cb(Ewl_Widget *w, void *ev_data,
+ void *user_data);
+void ewl_menu_expand_cb(Ewl_Widget * w, void *ev_data,
+ void *user_data);
/**
* @}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_text.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -3 -r1.61 -r1.62
--- ewl_text.c 13 May 2004 06:03:01 -0000 1.61
+++ ewl_text.c 27 May 2004 20:15:16 -0000 1.62
@@ -1,683 +1,752 @@
-
#include <Ewl.h>
-#include <Etox.h>
+
+static void ewl_text_ops_apply(Ewl_Text *ta);
+static void ewl_text_op_free(void *data);
+static Ewl_Text_Op *ewl_text_op_relevant_find(Ewl_Text *ta,
+ Ewl_Text_Op_Type type);
+static void ewl_text_update_size(Ewl_Text * ta);
+
+/*
+ * Private functions for applying operations to the text at realize time.
+ */
+static Ewl_Text_Op *ewl_text_op_color_new(Ewl_Text *ta, int r, int g, int b,
+ int a);
+static void ewl_text_op_color_apply(Ewl_Text *ta, Ewl_Text_Op *op);
+
+static Ewl_Text_Op *ewl_text_op_font_new(Ewl_Text *ta, char *font, int size);
+static void ewl_text_op_font_apply(Ewl_Text *ta, Ewl_Text_Op *op);
+static void ewl_text_op_font_free(void *op);
+
+static Ewl_Text_Op *ewl_text_op_style_new(Ewl_Text *ta, char *style);
+static void ewl_text_op_style_apply(Ewl_Text *ta, Ewl_Text_Op *op);
+static void ewl_text_op_style_free(void *op);
+
+static Ewl_Text_Op * ewl_text_op_align_new(Ewl_Text *ta, unsigned int align);
+static void ewl_text_op_align_apply(Ewl_Text *ta, Ewl_Text_Op *op);
/**
- * @param text: the text to display
- * @return Returns a pointer a new text widget on success, NULL on failure.
- * @brief Allocate a new text widget
+ * @param text: the initial text of the text
+ * @return Returns a pointer to a new text on success, NULL on failure.
+ * @brief Allocate a new text area widget
+ *
+ * Sets the text initially to @a text if not NULL.
*/
-Ewl_Widget *
-ewl_text_new(char *text)
+Ewl_Widget *ewl_text_new(char *text)
{
- Ewl_Text *t;
+ Ewl_Text *ta;
DENTER_FUNCTION(DLEVEL_STABLE);
- t = NEW(Ewl_Text, 1);
- if (!t)
+ ta = NEW(Ewl_Text, 1);
+ if (!ta)
DRETURN_PTR(NULL, DLEVEL_STABLE);
- ewl_text_init(t, text);
+ ewl_text_init(ta, text);
- DRETURN_PTR(EWL_WIDGET(t), DLEVEL_STABLE);
+ DRETURN_PTR(EWL_WIDGET(ta), DLEVEL_STABLE);
}
/**
- * @param t: the text widget to initialize to default values and callbacks
- * @param text: the text to display
+ * @param ta: the text area to be initialized
+ * @param text: the text to be displayed initially in the text area
* @return Returns no value.
- * @brief Initialize a text widget to default values and callbacks
+ * @brief Initialize the fields and callbacks of a text area
*
- * Sets the fields and callbacks of the text widget @a t to their defaults.
+ * Sets the internal fields and callbacks of a text area to their defaults.
*/
-void
-ewl_text_init(Ewl_Text * t, char *text)
+void ewl_text_init(Ewl_Text * ta, char *text)
{
- Ewl_Widget *w;
+ Ewl_Widget *w;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
+ DCHECK_PARAM_PTR("ta", ta);
- w = EWL_WIDGET(t);
+ w = EWL_WIDGET(ta);
- ewl_widget_init(w, "text");
+ ewl_widget_init(EWL_WIDGET(w), "text");
ewl_object_set_fill_policy(EWL_OBJECT(w), EWL_FLAG_FILL_NONE);
- t->text = (text ? strdup(text) : strdup(""));
- t->length = strlen(t->text);
- t->align = EWL_FLAG_ALIGN_TOP | EWL_FLAG_ALIGN_LEFT;
-
- /*
- * Set up appropriate callbacks for specific events
- */
- ewl_callback_append(w, EWL_CALLBACK_REALIZE, ewl_text_realize_cb, NULL);
- ewl_callback_prepend(w, EWL_CALLBACK_UNREALIZE, ewl_text_unrealize_cb,
- NULL);
- ewl_callback_append(w, EWL_CALLBACK_CONFIGURE, ewl_text_configure_cb,
+ ewl_callback_append(w, EWL_CALLBACK_REALIZE, ewl_text_realize_cb,
NULL);
+ ewl_callback_append(w, EWL_CALLBACK_UNREALIZE,
+ ewl_text_unrealize_cb, NULL);
+ ewl_callback_append(w, EWL_CALLBACK_DESTROY,
+ ewl_text_destroy_cb, NULL);
ewl_callback_append(w, EWL_CALLBACK_REPARENT, ewl_text_reparent_cb,
NULL);
+ ewl_callback_append(w, EWL_CALLBACK_CONFIGURE,
+ ewl_text_configure_cb, NULL);
+
+ ta->ops = ecore_dlist_new();
+ ta->applied = ecore_dlist_new();
+
+ ecore_dlist_set_free_cb(ta->ops, ewl_text_op_free);
+ ecore_dlist_set_free_cb(ta->applied, ewl_text_op_free);
- t->r = 255;
- t->g = 255;
- t->b = 255;
- t->a = 255;
+ if (text)
+ ewl_text_text_set(ta, text);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to set the text
- * @param text: the new text for the text widget @a t
+ * @param ta: the text area widget to set the text
+ * @param text: the text to set in the text area widget @a ta
* @return Returns no value.
- * @brief Set the text of a text widget
+ * @brief Set the text of a text area widget
*
- * Sets the text of the text widget @a t to @a text.
+ * Sets the text of the text area widget @a ta to a copy of the contents of
+ * @a text.
*/
-void
-ewl_text_set_text(Ewl_Text * t, char *text)
+void ewl_text_text_set(Ewl_Text * ta, char *text)
{
- Ewl_Widget *w;
- char *evdata = NULL;
-
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
+ DCHECK_PARAM_PTR("ta", ta);
- w = EWL_WIDGET(t);
-
- if ((text == t->text) || (text && t->text && !strcmp(t->text, text)))
- DRETURN(DLEVEL_STABLE);
-
- IF_FREE(t->text);
-
- /*
- * Set the text to the value that was passed in, or an empty string if
- * NULL was passed in.
- */
- if (text == NULL)
- t->text = strdup("");
- else
- t->text = strdup(text);
+ if (text) {
+ /*
+ * Keep a copy of the text for quick access and for creating
+ * the etox when needed.
+ */
+ ta->text = strdup(text);
+ ta->length = strlen(text);
+ }
+ else {
+ ta->text = NULL;
+ ta->length = 0;
+ }
/*
- * Update the etox if it's been realized at this point.
+ * Update the etox and the sizing of the text widget.
*/
- if (t->etox) {
- Evas_Coord x, y, width, height;
-
- etox_set_text(t->etox, t->text);
- t->length = etox_get_length(t->etox);
- evas_object_geometry_get(t->etox, &x, &y, &width, &height);
- ewl_object_set_preferred_size(EWL_OBJECT(t),
- (int)(width), (int)(height));
+ if (ta->etox) {
+ etox_set_text(ta->etox, text);
+ ewl_text_update_size(ta);
}
- else
- t->length = strlen(t->text);
-
- evdata = strdup(t->text);
- ewl_callback_call_with_event_data(w, EWL_CALLBACK_VALUE_CHANGED,
- evdata);
- FREE(evdata);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to retrieve the text
- * @return Returns a copy of text in @a t on success, NULL on failure.
+ * @param ta: the text widget to retrieve text contents
+ * @return Returns a copy of the text in @a ta on success, NULL on failure.
* @brief Retrieve the text of a text widget
*/
-char *
-ewl_text_get_text(Ewl_Text * t)
+char *ewl_text_text_get(Ewl_Text * ta)
{
- Ewl_Widget *w;
+ char *txt = NULL;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, NULL);
+ DCHECK_PARAM_PTR_RET("ta", ta, NULL);
- w = EWL_WIDGET(t);
+ if (ta->etox)
+ txt = etox_get_text(ta->etox);
+ else if (ta->text)
+ txt = strdup(ta->text);
- DRETURN_PTR(t->text ? strdup(t->text) : NULL, DLEVEL_STABLE);
+ DRETURN_PTR(txt, DLEVEL_STABLE);
}
/**
- * @param t: the text widget to set the font
- * @param f: the name of the font to use for the text widget
- * @return Returns no value.
- * @brief Set the font of a text widget
- *
- * Sets the name of the font for text widget @a t to @a f and
- * updates the display to use that font.
+ * @param ta: the text widget to retrieve length
+ * @return Returns the length of the text contained in the widget.
+ * @brief Retrieve the length of the text displayed by the text widget.
*/
-void
-ewl_text_set_font(Ewl_Text * t, char *f)
+int ewl_text_length_get(Ewl_Text *ta)
{
- Ewl_Widget *w;
-
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
- DCHECK_PARAM_PTR("f", f);
-
- w = EWL_WIDGET(t);
+ DCHECK_PARAM_PTR_RET("ta", ta, 0);
- IF_FREE(t->font);
-
- t->font = strdup(f);
- t->overrides |= EWL_TEXT_OVERRIDE_FONT;
-
- /*
- * Change the font for the etox.
- */
- if (t->etox) {
- Evas_Coord x, y, width, height;
-
- /*
- * Change the font and then update the size of the widget
- */
- etox_context_set_font(t->context, t->font, t->font_size);
- etox_set_text(t->etox, t->text);
- evas_object_geometry_get(t->etox, &x, &y, &width, &height);
- ewl_object_set_preferred_size(EWL_OBJECT(t),
- (int)(width), (int)(height));
- }
-
- ewl_widget_configure(w);
-
- DLEAVE_FUNCTION(DLEVEL_STABLE);
+ DRETURN_INT(ta->length, DLEVEL_STABLE);
}
/**
- * @param t: the text widget to get the font
- * @return Returns a copy of the font used by @a t on success, NULL on failure.
- * @brief Retrieve the font used by a text widget
+ * @param ta: the text widget to change color
+ * @param r: the new red value
+ * @param g: the new green value
+ * @param b: the new blue value
+ * @param a: the new alpha value
+ * @brief Changes the currently applied color of the text to specified values
+ * @return Returns no value.
*/
-char *
-ewl_text_get_font(Ewl_Text * t)
+void ewl_text_color_set(Ewl_Text *ta, int r, int g, int b, int a)
{
- Ewl_Widget *w;
+ Ewl_Text_Op *op;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, NULL);
+ DCHECK_PARAM_PTR("ta", ta);
- w = EWL_WIDGET(t);
+ op = ewl_text_op_color_new(ta, r, g, b, a);
+ ecore_dlist_append(ta->ops, op);
+ if (REALIZED(ta))
+ ewl_text_ops_apply(ta);
- DRETURN_PTR(t->font ? strdup(t->font) : NULL, DLEVEL_STABLE);
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to set the font size
- * @param s: the font size to use for the text widget
+ * @param ta: the text widget to change font
+ * @param font: the name of the font
+ * @param size: the size of the font
+ * @brief Changes the currently applied font of the text to specified values
* @return Returns no value.
- * @brief Set the font size of a text widget
- *
- * Sets the font size for text widget @a t to @a s.
*/
-void
-ewl_text_set_font_size(Ewl_Text * t, int s)
+void ewl_text_font_set(Ewl_Text *ta, char *font, int size)
{
- Ewl_Widget *w;
+ Ewl_Text_Op *op;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
+ DCHECK_PARAM_PTR("ta", ta);
- w = EWL_WIDGET(t);
-
- t->font_size = s;
- t->overrides |= EWL_TEXT_OVERRIDE_SIZE;
-
- /*
- * Change the font for the etox.
- */
- if (t->etox) {
- Evas_Coord x, y, width, height;
-
- /*
- * Change the font and then update the size of the widget
- */
- etox_context_set_font(t->context, t->font, t->font_size);
- evas_object_geometry_get(t->estyle, &x, &y, &width, &height);
- ewl_object_set_preferred_size(EWL_OBJECT(t),
- (int)(width), (int)(height));
- }
-
- ewl_widget_configure(w);
+ op = ewl_text_op_font_new(ta, font, size);
+ ecore_dlist_append(ta->ops, op);
+ if (REALIZED(ta))
+ ewl_text_ops_apply(ta);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to retrieve the font size
- * @return Returns the font size of the text widget on success, 0 on failure.
- * @brief Retrieve the font size of a text widget
+ * @param ta: the text widget to change font
+ * @param font: the name of the font
+ * @param size: the size of the font
+ * @brief Changes the currently applied font of the text to specified values
+ * @return Returns no value.
*/
-int
-ewl_text_get_font_size(Ewl_Text * t)
+char *ewl_text_font_get(Ewl_Text *ta)
{
- Ewl_Widget *w;
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Font *opf;
+ char *font = NULL;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, 0);
+ DCHECK_PARAM_PTR_RET("ta", ta, NULL);
- w = EWL_WIDGET(t);
+ op = ewl_text_op_relevant_find(ta, EWL_TEXT_OP_TYPE_FONT_SET);
+ opf = (Ewl_Text_Op_Font *)op;
+ if (opf && opf->font) {
+ font = strdup(opf->font);
+ }
- DRETURN_INT(t->font_size, DLEVEL_STABLE);
+ DRETURN_PTR(font, DLEVEL_STABLE);
}
/**
- * @param t: the text widget to set the color
- * @param r: the red value for the color
- * @param g: the green value for the color
- * @param b: the blue value for the color
- * @param a: the alpha value for the color
+ * @param ta: the text widget to change style
+ * @param style: the name of the style
+ * @brief Changes the currently applied style of the text to specified values
* @return Returns no value.
- * @brief Set the color of the text for a text widget
- *
- * Sets the color of the text in the text widget @a t to the new color values
- * specified.
*/
-void
-ewl_text_set_color(Ewl_Text * t, int r, int g, int b, int a)
+void ewl_text_style_set(Ewl_Text *ta, char *style)
{
- Ewl_Widget *w;
+ Ewl_Text_Op *op;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
-
- w = EWL_WIDGET(t);
+ DCHECK_PARAM_PTR("ta", ta);
- if (t->estyle)
- evas_object_color_set(t->estyle, r, g, b, a);
-
- t->r = r;
- t->g = g;
- t->b = b;
- t->a = a;
- t->overrides |= EWL_TEXT_OVERRIDE_COLOR;
-
- ewl_widget_configure(w);
+ op = ewl_text_op_style_new(ta, style);
+ ecore_dlist_append(ta->ops, op);
+ if (REALIZED(ta))
+ ewl_text_ops_apply(ta);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to get the color
- * @param r: a pointer to the integer to store the red value
- * @param g: a pointer to the integer to store the green value
- * @param b: a pointer to the integer to store the blue value
- * @param a: a pointer to the integer to store the alpha value
- * @return Returns no value.
- * @brief Get the color of the text in a text widget
- *
- * Stores the color values into any non-NULL color pointers.
+ * @param ta: the text widget to get the current style
+ * @brief Retrieves the currently used text style from a text widget.
+ * @return Returns the currently used text style.
*/
-void
-ewl_text_get_color(Ewl_Text * t, int *r, int *g, int *b, int *a)
+char *ewl_text_style_get(Ewl_Text *ta)
{
- Ewl_Widget *w;
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Style *ops;
+ char *style = NULL;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
+ DCHECK_PARAM_PTR_RET("ta", ta, NULL);
- w = EWL_WIDGET(t);
+ op = ewl_text_op_relevant_find(ta, EWL_TEXT_OP_TYPE_FONT_SET);
+ ops = (Ewl_Text_Op_Style *)op;
+ if (ops && ops->style) {
+ style = strdup(ops->style);
+ }
- if (!r)
- *r = t->r;
+ DRETURN_PTR(style, DLEVEL_STABLE);
+}
- if (!g)
- *g = t->g;
+/**
+ * @param ta: the text widget to change alignment
+ * @param align: the new alignment of the text widget
+ * @brief Changes the currently applied alignment of the text to specified value
+ * @return Returns no value.
+ */
+void ewl_text_align_set(Ewl_Text *ta, unsigned int align)
+{
+ Ewl_Text_Op *op;
- if (!b)
- *b = t->b;
+ DENTER_FUNCTION(DLEVEL_STABLE);
+ DCHECK_PARAM_PTR("ta", ta);
- if (!a)
- *a = t->a;
+ op = ewl_text_op_align_new(ta, align);
+ ecore_dlist_append(ta->ops, op);
+ if (REALIZED(ta))
+ ewl_text_ops_apply(ta);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
/**
- * @param t: the text widget to set the text style
- * @param s: the name of the style to be set for the text
- * @brief Set the text style for a text widget
- *
- * @return Returns no value.
- * Changes the text style of the text widget @a t to the style identified by the
- * name @a s.
+ * @param ta: the text widget to get the current alignment
+ * @brief Retrieves the currently used text alignment from a text widget.
+ * @return Returns the currently used text alignment.
*/
-void
-ewl_text_set_style(Ewl_Text * t, char *s)
+unsigned int ewl_text_align_get(Ewl_Text *ta)
{
- Ewl_Widget *w;
+ unsigned int align = 0;
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Align *opa;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
-
- w = EWL_WIDGET(t);
- t->style = strdup(s);
+ DCHECK_PARAM_PTR_RET("ta", ta, NULL);
- /*
- * Change the font for the estyle.
- */
- if (t->estyle) {
- Evas_Coord x, y, width, height;
-
- /*
- * Change the font and then update the size of the widget
- */
- estyle_set_style(t->estyle, t->style);
- evas_object_geometry_get(t->estyle, &x, &y, &width, &height);
- ewl_object_set_preferred_size(EWL_OBJECT(t),
- (int)(width), (int)(height));
+ op = ewl_text_op_relevant_find(ta, EWL_TEXT_OP_TYPE_FONT_SET);
+ opa = (Ewl_Text_Op_Align *)op;
+ if (opa) {
+ align = opa->align;
}
- t->overrides |= EWL_TEXT_OVERRIDE_STYLE;
-
- ewl_widget_configure(w);
- DLEAVE_FUNCTION(DLEVEL_STABLE);
+ DRETURN_INT(align, DLEVEL_STABLE);
}
-/**
- * @param t: the text widget to retrieve geometry
- * @param xx: a pointer to an integer to store the x coordinate
- * @param yy: a pointer to an integer to store the y coordinate
- * @param ww: a pointer to an integer to store the width
- * @param hh: a pointer to an integer to store the height
- * @return Returns no value.
- * @brief Retrieve the geometry of a text widget
- *
- * Stores the position and size of the text in the text
- * widget @a t into the integers pointed to by @a xx, @a yy, @a ww, and @a hh
- * respectively.
- */
-void
-ewl_text_get_text_geometry(Ewl_Text * t, int *xx, int *yy, int *ww, int *hh)
+static Ewl_Text_Op *
+ewl_text_op_relevant_find(Ewl_Text *ta, Ewl_Text_Op_Type type)
{
- Evas_Coord ex, ey, ew, eh;
+ Ecore_DList *l;
+ void *(*traverse)(Ecore_DList *l);
+ Ewl_Text_Op *op = NULL;
+
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
- /*
- * Need to check if the estyle has been created yet, it may won't be if
- * the widget has not yet been realized.
- */
- if (t->estyle) {
- evas_object_geometry_get(t->estyle, &ex, &ey, &ew, &eh);
- *xx = (int)(ex);
- *yy = (int)(ey);
- *ww = (int)(ew);
- *hh = (int)(eh);
+ if (REALIZED(ta)) {
+ l = ta->applied;
+ ecore_dlist_goto_first(l);
+ traverse = ecore_dlist_next;
}
else {
- *xx = CURRENT_X(t);
- *yy = CURRENT_Y(t);
- *ww = CURRENT_W(t);
- *hh = CURRENT_H(t);
+ l = ta->ops;
+ ecore_dlist_goto_last(l);
+ traverse = ecore_dlist_previous;
}
- DLEAVE_FUNCTION(DLEVEL_STABLE);
+ while ((op = traverse(ta->ops)))
+ if (op->type == type)
+ break;
+
+ DRETURN_PTR(op, DLEVEL_STABLE);
}
/**
- * @brief Retrieve the length of the text in the widget
- * @param t: the text widget to retrieve text length
- *
- * Returns the length of the text enclosed in the widget @a t.
+ * @param ta: the text widget to map a coordinate to a character index
+ * @param x: the x coordinate over the desired character
+ * @param y: the y coordinate over the desired character
+ * @brief Finds the index of the character under the specified coordinates
+ * @return Returns the index of the found character on success, 0 otherwise.
*/
-inline int ewl_text_get_length(Ewl_Text *t)
+int ewl_text_coord_index_map(Ewl_Text *ta, int x, int y)
{
+ int index;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, 0);
+ DCHECK_PARAM_PTR_RET("ta", ta, 0);
- DRETURN_INT(t->length, DLEVEL_STABLE);
+ if (!ta->etox)
+ DRETURN_INT(0, DLEVEL_STABLE);
+
+ index = etox_coord_to_index(ta->etox, (Evas_Coord)(x), (Evas_Coord)(y));
+ DRETURN_INT(index, DLEVEL_STABLE);
}
/**
- * @param t: the widget that holds the text to retrieve a letters geometry
- * @param i: the index of the letter in the text to retrieve geometry
- * @param xx: a pointer to an integer to store the x coordinate of the letter
- * @param yy: a pointer to an integer to store the y coordinate of the letter
- * @param ww: a pointer to an integer to store the width of the letter
- * @param hh: a pointer to an integer to store the height of the letter
+ * @param ta: the text widget to map index to character geometry
+ * @param index: character index to be mapped
+ * @param x: pointer to store determined character x coordinate
+ * @param y: pointer to store determined character y coordinate
+ * @param w: pointer to store determined character width
+ * @param h: pointer to store determined character height
* @return Returns no value.
- * @brief Retrieve the geomtry of a specific letter
+ * @brief Maps a character index to a set of coordinates and sizes.
*
- * Stores the geometry of the letter at index @a i of the text
- * widget @a t into @a xx, @a yy, @a ww, and @a hh respectively.
+ * Any of the coordinate parameters may be NULL, they will be ignored. If the
+ * index fails to map successfully, the values at the locations pointed to by
+ * the coordinate pointers will not be altered. This function can only succeed
+ * after the text widget has been realized.
*/
-void
-ewl_text_get_letter_geometry(Ewl_Text * t, int i, int *xx, int *yy,
- int *ww, int *hh)
+void ewl_text_index_geometry_map(Ewl_Text *ta, int index, int *x, int *y,
+ int *w, int *h)
{
- Evas_Coord ex = 0, ey = 0, ew = 0, eh = 0;
- Ewl_Widget *w;
+ Evas_Coord tx, ty, tw, th;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
-
- w = EWL_WIDGET(t);
-
- if (t->estyle) {
- estyle_text_at(t->estyle, i, &ex, &ey, &ew, &eh);
- }
+ if (!ta->etox)
+ DRETURN(DLEVEL_STABLE);
- if (xx)
- *xx = (int)(ex);
- if (yy)
- *yy = (int)(ey);
- if (ww)
- *ww = (int)(ew);
- if (hh)
- *hh = (int)(eh);
+ etox_index_to_geometry(ta->etox, index, &tx, &ty, &tw, &th);
+ if (x)
+ *x = (int)(tx);
+ if (y)
+ *y = (int)(ty);
+ if (w)
+ *w = (int)(tw);
+ if (h)
+ *h = (int)(th);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-/**
- * @param t: the text widget to get the letter geometry by coordinates
- * @param x: the x coordinate to check for letter geometry
- * @param y: the y coordinate to check for letter geometry
- * @param tx: the x coordinate of the letter that intersects @a x, @a y
- * @param ty: the y coordinate of the letter that intersects @a x, @a y
- * @param tw: the width of the letter that intersects @a x, @a y
- * @param th: the height of the letter that intersects @a x, @a y
- * @brief Get the letter geometry at coordinates
- *
- * @return Returns no value.
- * Stores the geometry of a letter at specified coordinates
- * @a x, @a y of text widget @a t into @a tx, @a ty, @a tw, and @a th.
- */
-int
-ewl_text_get_letter_geometry_at(Ewl_Text * t, int x, int y,
- int *tx, int *ty, int *tw, int *th)
+void ewl_text_realize_cb(Ewl_Widget * w, void *ev_data, void *user_data)
{
- Evas_Coord ex = 0, ey = 0, ew = 0, eh = 0;
- int i = 0;
- Ewl_Widget *w;
+ char *tmp;
+ Ewl_Text *ta;
+ Ewl_Embed *emb;
+ int r, g, b, a;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, 0);
+ DCHECK_PARAM_PTR("w", w);
- w = EWL_WIDGET(t);
+ ta = EWL_TEXT(w);
+ /*
+ * Find the embed so we know which evas to draw onto.
+ */
+ emb = ewl_embed_find_by_widget(w);
- if (t->estyle) {
- i = estyle_text_at_position(t->estyle, (Evas_Coord)(x),
- (Evas_Coord)(y), &ex, &ey, &ew, &eh);
- }
+ /*
+ * Create the etox
+ */
+ ta->etox = etox_new(emb->evas);
+ ta->context = etox_get_context(ta->etox);
- if (tx)
- *tx = (int)(ex);
- if (ty)
- *ty = (int)(ey);
- if (tw)
- *tw = (int)(ew);
- if (th)
- *th = (int)(eh);
+ tmp = ewl_theme_data_get_str(w, "font");
+ etox_context_set_font(ta->context, tmp,
+ ewl_theme_data_get_int(w, "font_size"));
+ IF_FREE(tmp);
+
+ tmp = ewl_theme_data_get_str(w, "style");
+ etox_context_set_style(ta->context, tmp);
+ IF_FREE(tmp);
+
+ r = ewl_theme_data_get_int(w, "color/r");
+ g = ewl_theme_data_get_int(w, "color/g");
+ b = ewl_theme_data_get_int(w, "color/b");
+ a = ewl_theme_data_get_int(w, "color/a");
+ etox_context_set_color(ta->context, r, g, b, a);
- DRETURN_INT(i, DLEVEL_STABLE);
+ if (w->fx_clip_box)
+ evas_object_clip_set(ta->etox, w->fx_clip_box);
+
+ /*
+ * Now set the text and display it.
+ */
+ etox_set_text(ta->etox, ta->text);
+ evas_object_show(ta->etox);
+
+ ewl_text_ops_apply(ta);
+
+ /*
+ * Update the size of the text
+ */
+ ewl_text_update_size(ta);
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-/**
- * @param t: the text widget to change text alignment
- * @param a: the new alignment for the text in @a t
- * @return Returns no value.
- * @brief Set the alignment of the text in a text widget
- *
- * Changes the alignment of the text in @a t to @a a.
- */
-void
-ewl_text_set_alignment(Ewl_Text * t, unsigned int a)
+static void ewl_text_ops_apply(Ewl_Text *ta)
{
+ Ewl_Text_Op *op;
+
+ while ((op = ecore_dlist_remove_first(ta->ops))) {
+ op->apply(ta, op);
+ ecore_dlist_append(ta->applied, op);
+ }
+}
+
+static void ewl_text_op_free(void *data)
+{
+ Ewl_Text_Op *op = data;
+ if (op->free)
+ op->free(op);
+ else
+ FREE(op)
+}
+
+void ewl_text_unrealize_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+{
+ Ewl_Text *ta;
+
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("t", t);
+ DCHECK_PARAM_PTR("w", w);
- ewl_object_set_alignment(EWL_OBJECT(t), a);
+ ta = EWL_TEXT(w);
- ewl_widget_configure(EWL_WIDGET(t));
+ evas_object_clip_unset(ta->etox);
+ evas_object_del(ta->etox);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-/**
- * @param t: the text widget to find the letter index by coordinates
- * @param x: the x coordinate to check for the letter index
- * @param y: the y coordinate to check for the letter index
- * @return Returns the index of the letter at the coordinates.
- * @brief Get the index of the letter at coordinates
- */
-int
-ewl_text_get_index_at(Ewl_Text * t, int x, int y)
+void ewl_text_destroy_cb(Ewl_Widget * w, void *ev_data, void *user_data)
{
- Ewl_Widget *w;
+ Ewl_Text *ta;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR_RET("t", t, 0);
+ DCHECK_PARAM_PTR("w", w);
+
+ ta = EWL_TEXT(w);
+ ecore_dlist_destroy(ta->ops);
+ ta->ops = NULL;
- w = EWL_WIDGET(t);
+ ecore_dlist_destroy(ta->applied);
+ ta->applied = NULL;
- DRETURN_INT(t->
- estyle ? estyle_text_at_position(t->estyle,
- (Evas_Coord)(x),
- (Evas_Coord)(y),
- NULL, NULL, NULL, NULL) :
- 0, DLEVEL_STABLE);
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-void
-ewl_text_realize_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+void ewl_text_reparent_cb(Ewl_Widget * w, void *ev_data, void *user_data)
{
- Ewl_Text *t;
- Ewl_Embed *emb;
- Evas_Coord x, y, width, height;
+ Ewl_Text *ta;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ ta = EWL_TEXT(w);
+ if (ta->etox)
+ evas_object_layer_set(ta->etox, ewl_widget_get_layer_sum(w));
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+void ewl_text_configure_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+{
+ Ewl_Text *ta;
DENTER_FUNCTION(DLEVEL_STABLE);
DCHECK_PARAM_PTR("w", w);
- t = EWL_TEXT(w);
- emb = ewl_embed_find_by_widget(w);
- t->estyle = estyle_new(emb->evas, t->text, t->style);
+ ta = EWL_TEXT(w);
/*
- * Set the correct font and size.
+ * Update the etox position and size.
*/
- if (!t->font) {
- /*
- * Setup the default font.
- */
- t->font = ewl_theme_data_get_str(w, "font");
- t->font_size = ewl_theme_data_get_int(w, "font_size");
+ if (ta->etox) {
+ evas_object_move(ta->etox, CURRENT_X(w), CURRENT_Y(w));
+ evas_object_layer_set(ta->etox, ewl_widget_get_layer_sum(w));
}
- estyle_set_font(t->estyle, t->font, t->font_size);
-
- if (!t->style)
- t->style = ewl_theme_data_get_str(w, "style");
-
- estyle_set_style(t->estyle, t->style);
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
- if (!(t->overrides & EWL_TEXT_OVERRIDE_COLOR)) {
- t->r = ewl_theme_data_get_int(w, "color/r");
- t->g = ewl_theme_data_get_int(w, "color/g");
- t->b = ewl_theme_data_get_int(w, "color/b");
- t->a = ewl_theme_data_get_int(w, "color/a");
- }
+/*
+ * Set the size of the text area to the size of the etox.
+ */
+static void ewl_text_update_size(Ewl_Text * ta)
+{
+ Evas_Coord x, y, width, height;
/*
- * Set move it into the correct position.
+ * Adjust the properties of the widget to indicate the size of the text.
*/
- evas_object_color_set(t->estyle, t->r, t->g, t->b, t->a);
+ evas_object_geometry_get(ta->etox, &x, &y, &width, &height);
+ if (!width)
+ width = 1;
+ if (!height)
+ height = 1;
/*
- * Adjust the clip box for the estyle and then display it.
+ * Set the preferred size to the size of the etox and request that
+ * size for the widget.
*/
- if (w->fx_clip_box)
- evas_object_clip_set(t->estyle, w->fx_clip_box);
- evas_object_layer_set(t->estyle, ewl_widget_get_layer_sum(w));
- evas_object_show(t->estyle);
-
- evas_object_geometry_get(t->estyle, &x, &y, &width, &height);
- ewl_object_set_preferred_size(EWL_OBJECT(t), (int)(width),
+ ewl_object_set_preferred_size(EWL_OBJECT(ta), (int)(width),
(int)(height));
+}
- DLEAVE_FUNCTION(DLEVEL_STABLE);
+static Ewl_Text_Op *
+ewl_text_op_color_new(Ewl_Text *ta, int r, int g, int b, int a)
+{
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Color *opc;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ op = NEW(Ewl_Text_Op_Color, 1);
+ if (op) {
+ opc = (Ewl_Text_Op_Color *)op;
+ op->type = EWL_TEXT_OP_TYPE_COLOR_SET;
+ op->apply = ewl_text_op_color_apply;
+ op->free = free;
+ opc->r = r;
+ opc->g = g;
+ opc->b = b;
+ opc->a = a;
+ }
+
+ DRETURN_PTR(op, DLEVEL_STABLE);
}
-void
-ewl_text_unrealize_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+static void
+ewl_text_op_color_apply(Ewl_Text *ta, Ewl_Text_Op *op)
{
- Ewl_Text *t;
+ int or, og, ob, oa;
+ Ewl_Text_Op_Color *opc = (Ewl_Text_Op_Color *)op;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("w", w);
- t = EWL_TEXT(w);
+ etox_context_get_color(ta->context, &or, &og, &ob, &oa);
+ etox_context_set_color(ta->context, opc->r, opc->g, opc->b, opc->a);
+
+ /*
+ * Store the previous values for undoing.
+ */
+ opc->r = or;
+ opc->g = og;
+ opc->b = ob;
+ opc->a = oa;
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static Ewl_Text_Op *
+ewl_text_op_font_new(Ewl_Text *ta, char *font, int size)
+{
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Font *opf;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
- if (t->estyle) {
- ewl_evas_object_destroy(t->estyle);
- t->estyle = NULL;
+ op = NEW(Ewl_Text_Op_Font, 1);
+ if (op) {
+ opf = (Ewl_Text_Op_Font *)op;
+ op->type = EWL_TEXT_OP_TYPE_FONT_SET;
+ op->apply = ewl_text_op_font_apply;
+ op->free = ewl_text_op_font_free;
+ opf->font = strdup(font);
+ opf->size = size;
}
- IF_FREE(t->text);
- IF_FREE(t->font);
+ DRETURN_PTR(op, DLEVEL_STABLE);
+}
+
+static void
+ewl_text_op_font_apply(Ewl_Text *ta, Ewl_Text_Op *op)
+{
+ char *of;
+ int size;
+ Ewl_Text_Op_Font *opf = (Ewl_Text_Op_Font *)op;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ of = etox_context_get_font(ta->context, &size);
+
+ etox_context_set_font(ta->context, opf->font, opf->size);
+
+ FREE(opf->font);
+ opf->font = of;
+ opf->size = size;
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
+ewl_text_op_font_free(void *op)
+{
+ Ewl_Text_Op_Font *opf = (Ewl_Text_Op_Font *)op;
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ FREE(opf->font);
+ FREE(opf);
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-void
-ewl_text_configure_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+static Ewl_Text_Op *
+ewl_text_op_style_new(Ewl_Text *ta, char *style)
{
- Ewl_Text *t;
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Style *ops;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("w", w);
- t = EWL_TEXT(w);
+ op = NEW(Ewl_Text_Op_Style, 1);
+ if (op) {
+ ops = (Ewl_Text_Op_Style *)op;
+ op->type = EWL_TEXT_OP_TYPE_STYLE_SET;
+ op->apply = ewl_text_op_style_apply;
+ op->free = ewl_text_op_style_free;
+ ops->style = strdup(style);
+ }
+
+ DRETURN_PTR(op, DLEVEL_STABLE);
+}
+
+static void
+ewl_text_op_style_apply(Ewl_Text *ta, Ewl_Text_Op *op)
+{
+ char *style;
+ Ewl_Text_Op_Style *ops = (Ewl_Text_Op_Style *)op;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ style = etox_context_get_style(ta->context);
+ etox_context_set_style(ta->context, ops->style);
- if (t->estyle)
- evas_object_move(t->estyle, CURRENT_X(t), CURRENT_Y(t));
+ FREE(ops->style);
+ ops->style = style;
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
-void
-ewl_text_reparent_cb(Ewl_Widget * w, void *ev_data, void *user_data)
+static void
+ewl_text_op_style_free(void *op)
{
- Ewl_Text *t;
+ Ewl_Text_Op_Style *ops = (Ewl_Text_Op_Style *)op;
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ FREE(ops->style);
+ FREE(ops);
+
+ DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static Ewl_Text_Op *
+ewl_text_op_align_new(Ewl_Text *ta, unsigned int align)
+{
+ Ewl_Text_Op *op;
+ Ewl_Text_Op_Align *opa;
DENTER_FUNCTION(DLEVEL_STABLE);
- DCHECK_PARAM_PTR("w", w);
- t = EWL_TEXT(w);
+ op = NEW(Ewl_Text_Op_Align, 1);
+ if (op) {
+ opa = (Ewl_Text_Op_Align *)op;
+ op->type = EWL_TEXT_OP_TYPE_ALIGN_SET;
+ op->apply = ewl_text_op_align_apply;
+ op->free = free;
+ opa->align = align;
+ }
- if (!t->estyle)
- DRETURN(DLEVEL_STABLE);
+ DRETURN_PTR(op, DLEVEL_STABLE);
+}
+static void
+ewl_text_op_align_apply(Ewl_Text *ta, Ewl_Text_Op *op)
+{
+ unsigned int align;
+ Ewl_Text_Op_Align *opa = (Ewl_Text_Op_Align *)op;
- if (w->fx_clip_box)
- evas_object_clip_set(t->estyle, w->fx_clip_box);
- evas_object_layer_set(t->estyle, ewl_widget_get_layer_sum(w));
+ DENTER_FUNCTION(DLEVEL_STABLE);
+
+ align = etox_context_get_align(ta->context);
+ etox_context_set_align(ta->context, opa->align);
+
+ opa->align = align;
DLEAVE_FUNCTION(DLEVEL_STABLE);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/ewl_text.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -3 -r1.29 -r1.30
--- ewl_text.h 13 May 2004 06:03:01 -0000 1.29
+++ ewl_text.h 27 May 2004 20:15:17 -0000 1.30
@@ -1,10 +1,10 @@
-#ifndef __EWL_TEXT_H
-#define __EWL_TEXT_H
+#ifndef __EWL_TEXT_H__
+#define __EWL_TEXT_H__
/**
- * @defgroup Ewl_Text Text: A Single Line Text Display
- * @brief Defines the Ewl_Text class to provide text display in a single line.
+ * @defgroup Ewl_Text Text: A Multi-Line Text Layout Display
+ * @brief Defines a class for multi-line text layout and formatting.
*
* @{
*/
@@ -15,30 +15,31 @@
*/
/**
- * Inherits from the Ewl_Widget and provides single line text display.
+ * Provides for layout of text across multiple lines, as well as formatting
+ * portions of the text in different ways, and wrapping around obstacles.
*/
typedef struct Ewl_Text Ewl_Text;
/**
* @def EWL_TEXT(text)
- * Typecast a pointer to an Ewl_Text pointer.
+ * Typecasts a pointer to an Ewl_Text pointer.
*/
#define EWL_TEXT(text) ((Ewl_Text *) text)
/**
* @struct Ewl_Text
- * Inherit from the Ewl_Widget and extend to provide single line text display
- * capabilities.
+ * Inherits from the Ewl_Widget class and extends it to provide for multi-line
+ * text layout, obstacle wrapping, and a variety of formatting.
*/
struct Ewl_Text
{
- Ewl_Widget widget; /**< Inherit from Ewl_Widget */
- Evas_Object *etox; /**< Pointer to etox displaying text */
-
- char *text; /**< The text contents of the estyle */
- int length; /**< Length of the text in the estyle */
- Etox_Context *context; /**< Context holding text properties */
- int overrides; /**< Bitmask of programmer set properties */
+ Ewl_Widget widget; /**< Inherit from Ewl_Widget */
+ char *text; /**< The initial text in the text */
+ int length; /**< Length of the text displayed */
+ Evas_Object *etox; /**< Etox does the actual layout work */
+ Etox_Context *context; /**< Contains various format settings */
+ Ecore_DList *ops; /**< Series of operations to apply */
+ Ecore_DList *applied; /**< Applied set of operations */
};
typedef enum
@@ -47,42 +48,124 @@
EWL_TEXT_OVERRIDE_FONT = 0x2,
EWL_TEXT_OVERRIDE_SIZE = 0x4,
EWL_TEXT_OVERRIDE_STYLE = 0x8,
-} EWL_TEXT_OVERRIDES;
+} Ewl_Text_Overrides;
-Ewl_Widget *ewl_text_new(char *text);
-void ewl_text_init(Ewl_Text * t, char *text);
+/**
+ * @enum Ewl_Text_Ops
+ * Provides a series of operations that can be performed on the text.
+ */
+typedef enum
+{
+ EWL_TEXT_OP_TYPE_COLOR_SET,
+ EWL_TEXT_OP_TYPE_FONT_SET,
+ EWL_TEXT_OP_TYPE_STYLE_SET,
+ EWL_TEXT_OP_TYPE_ALIGN_SET,
+ EWL_TEXT_OP_TYPE_SELECT,
+ EWL_TEXT_OP_TYPE_TEXT_PREPEND,
+ EWL_TEXT_OP_TYPE_TEXT_APPEND,
+ EWL_TEXT_OP_TYPE_TEXT_INSERT,
+} Ewl_Text_Op_Type;
-void ewl_text_set_text(Ewl_Text * t, char *text);
-char *ewl_text_get_text(Ewl_Text * t);
-void ewl_text_set_font(Ewl_Text * t, char *font);
-char *ewl_text_get_font(Ewl_Text * t);
-void ewl_text_set_font_size(Ewl_Text * t, int size);
-int ewl_text_get_font_size(Ewl_Text * t);
-void ewl_text_set_color(Ewl_Text * t, int r, int g, int b, int a);
-void ewl_text_get_color(Ewl_Text * t, int *r, int *g, int *b,
- int *a);
-void ewl_text_get_text_geometry(Ewl_Text * t, int *xx, int *yy,
- int *ww, int *hh);
-inline int ewl_text_get_length(Ewl_Text *t);
-void ewl_text_set_style(Ewl_Text * t, char *s);
-void ewl_text_get_letter_geometry(Ewl_Text * t, int index, int *xx,
- int *yy, int *ww, int *hh);
-int ewl_text_get_letter_geometry_at(Ewl_Text * t, int x, int y,
- int *tx, int *ty, int *tw,
- int *th);
-void ewl_text_set_alignment(Ewl_Text * t, unsigned int a);
-int ewl_text_get_index_at(Ewl_Text * t, int x, int y);
+typedef struct Ewl_Text_Op Ewl_Text_Op;
+struct Ewl_Text_Op
+{
+ Ewl_Text_Op_Type type;
+ void (*apply)(Ewl_Text *ta, Ewl_Text_Op *op);
+ void (*free)(void *);
+};
+
+typedef struct Ewl_Text_Op_Color Ewl_Text_Op_Color;
+struct Ewl_Text_Op_Color
+{
+ Ewl_Text_Op op;
+ int r, g, b, a;
+};
+
+typedef struct Ewl_Text_Op_Font Ewl_Text_Op_Font;
+struct Ewl_Text_Op_Font
+{
+ Ewl_Text_Op op;
+ char *font;
+ int size;
+};
+
+typedef struct Ewl_Text_Op_Style Ewl_Text_Op_Style;
+struct Ewl_Text_Op_Style
+{
+ Ewl_Text_Op op;
+ char *style;
+};
+
+typedef struct Ewl_Text_Op_Align Ewl_Text_Op_Align;
+struct Ewl_Text_Op_Align
+{
+ Ewl_Text_Op op;
+ unsigned int align;
+};
+
+typedef struct Ewl_Text_Op_Select Ewl_Text_Op_Select;
+struct Ewl_Text_Op_Select
+{
+ Ewl_Text_Op op;
+ Evas_Coord sx, sy, ex, ey;
+ int si, ei;
+ char *match;
+ int index;
+};
+
+typedef struct Ewl_Text_Op_Text Ewl_Text_Op_Text;
+struct Ewl_Text_Op_Text
+{
+ Ewl_Text_Op op;
+ char *text;
+ int index;
+};
+
+Ewl_Widget *ewl_text_new(char *text);
+void ewl_text_init(Ewl_Text * ta, char *text);
+
+void ewl_text_text_set(Ewl_Text * ta, char *text);
+void ewl_text_text_prepend(Ewl_Text * ta, char *text);
+void ewl_text_text_append(Ewl_Text * ta, char *text);
+void ewl_text_text_insert(Ewl_Text * ta, char *text, int index);
+char *ewl_text_text_get(Ewl_Text * ta);
+
+int ewl_text_length_get(Ewl_Text *ta);
+
+void ewl_text_font_set(Ewl_Text *ta, char *font, int size);
+char *ewl_text_font_get(Ewl_Text *ta);
+int ewl_text_font_size_get(Ewl_Text *ta);
+
+void ewl_text_style_set(Ewl_Text *ta, char *style);
+char *ewl_text_style_get(Ewl_Text *ta);
+
+void ewl_text_color_set(Ewl_Text *ta, int r, int g, int b, int a);
+void ewl_text_color_get(Ewl_Text *ta, int *r, int *g, int *b, int *a);
+
+void ewl_text_align_set(Ewl_Text *ta, unsigned int align);
+unsigned int ewl_text_align_get(Ewl_Text *ta);
+
+void ewl_text_index_select(Ewl_Text *ta, int si, int ei);
+void ewl_text_coord_select(Ewl_Text *ta, int sx, int sy, int ex,
+ int ey);
+
+void ewl_text_index_geometry_map(Ewl_Text *ta, int index, int *xx,
+ int *yy, int *ww, int *hh);
+int ewl_text_coord_index_map(Ewl_Text *ta, int x, int y);
+int ewl_text_coord_geometry_map(Ewl_Text *ta, int x, int y, int *xx,
+ int *yy, int *ww, int *hh);
/*
* Internally used callbacks, override at your own risk.
*/
void ewl_text_realize_cb(Ewl_Widget * w, void *ev_data, void *user_data);
void ewl_text_unrealize_cb(Ewl_Widget * w, void *ev_data, void *user_data);
-void ewl_text_configure_cb(Ewl_Widget * w, void *ev_data, void *user_data);
+void ewl_text_destroy_cb(Ewl_Widget * w, void *ev_data, void *user_data);
void ewl_text_reparent_cb(Ewl_Widget * w, void *ev_data, void *user_data);
+void ewl_text_configure_cb(Ewl_Widget * w, void *ev_data, void *user_data);
/**
* @}
*/
-#endif
+#endif /* __EWL_TEXT_H__ */
-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g.
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs