2013-04-25 22:13:00 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
2014-10-17 08:56:11 -07:00
|
|
|
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
|
|
|
|
#define ELM_INTERFACE_ATSPI_TEXT_PROTECTED
|
|
|
|
#define ELM_INTERFACE_ATSPI_EDITABLE_TEXT_PROTECTED
|
|
|
|
|
2008-10-14 01:05:30 -07:00
|
|
|
#include <Elementary.h>
|
2010-09-17 15:28:29 -07:00
|
|
|
#include <Elementary_Cursor.h>
|
2008-10-14 01:05:30 -07:00
|
|
|
#include "elm_priv.h"
|
2012-08-30 09:45:15 -07:00
|
|
|
#include "elm_widget_entry.h"
|
2008-10-14 01:05:30 -07:00
|
|
|
|
2014-06-03 03:35:28 -07:00
|
|
|
#define MY_CLASS ELM_ENTRY_CLASS
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2013-11-07 03:44:22 -08:00
|
|
|
#define MY_CLASS_NAME "Elm_Entry"
|
|
|
|
#define MY_CLASS_NAME_LEGACY "elm_entry"
|
2010-04-12 01:12:02 -07:00
|
|
|
|
2011-05-15 09:02:03 -07:00
|
|
|
/* Maximum chunk size to be inserted to the entry at once
|
|
|
|
* FIXME: This size is arbitrary, should probably choose a better size.
|
|
|
|
* Possibly also find a way to set it to a low value for weak computers,
|
|
|
|
* and to a big value for better computers. */
|
2014-01-23 06:09:28 -08:00
|
|
|
#define ELM_ENTRY_CHUNK_SIZE 10000
|
2014-01-23 06:05:24 -08:00
|
|
|
#define ELM_ENTRY_DELAY_WRITE_TIME 2.0
|
2011-05-15 09:02:03 -07:00
|
|
|
|
2013-07-14 20:13:53 -07:00
|
|
|
#define ELM_PRIV_ENTRY_SIGNALS(cmd) \
|
|
|
|
cmd(SIG_ABORTED, "aborted", "") \
|
|
|
|
cmd(SIG_ACTIVATED, "activated", "") \
|
|
|
|
cmd(SIG_ANCHOR_CLICKED, "anchor,clicked", "") \
|
|
|
|
cmd(SIG_ANCHOR_DOWN, "anchor,down", "") \
|
|
|
|
cmd(SIG_ANCHOR_HOVER_OPENED, "anchor,hover,opened", "") \
|
|
|
|
cmd(SIG_ANCHOR_IN, "anchor,in", "") \
|
|
|
|
cmd(SIG_ANCHOR_OUT, "anchor,out", "") \
|
|
|
|
cmd(SIG_ANCHOR_UP, "anchor,up", "") \
|
|
|
|
cmd(SIG_CHANGED, "changed", "") \
|
|
|
|
cmd(SIG_CHANGED_USER, "changed,user", "") \
|
|
|
|
cmd(SIG_CLICKED, "clicked", "") \
|
|
|
|
cmd(SIG_CLICKED_DOUBLE, "clicked,double", "") \
|
|
|
|
cmd(SIG_CLICKED_TRIPLE, "clicked,triple", "") \
|
|
|
|
cmd(SIG_CURSOR_CHANGED, "cursor,changed", "") \
|
|
|
|
cmd(SIG_CURSOR_CHANGED_MANUAL, "cursor,changed,manual", "") \
|
|
|
|
cmd(SIG_FOCUSED, "focused", "") \
|
|
|
|
cmd(SIG_UNFOCUSED, "unfocused", "") \
|
|
|
|
cmd(SIG_LONGPRESSED, "longpressed", "") \
|
|
|
|
cmd(SIG_MAX_LENGTH, "maxlength,reached", "") \
|
|
|
|
cmd(SIG_PREEDIT_CHANGED, "preedit,changed", "") \
|
|
|
|
cmd(SIG_PRESS, "press", "") \
|
|
|
|
cmd(SIG_REDO_REQUEST, "redo,request", "") \
|
|
|
|
cmd(SIG_SELECTION_CHANGED, "selection,changed", "") \
|
|
|
|
cmd(SIG_SELECTION_CLEARED, "selection,cleared", "") \
|
|
|
|
cmd(SIG_SELECTION_COPY, "selection,copy", "") \
|
|
|
|
cmd(SIG_SELECTION_CUT, "selection,cut", "") \
|
|
|
|
cmd(SIG_SELECTION_PASTE, "selection,paste", "") \
|
|
|
|
cmd(SIG_SELECTION_START, "selection,start", "") \
|
|
|
|
cmd(SIG_TEXT_SET_DONE, "text,set,done", "") \
|
|
|
|
cmd(SIG_THEME_CHANGED, "theme,changed", "") \
|
2013-12-30 01:25:15 -08:00
|
|
|
cmd(SIG_UNDO_REQUEST, "undo,request", "") \
|
|
|
|
cmd(SIG_REJECTED, "rejected", "")
|
2013-07-14 20:13:53 -07:00
|
|
|
|
|
|
|
ELM_PRIV_ENTRY_SIGNALS(ELM_PRIV_STATIC_VARIABLE_DECLARE);
|
|
|
|
|
2015-06-03 08:36:42 -07:00
|
|
|
#define ENTRY_PASSWORD_MASK_CHARACTER 0x002A
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
2013-07-14 21:37:34 -07:00
|
|
|
ELM_PRIV_ENTRY_SIGNALS(ELM_PRIV_SMART_CALLBACKS_DESC)
|
2014-01-23 02:30:34 -08:00
|
|
|
{SIG_WIDGET_LANG_CHANGED, ""}, /**< handled by elm_widget */
|
2014-02-07 21:05:06 -08:00
|
|
|
{SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
|
2012-08-30 09:45:15 -07:00
|
|
|
{NULL, NULL}
|
|
|
|
};
|
2013-10-18 10:20:34 -07:00
|
|
|
#undef ELM_PRIV_ENTRY_SIGNALS
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
static const Elm_Layout_Part_Alias_Description _content_aliases[] =
|
|
|
|
{
|
|
|
|
{"icon", "elm.swallow.icon"},
|
|
|
|
{"end", "elm.swallow.end"},
|
|
|
|
{NULL, NULL}
|
|
|
|
};
|
|
|
|
|
2008-11-18 00:45:38 -08:00
|
|
|
static Eina_List *entries = NULL;
|
|
|
|
|
2009-12-01 03:03:14 -08:00
|
|
|
struct _Mod_Api
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
void (*obj_hook)(Evas_Object *obj);
|
|
|
|
void (*obj_unhook)(Evas_Object *obj);
|
|
|
|
void (*obj_longpress)(Evas_Object *obj);
|
2009-12-01 03:03:14 -08:00
|
|
|
};
|
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
static void _create_selection_handlers(Evas_Object *obj, Elm_Entry_Data *sd);
|
|
|
|
|
2009-12-01 03:03:14 -08:00
|
|
|
static Mod_Api *
|
2014-01-06 06:30:02 -08:00
|
|
|
_module_find(Evas_Object *obj EINA_UNUSED)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
|
|
|
static Elm_Module *m = NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (m) goto ok; // already found - just use
|
2009-12-01 03:03:14 -08:00
|
|
|
if (!(m = _elm_module_find_as("entry/api"))) return NULL;
|
|
|
|
// get module api
|
|
|
|
m->api = malloc(sizeof(Mod_Api));
|
|
|
|
if (!m->api) return NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
((Mod_Api *)(m->api))->obj_hook = // called on creation
|
|
|
|
_elm_module_symbol_get(m, "obj_hook");
|
|
|
|
((Mod_Api *)(m->api))->obj_unhook = // called on deletion
|
|
|
|
_elm_module_symbol_get(m, "obj_unhook");
|
|
|
|
((Mod_Api *)(m->api))->obj_longpress = // called on long press menu
|
|
|
|
_elm_module_symbol_get(m, "obj_longpress");
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
ok: // ok - return api
|
2009-12-01 03:03:14 -08:00
|
|
|
return m->api;
|
|
|
|
}
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
static char *
|
2012-12-05 23:28:57 -08:00
|
|
|
_file_load(const char *file)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2012-12-05 23:28:57 -08:00
|
|
|
Eina_File *f;
|
|
|
|
char *text = NULL;
|
|
|
|
void *tmp = NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-12-05 23:28:57 -08:00
|
|
|
f = eina_file_open(file, EINA_FALSE);
|
|
|
|
if (!f) return NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-12-06 01:02:22 -08:00
|
|
|
tmp = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
|
2012-12-05 23:28:57 -08:00
|
|
|
if (!tmp) goto on_error;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-12-05 23:28:57 -08:00
|
|
|
text = malloc(eina_file_size_get(f) + 1);
|
|
|
|
if (!text) goto on_error;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
|
2012-12-05 23:28:57 -08:00
|
|
|
memcpy(text, tmp, eina_file_size_get(f));
|
|
|
|
text[eina_file_size_get(f)] = 0;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
|
2012-12-06 01:00:18 -08:00
|
|
|
if (eina_file_map_faulted(f, tmp))
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(text, free);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
2012-12-05 23:28:57 -08:00
|
|
|
|
|
|
|
on_error:
|
2012-12-06 01:02:22 -08:00
|
|
|
if (tmp) eina_file_map_free(f, tmp);
|
2012-12-05 23:28:57 -08:00
|
|
|
eina_file_close(f);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
return text;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2012-08-30 09:45:15 -07:00
|
|
|
_plain_load(const char *file)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
char *text;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
text = _file_load(file);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
if (text)
|
|
|
|
{
|
|
|
|
char *text2;
|
|
|
|
|
|
|
|
text2 = elm_entry_utf8_to_markup(text);
|
|
|
|
free(text);
|
|
|
|
return text2;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-03-06 14:51:40 -08:00
|
|
|
static Eina_Bool
|
2012-08-30 09:45:15 -07:00
|
|
|
_load_do(Evas_Object *obj)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
char *text;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!sd->file)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2011-12-30 02:02:19 -08:00
|
|
|
elm_object_text_set(obj, "");
|
2012-03-06 14:51:40 -08:00
|
|
|
return EINA_TRUE;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
switch (sd->format)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
case ELM_TEXT_FORMAT_PLAIN_UTF8:
|
2012-08-30 09:45:15 -07:00
|
|
|
text = _plain_load(sd->file);
|
|
|
|
break;
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
case ELM_TEXT_FORMAT_MARKUP_UTF8:
|
2012-08-30 09:45:15 -07:00
|
|
|
text = _file_load(sd->file);
|
|
|
|
break;
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
default:
|
2012-08-30 09:45:15 -07:00
|
|
|
text = NULL;
|
|
|
|
break;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
if (text)
|
|
|
|
{
|
2011-12-30 02:02:19 -08:00
|
|
|
elm_object_text_set(obj, text);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
free(text);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-03-06 14:51:40 -08:00
|
|
|
return EINA_TRUE;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
else
|
2012-03-06 14:51:40 -08:00
|
|
|
{
|
|
|
|
elm_object_text_set(obj, "");
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-03-06 14:51:40 -08:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_utf8_markup_save(const char *file,
|
|
|
|
const char *text)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
FILE *f;
|
|
|
|
|
2015-02-18 00:46:05 -08:00
|
|
|
if (!text)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
ecore_file_unlink(file);
|
|
|
|
return;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
f = fopen(file, "wb");
|
|
|
|
if (!f)
|
|
|
|
{
|
2015-01-29 15:02:21 -08:00
|
|
|
ERR("Failed to open %s for writing", file);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
return;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2015-01-29 15:02:21 -08:00
|
|
|
if (fputs(text, f) == EOF)
|
|
|
|
ERR("Failed to write text to file %s", file);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_utf8_plain_save(const char *file,
|
|
|
|
const char *text)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
char *text2;
|
|
|
|
|
|
|
|
text2 = elm_entry_markup_to_utf8(text);
|
|
|
|
if (!text2)
|
|
|
|
return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
_utf8_markup_save(file, text2);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
free(text2);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_save_do(Evas_Object *obj)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!sd->file) return;
|
|
|
|
switch (sd->format)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
|
|
|
case ELM_TEXT_FORMAT_PLAIN_UTF8:
|
2012-08-30 09:45:15 -07:00
|
|
|
_utf8_plain_save(sd->file, elm_object_text_get(obj));
|
|
|
|
break;
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
case ELM_TEXT_FORMAT_MARKUP_UTF8:
|
2012-08-30 09:45:15 -07:00
|
|
|
_utf8_markup_save(sd->file, elm_object_text_get(obj));
|
|
|
|
break;
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
default:
|
2012-08-30 09:45:15 -07:00
|
|
|
break;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_delay_write(void *data)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
_save_do(data);
|
|
|
|
sd->delay_write = NULL;
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
2012-04-08 22:25:27 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(Evas_Object *obj,
|
|
|
|
Eina_Bool has_text)
|
2012-04-08 22:25:27 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if ((has_text) && (!sd->has_text))
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,guide,disabled", "elm");
|
|
|
|
else if ((!has_text) && (sd->has_text))
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,guide,enabled", "elm");
|
|
|
|
|
|
|
|
sd->has_text = has_text;
|
2012-04-08 22:25:27 -07:00
|
|
|
}
|
|
|
|
|
2015-04-02 02:37:37 -07:00
|
|
|
static void
|
|
|
|
_validate(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
Eina_Bool res;
|
|
|
|
Elm_Validate_Content vc;
|
|
|
|
Eina_Strbuf *buf;
|
|
|
|
|
|
|
|
if (sd->validators == 0) return;
|
|
|
|
|
|
|
|
vc.text = edje_object_part_text_get(sd->entry_edje, "elm.text");
|
|
|
|
eo_do(obj, res = eo_event_callback_call(ELM_ENTRY_EVENT_VALIDATE, (void *)&vc));
|
|
|
|
buf = eina_strbuf_new();
|
|
|
|
eina_strbuf_append_printf(buf, "validation,%s,%s", vc.signal, res == EO_CALLBACK_STOP ? "fail" : "pass");
|
|
|
|
edje_object_signal_emit(sd->scr_edje, eina_strbuf_string_get(buf), "elm");
|
|
|
|
eina_tmpstr_del(vc.signal);
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
}
|
|
|
|
|
2012-02-07 23:23:49 -08:00
|
|
|
static Elm_Entry_Markup_Filter *
|
2012-08-30 09:45:15 -07:00
|
|
|
_filter_new(Elm_Entry_Filter_Cb func,
|
|
|
|
void *data)
|
2011-02-14 00:45:26 -08:00
|
|
|
{
|
2012-02-07 23:23:49 -08:00
|
|
|
Elm_Entry_Markup_Filter *tf = ELM_NEW(Elm_Entry_Markup_Filter);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
if (!tf) return NULL;
|
2011-03-14 19:01:42 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
tf->func = func;
|
2013-05-16 02:10:13 -07:00
|
|
|
tf->orig_data = data;
|
2011-02-14 00:45:26 -08:00
|
|
|
if (func == elm_entry_filter_limit_size)
|
|
|
|
{
|
|
|
|
Elm_Entry_Filter_Limit_Size *lim = data, *lim2;
|
|
|
|
|
|
|
|
if (!data)
|
|
|
|
{
|
|
|
|
free(tf);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
lim2 = malloc(sizeof(Elm_Entry_Filter_Limit_Size));
|
|
|
|
if (!lim2)
|
|
|
|
{
|
|
|
|
free(tf);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
memcpy(lim2, lim, sizeof(Elm_Entry_Filter_Limit_Size));
|
|
|
|
tf->data = lim2;
|
|
|
|
}
|
|
|
|
else if (func == elm_entry_filter_accept_set)
|
|
|
|
{
|
|
|
|
Elm_Entry_Filter_Accept_Set *as = data, *as2;
|
2011-03-14 19:01:42 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
if (!data)
|
|
|
|
{
|
|
|
|
free(tf);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
as2 = malloc(sizeof(Elm_Entry_Filter_Accept_Set));
|
|
|
|
if (!as2)
|
|
|
|
{
|
|
|
|
free(tf);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (as->accepted)
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
as2->accepted = eina_stringshare_add(as->accepted);
|
2011-02-14 00:45:26 -08:00
|
|
|
else
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
as2->accepted = NULL;
|
2011-02-14 00:45:26 -08:00
|
|
|
if (as->rejected)
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
as2->rejected = eina_stringshare_add(as->rejected);
|
2011-02-14 00:45:26 -08:00
|
|
|
else
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
as2->rejected = NULL;
|
2011-02-14 00:45:26 -08:00
|
|
|
tf->data = as2;
|
|
|
|
}
|
|
|
|
else
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
tf->data = data;
|
2011-02-14 00:45:26 -08:00
|
|
|
return tf;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-02-07 23:23:49 -08:00
|
|
|
_filter_free(Elm_Entry_Markup_Filter *tf)
|
2011-02-14 00:45:26 -08:00
|
|
|
{
|
|
|
|
if (tf->func == elm_entry_filter_limit_size)
|
|
|
|
{
|
|
|
|
Elm_Entry_Filter_Limit_Size *lim = tf->data;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-01-21 18:08:47 -08:00
|
|
|
free(lim);
|
2011-02-14 00:45:26 -08:00
|
|
|
}
|
|
|
|
else if (tf->func == elm_entry_filter_accept_set)
|
|
|
|
{
|
|
|
|
Elm_Entry_Filter_Accept_Set *as = tf->data;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
if (as)
|
|
|
|
{
|
2014-01-21 17:12:44 -08:00
|
|
|
eina_stringshare_del(as->accepted);
|
|
|
|
eina_stringshare_del(as->rejected);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-02-14 00:45:26 -08:00
|
|
|
free(as);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(tf);
|
|
|
|
}
|
|
|
|
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_mirrored_set(Evas_Object *obj,
|
|
|
|
Eina_Bool rtl)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
edje_object_mirrored_set(sd->entry_edje, rtl);
|
|
|
|
|
|
|
|
if (sd->anchor_hover.hover)
|
|
|
|
elm_widget_mirrored_set(sd->anchor_hover.hover, rtl);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
|
2013-11-08 00:06:08 -08:00
|
|
|
static void
|
|
|
|
_hide_selection_handler(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
if (!sd->start_handler) return;
|
|
|
|
|
2014-05-25 19:28:12 -07:00
|
|
|
if (sd->start_handler_shown)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->start_handler, "elm,handler,hide", "elm");
|
|
|
|
sd->start_handler_shown = EINA_FALSE;
|
|
|
|
}
|
|
|
|
if (sd->end_handler_shown)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->end_handler, "elm,handler,hide", "elm");
|
|
|
|
sd->end_handler_shown = EINA_FALSE;
|
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
|
2014-03-20 03:33:42 -07:00
|
|
|
static Eina_Rectangle *
|
|
|
|
_viewport_region_get(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
Eina_Rectangle *rect = eina_rectangle_new(0, 0, 0, 0);
|
|
|
|
Evas_Object *parent;
|
|
|
|
|
|
|
|
if (sd->scroll)
|
entry: wrong viewport value calculation issue fix
Summary:
Issue: As entire scroller edje co-ordinates was being taken instead of the actual viewport value,
if in scroller edje more parts are added apart from just "elm.swallow.content", then the viewport value
set will be wrong. hence the selection handlers will not hide when they have to hide.
solution: Instead of taking scroller edje's geometry, get the actual viewport values.
To get viewport x,y a new scrollable interface is also added.
signed-off by: Shilpa Singh <shilpa.singh@samsung.com>
@fix
Test Plan: Selection handlers have to hide correctly when the text is scrolled in a scrolled entry, if the scroller edc of entry has more parts added other than elm.swallow.content, then when we scroll the selection handlers are not hidden correctly.
Reviewers: jaehwan, woohyun, seoz, Hermet, raster
CC: govi, rajeshps, thiepha
Differential Revision: https://phab.enlightenment.org/D674
2014-04-20 20:31:49 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
|
|
|
|
(&rect->x, &rect->y, &rect->w, &rect->h));
|
2014-03-20 03:33:42 -07:00
|
|
|
else
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &rect->x, &rect->y, &rect->w, &rect->h);
|
|
|
|
|
|
|
|
parent = elm_widget_parent_get(obj);
|
|
|
|
while (parent)
|
|
|
|
{
|
2014-06-30 13:37:04 -07:00
|
|
|
if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
|
2014-03-20 03:33:42 -07:00
|
|
|
{
|
2015-06-22 02:47:22 -07:00
|
|
|
Eina_Rectangle r;
|
|
|
|
EINA_RECTANGLE_SET(&r, 0, 0, 0, 0);
|
|
|
|
evas_object_geometry_get(parent, &r.x, &r.y, &r.w, &r.h);
|
|
|
|
if (!eina_rectangle_intersection(rect, &r))
|
2014-03-20 03:33:42 -07:00
|
|
|
{
|
|
|
|
rect->x = rect->y = rect->w = rect->h = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
parent = elm_widget_parent_get(parent);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rect;
|
|
|
|
}
|
|
|
|
|
2013-11-08 00:06:08 -08:00
|
|
|
static void
|
|
|
|
_update_selection_handler(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2014-03-06 02:33:05 -08:00
|
|
|
Evas_Coord sx, sy, sh;
|
2013-11-08 00:06:08 -08:00
|
|
|
Evas_Coord ent_x, ent_y;
|
2014-03-06 02:33:05 -08:00
|
|
|
Evas_Coord ex, ey, eh;
|
|
|
|
int start_pos, end_pos, last_pos;
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
if (!sd->sel_handler_disabled)
|
|
|
|
{
|
2014-03-20 03:33:42 -07:00
|
|
|
Eina_Rectangle *rect;
|
|
|
|
Evas_Coord hx, hy;
|
|
|
|
Eina_Bool hidden = EINA_FALSE;
|
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
if (!sd->start_handler)
|
|
|
|
_create_selection_handlers(obj, sd);
|
|
|
|
|
2014-03-20 03:33:42 -07:00
|
|
|
rect = _viewport_region_get(obj);
|
2013-11-08 00:06:08 -08:00
|
|
|
start_pos = edje_object_part_text_cursor_pos_get
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN);
|
|
|
|
end_pos = edje_object_part_text_cursor_pos_get
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_SELECTION_END);
|
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ent_x, &ent_y, NULL, NULL);
|
2014-03-06 02:33:05 -08:00
|
|
|
last_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
2014-03-20 03:33:42 -07:00
|
|
|
EDJE_CURSOR_MAIN);
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, start_pos);
|
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje, "elm.text",
|
2014-03-06 02:33:05 -08:00
|
|
|
&sx, &sy, NULL, &sh);
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, end_pos);
|
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje, "elm.text",
|
2014-03-06 02:33:05 -08:00
|
|
|
&ex, &ey, NULL, &eh);
|
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, last_pos);
|
2014-03-20 03:33:42 -07:00
|
|
|
if (start_pos < end_pos)
|
|
|
|
{
|
|
|
|
hx = ent_x + sx;
|
|
|
|
hy = ent_y + sy + sh;
|
|
|
|
evas_object_move(sd->start_handler, hx, hy);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
hx = ent_x + ex;
|
|
|
|
hy = ent_y + ey + eh;
|
|
|
|
evas_object_move(sd->start_handler, hx, hy);
|
|
|
|
}
|
|
|
|
if (!eina_rectangle_xcoord_inside(rect, hx) ||
|
|
|
|
!eina_rectangle_ycoord_inside(rect, hy))
|
|
|
|
{
|
|
|
|
hidden = EINA_TRUE;
|
|
|
|
}
|
|
|
|
if (!sd->start_handler_shown && !hidden)
|
2013-11-08 00:06:08 -08:00
|
|
|
{
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_signal_emit(sd->start_handler,
|
|
|
|
"elm,handler,show", "elm");
|
2013-11-08 00:06:08 -08:00
|
|
|
sd->start_handler_shown = EINA_TRUE;
|
|
|
|
}
|
2014-03-20 03:33:42 -07:00
|
|
|
else if (sd->start_handler_shown && hidden)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->start_handler,
|
|
|
|
"elm,handler,hide", "elm");
|
|
|
|
sd->start_handler_shown = EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
hidden = EINA_FALSE;
|
2014-03-06 02:33:05 -08:00
|
|
|
if (start_pos < end_pos)
|
2014-03-20 03:33:42 -07:00
|
|
|
{
|
|
|
|
hx = ent_x + ex;
|
|
|
|
hy = ent_y + ey + eh;
|
|
|
|
evas_object_move(sd->end_handler, hx, hy);
|
|
|
|
}
|
2014-03-06 02:33:05 -08:00
|
|
|
else
|
2014-03-20 03:33:42 -07:00
|
|
|
{
|
|
|
|
hx = ent_x + sx;
|
|
|
|
hy = ent_y + sy + sh;
|
|
|
|
evas_object_move(sd->end_handler, hx, hy);
|
|
|
|
}
|
|
|
|
if (!eina_rectangle_xcoord_inside(rect, hx) ||
|
|
|
|
!eina_rectangle_ycoord_inside(rect, hy))
|
|
|
|
{
|
|
|
|
hidden = EINA_TRUE;
|
|
|
|
}
|
|
|
|
if (!sd->end_handler_shown && !hidden)
|
2013-11-08 00:06:08 -08:00
|
|
|
{
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_signal_emit(sd->end_handler,
|
|
|
|
"elm,handler,show", "elm");
|
2013-11-08 00:06:08 -08:00
|
|
|
sd->end_handler_shown = EINA_TRUE;
|
|
|
|
}
|
2014-03-20 03:33:42 -07:00
|
|
|
else if (sd->end_handler_shown && hidden)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->end_handler,
|
|
|
|
"elm,handler,hide", "elm");
|
|
|
|
sd->end_handler_shown = EINA_FALSE;
|
|
|
|
}
|
|
|
|
eina_rectangle_free(rect);
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (sd->start_handler_shown)
|
|
|
|
{
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_signal_emit(sd->start_handler,
|
|
|
|
"elm,handler,hide", "elm");
|
2013-11-08 00:06:08 -08:00
|
|
|
sd->start_handler_shown = EINA_FALSE;
|
|
|
|
}
|
|
|
|
if (sd->end_handler_shown)
|
|
|
|
{
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_signal_emit(sd->end_handler,
|
|
|
|
"elm,handler,hide", "elm");
|
2013-11-08 00:06:08 -08:00
|
|
|
sd->end_handler_shown = EINA_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
static const char *
|
|
|
|
_elm_entry_theme_group_get(Evas_Object *obj)
|
2008-10-14 01:05:30 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
2009-09-26 11:00:51 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->editable)
|
|
|
|
{
|
|
|
|
if (sd->password) return "base-password";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (sd->single_line) return "base-single";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (sd->line_wrap)
|
|
|
|
{
|
|
|
|
case ELM_WRAP_CHAR:
|
|
|
|
return "base-charwrap";
|
2011-09-29 05:02:49 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
case ELM_WRAP_WORD:
|
|
|
|
return "base";
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
case ELM_WRAP_MIXED:
|
|
|
|
return "base-mixedwrap";
|
2010-02-08 19:27:11 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
case ELM_WRAP_NONE:
|
|
|
|
default:
|
|
|
|
return "base-nowrap";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->password) return "base-password";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (sd->single_line) return "base-single-noedit";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (sd->line_wrap)
|
|
|
|
{
|
|
|
|
case ELM_WRAP_CHAR:
|
|
|
|
return "base-noedit-charwrap";
|
2011-09-29 05:02:49 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
case ELM_WRAP_WORD:
|
|
|
|
return "base-noedit";
|
|
|
|
|
|
|
|
case ELM_WRAP_MIXED:
|
|
|
|
return "base-noedit-mixedwrap";
|
|
|
|
|
|
|
|
case ELM_WRAP_NONE:
|
|
|
|
default:
|
|
|
|
return "base-nowrap-noedit";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-10-14 01:05:30 -07:00
|
|
|
}
|
|
|
|
|
2015-06-16 06:41:55 -07:00
|
|
|
static void
|
|
|
|
_edje_entry_user_insert(Evas_Object *obj, const char *data)
|
|
|
|
{
|
|
|
|
if (!data) return;
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
sd->changed = EINA_TRUE;
|
|
|
|
edje_object_part_text_user_insert(sd->entry_edje, "elm.text", data);
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
2015-06-09 01:04:48 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_selection_data_cb(void *data EINA_UNUSED,
|
|
|
|
Evas_Object *obj,
|
|
|
|
Elm_Selection_Data *sel_data)
|
|
|
|
{
|
|
|
|
char *buf;
|
|
|
|
|
|
|
|
if (!sel_data->data) return EINA_FALSE;
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
buf = malloc(sel_data->len + 1);
|
|
|
|
if (!buf)
|
|
|
|
{
|
|
|
|
ERR("Failed to allocate memory, obj: %p", obj);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
memcpy(buf, sel_data->data, sel_data->len);
|
|
|
|
buf[sel_data->len] = '\0';
|
|
|
|
|
|
|
|
if ((sel_data->format & ELM_SEL_FORMAT_IMAGE) &&
|
|
|
|
(sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE))
|
|
|
|
{
|
|
|
|
char *entry_tag;
|
|
|
|
int len;
|
|
|
|
static const char *tag_string =
|
|
|
|
"<item absize=240x180 href=file://%s></item>";
|
|
|
|
|
|
|
|
len = strlen(tag_string) + strlen(buf);
|
|
|
|
entry_tag = alloca(len + 1);
|
|
|
|
snprintf(entry_tag, len + 1, tag_string, buf);
|
2015-06-16 06:41:55 -07:00
|
|
|
_edje_entry_user_insert(obj, entry_tag);
|
2015-06-09 01:04:48 -07:00
|
|
|
}
|
2015-11-30 05:29:06 -08:00
|
|
|
else if (sel_data->format & ELM_SEL_FORMAT_MARKUP)
|
|
|
|
{
|
|
|
|
_edje_entry_user_insert(obj, buf);
|
|
|
|
}
|
2015-06-09 01:04:48 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
char *txt = _elm_util_text_to_mkup(buf);
|
|
|
|
if (txt)
|
|
|
|
{
|
2015-06-16 06:41:55 -07:00
|
|
|
_edje_entry_user_insert(obj, txt);
|
2015-06-09 01:04:48 -07:00
|
|
|
free(txt);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ERR("Failed to convert text to markup text!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(buf);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_drag_drop_cb(void *data EINA_UNUSED,
|
|
|
|
Evas_Object *obj,
|
|
|
|
Elm_Selection_Data *drop)
|
|
|
|
{
|
|
|
|
Eina_Bool rv;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
rv = edje_object_part_text_cursor_coord_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, drop->x, drop->y);
|
|
|
|
|
|
|
|
if (!rv) WRN("Warning: Failed to position cursor: paste anyway");
|
|
|
|
|
2015-06-09 01:09:47 -07:00
|
|
|
rv = _selection_data_cb(NULL, obj, drop);
|
|
|
|
|
|
|
|
return rv;
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Elm_Sel_Format
|
|
|
|
_get_drop_format(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if ((sd->editable) && (!sd->single_line) && (!sd->password) && (!sd->disabled))
|
|
|
|
return ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
|
|
|
|
return ELM_SEL_FORMAT_MARKUP;
|
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
/* we can't reuse layout's here, because it's on entry_edje only */
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_disable(Eo *obj, Elm_Entry_Data *sd)
|
2011-02-08 04:08:28 -08:00
|
|
|
{
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
elm_drop_target_del(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (elm_object_disabled_get(obj))
|
2012-11-02 01:15:24 -07:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,disabled", "elm");
|
2013-04-16 01:59:02 -07:00
|
|
|
if (sd->scroll)
|
2014-01-20 01:04:30 -08:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->scr_edje, "elm,state,disabled", "elm");
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_freeze_set(EINA_TRUE));
|
2014-01-20 01:04:30 -08:00
|
|
|
}
|
2012-11-02 01:15:24 -07:00
|
|
|
sd->disabled = EINA_TRUE;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else
|
2012-11-02 01:15:24 -07:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,enabled", "elm");
|
2013-04-16 01:59:02 -07:00
|
|
|
if (sd->scroll)
|
2014-01-20 01:04:30 -08:00
|
|
|
{
|
2014-01-21 18:32:08 -08:00
|
|
|
edje_object_signal_emit(sd->scr_edje, "elm,state,enabled", "elm");
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_freeze_set(EINA_FALSE));
|
2014-01-20 01:04:30 -08:00
|
|
|
}
|
2012-11-02 01:15:24 -07:00
|
|
|
sd->disabled = EINA_FALSE;
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
sd->drop_format = _get_drop_format(obj);
|
|
|
|
elm_drop_target_add(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2012-11-02 01:15:24 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-02-08 04:08:28 -08:00
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
/* we can't issue the layout's theming code here, cause it assumes an
|
|
|
|
* unique edje object, always */
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_theme_apply(Eo *obj, Elm_Entry_Data *sd)
|
2008-11-15 05:58:50 -08:00
|
|
|
{
|
2013-07-09 02:40:47 -07:00
|
|
|
const char *str;
|
2009-02-25 07:54:26 -08:00
|
|
|
const char *t;
|
2014-01-08 00:42:55 -08:00
|
|
|
const char *style = elm_widget_style_get(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool int_ret = EINA_FALSE;
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
|
2014-03-22 10:44:29 -07:00
|
|
|
if (!int_ret) return EINA_FALSE;
|
2011-09-29 05:02:49 -07:00
|
|
|
|
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
edje_object_mirrored_set
|
2012-11-25 22:32:53 -08:00
|
|
|
(wd->resize_obj, elm_widget_mirrored_get(obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
edje_object_scale_set
|
2012-11-25 22:32:53 -08:00
|
|
|
(wd->resize_obj,
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_widget_scale_get(obj) * elm_config_scale_get());
|
|
|
|
|
2011-02-08 04:08:28 -08:00
|
|
|
_mirrored_set(obj, elm_widget_mirrored_get(obj));
|
2009-09-26 11:00:51 -07:00
|
|
|
|
2011-12-30 02:02:19 -08:00
|
|
|
t = eina_stringshare_add(elm_object_text_get(obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(obj, sd->entry_edje, "entry", _elm_entry_theme_group_get(obj), style);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-02-07 06:13:46 -08:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", _elm_config->desktop_entry);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-12-30 02:02:19 -08:00
|
|
|
elm_object_text_set(obj, t);
|
2009-02-25 07:54:26 -08:00
|
|
|
eina_stringshare_del(t);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-10-07 00:44:50 -07:00
|
|
|
if (elm_widget_disabled_get(obj))
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,disabled", "elm");
|
|
|
|
|
|
|
|
edje_object_part_text_input_panel_layout_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Panel_Layout)sd->input_panel_layout);
|
2013-03-27 01:34:19 -07:00
|
|
|
edje_object_part_text_input_panel_layout_variation_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_layout_variation);
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_autocapital_type_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Text_Autocapital_Type)sd->autocapital_type);
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_prediction_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->prediction_allow);
|
2014-09-01 03:04:05 -07:00
|
|
|
edje_object_part_text_input_hint_set
|
2015-07-29 07:26:14 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Hints)sd->input_hints);
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_enabled_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_enable);
|
|
|
|
edje_object_part_text_input_panel_imdata_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_imdata,
|
|
|
|
sd->input_panel_imdata_len);
|
|
|
|
edje_object_part_text_input_panel_return_key_type_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Panel_Return_Key_Type)sd->input_panel_return_key_type);
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_return_key_disabled_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_return_key_disabled);
|
2014-01-13 02:32:01 -08:00
|
|
|
edje_object_part_text_input_panel_show_on_demand_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_show_on_demand);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-10-21 04:59:43 -07:00
|
|
|
// elm_entry_cursor_pos_set -> cursor,changed -> widget_show_region_set
|
|
|
|
// -> smart_objects_calculate will call all smart calculate functions,
|
|
|
|
// and one of them can delete elm_entry.
|
|
|
|
evas_object_ref(obj);
|
|
|
|
|
2011-03-17 01:18:16 -07:00
|
|
|
if (elm_widget_focus_get(obj))
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,action,focus", "elm");
|
|
|
|
|
|
|
|
edje_object_message_signal_process(sd->entry_edje);
|
|
|
|
|
2015-07-28 12:00:58 -07:00
|
|
|
Evas_Object* clip = evas_object_clip_get(sd->entry_edje);
|
|
|
|
evas_object_clip_set(sd->hit_rect, clip);
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2013-03-11 06:17:53 -07:00
|
|
|
Eina_Bool ok = EINA_FALSE;
|
2013-09-30 03:21:31 -07:00
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_mirrored_set(elm_widget_mirrored_get(obj)));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-03-11 06:17:53 -07:00
|
|
|
if (sd->single_line)
|
|
|
|
ok = elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(obj, sd->scr_edje, "scroller", "entry_single", style);
|
2013-03-11 06:17:53 -07:00
|
|
|
if (!ok)
|
|
|
|
elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(obj, sd->scr_edje, "scroller", "entry", style);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
str = edje_object_data_get(sd->scr_edje, "focus_highlight");
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2013-07-09 02:40:47 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
str = edje_object_data_get(sd->entry_edje, "focus_highlight");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((str) && (!strcmp(str, "on")))
|
|
|
|
elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
|
|
|
|
else
|
|
|
|
elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
if (sd->start_handler)
|
|
|
|
{
|
|
|
|
elm_widget_theme_object_set(obj, sd->start_handler,
|
|
|
|
"entry", "handler/start", style);
|
|
|
|
elm_widget_theme_object_set(obj, sd->end_handler,
|
|
|
|
"entry", "handler/end", style);
|
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2013-03-11 06:17:53 -07:00
|
|
|
sd->changed = EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
|
|
|
sd->has_text = !sd->has_text;
|
|
|
|
_elm_entry_guide_update(obj, !sd->has_text);
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
2008-11-15 05:58:50 -08:00
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_LAYOUT_EVENT_THEME_CHANGED, NULL));
|
2009-09-26 11:00:51 -07:00
|
|
|
|
2013-10-21 04:59:43 -07:00
|
|
|
evas_object_unref(obj);
|
2013-10-21 03:45:53 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2009-08-26 05:51:27 -07:00
|
|
|
}
|
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_cursor_geometry_recalc(Evas_Object *obj)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_ENTRY_EVENT_CURSOR_CHANGED, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (!sd->deferred_recalc_job)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
|
|
|
Evas_Coord cx, cy, cw, ch;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
edje_object_part_text_cursor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch);
|
|
|
|
if (sd->cur_changed)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->cur_changed = EINA_FALSE;
|
2013-10-21 03:45:53 -07:00
|
|
|
elm_widget_show_region_set(obj, cx, cy, cw, ch, EINA_FALSE);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->deferred_cur = EINA_TRUE;
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
2008-10-17 20:55:44 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_deferred_recalc_job(void *data)
|
2008-10-17 20:55:44 -07:00
|
|
|
{
|
2011-07-21 04:02:07 -07:00
|
|
|
Evas_Coord minh = -1, resw = -1, minw = -1, fw = 0, fh = 0;
|
2011-04-28 10:50:26 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
sd->deferred_recalc_job = NULL;
|
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, NULL, NULL, &resw, NULL);
|
|
|
|
edje_object_size_min_restricted_calc(sd->entry_edje, &minw, &minh, resw, 0);
|
2011-12-06 07:52:05 -08:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-04-28 08:47:01 -07:00
|
|
|
/* This is a hack to workaround the way min size hints are treated.
|
2012-08-30 09:45:15 -07:00
|
|
|
* If the minimum width is smaller than the restricted width, it
|
|
|
|
* means the minimum doesn't matter. */
|
2011-04-28 08:47:01 -07:00
|
|
|
if (minw <= resw)
|
|
|
|
{
|
|
|
|
Evas_Coord ominw = -1;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-04-28 08:47:01 -07:00
|
|
|
evas_object_size_hint_min_get(data, &ominw, NULL);
|
|
|
|
minw = ominw;
|
|
|
|
}
|
2011-07-21 04:30:05 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->ent_mw = minw;
|
|
|
|
sd->ent_mh = minh;
|
2011-12-06 07:52:11 -08:00
|
|
|
|
2011-07-21 04:02:07 -07:00
|
|
|
elm_coords_finger_size_adjust(1, &fw, 1, &fh);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->scroll)
|
2011-07-21 04:02:07 -07:00
|
|
|
{
|
|
|
|
Evas_Coord vmw = 0, vmh = 0;
|
2011-07-21 04:30:05 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh);
|
|
|
|
if (sd->single_line)
|
2011-07-21 04:02:07 -07:00
|
|
|
{
|
|
|
|
evas_object_size_hint_min_set(data, vmw, minh + vmh);
|
|
|
|
evas_object_size_hint_max_set(data, -1, minh + vmh);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_size_hint_min_set(data, vmw, vmh);
|
|
|
|
evas_object_size_hint_max_set(data, -1, -1);
|
|
|
|
}
|
|
|
|
}
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2011-07-21 04:02:07 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line)
|
2011-07-21 04:02:07 -07:00
|
|
|
{
|
|
|
|
evas_object_size_hint_min_set(data, minw, minh);
|
|
|
|
evas_object_size_hint_max_set(data, -1, minh);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_size_hint_min_set(data, fw, minh);
|
|
|
|
evas_object_size_hint_max_set(data, -1, -1);
|
|
|
|
}
|
|
|
|
}
|
2011-04-07 01:47:18 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->deferred_cur)
|
2011-04-28 10:50:26 -07:00
|
|
|
{
|
|
|
|
Evas_Coord cx, cy, cw, ch;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
edje_object_part_text_cursor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch);
|
|
|
|
if (sd->cur_changed)
|
2011-05-18 04:48:38 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->cur_changed = EINA_FALSE;
|
2013-10-21 03:45:53 -07:00
|
|
|
elm_widget_show_region_set(data, cx, cy, cw, ch, EINA_FALSE);
|
2011-05-18 04:48:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_layout_sizing_eval(Eo *obj, Elm_Entry_Data *sd)
|
2008-10-14 01:05:30 -07:00
|
|
|
{
|
2011-04-07 01:47:18 -07:00
|
|
|
Evas_Coord minw = -1, minh = -1;
|
2010-03-09 03:42:53 -08:00
|
|
|
Evas_Coord resw, resh;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
evas_object_geometry_get(obj, NULL, NULL, &resw, &resh);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->line_wrap)
|
2008-10-17 07:40:54 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((resw == sd->last_w) && (!sd->changed))
|
2012-08-20 00:35:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->scroll)
|
2012-08-20 00:35:31 -07:00
|
|
|
{
|
|
|
|
Evas_Coord vw = 0, vh = 0, w = 0, h = 0;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
entry: wrong viewport value calculation issue fix
Summary:
Issue: As entire scroller edje co-ordinates was being taken instead of the actual viewport value,
if in scroller edje more parts are added apart from just "elm.swallow.content", then the viewport value
set will be wrong. hence the selection handlers will not hide when they have to hide.
solution: Instead of taking scroller edje's geometry, get the actual viewport values.
To get viewport x,y a new scrollable interface is also added.
signed-off by: Shilpa Singh <shilpa.singh@samsung.com>
@fix
Test Plan: Selection handlers have to hide correctly when the text is scrolled in a scrolled entry, if the scroller edc of entry has more parts added other than elm.swallow.content, then when we scroll the selection handlers are not hidden correctly.
Reviewers: jaehwan, woohyun, seoz, Hermet, raster
CC: govi, rajeshps, thiepha
Differential Revision: https://phab.enlightenment.org/D674
2014-04-20 20:31:49 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
|
|
|
|
(NULL, NULL, &vw, &vh));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
w = sd->ent_mw;
|
|
|
|
h = sd->ent_mh;
|
|
|
|
if (vw > sd->ent_mw) w = vw;
|
|
|
|
if (vh > sd->ent_mh) h = vh;
|
|
|
|
evas_object_resize(sd->entry_edje, w, h);
|
|
|
|
|
2012-08-20 00:35:31 -07:00
|
|
|
return;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-08-20 00:35:31 -07:00
|
|
|
return;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->changed = EINA_FALSE;
|
|
|
|
sd->last_w = resw;
|
|
|
|
if (sd->scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
|
|
|
Evas_Coord vw = 0, vh = 0, vmw = 0, vmh = 0, w = -1, h = -1;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_resize(sd->scr_edje, resw, resh);
|
|
|
|
edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh);
|
entry: wrong viewport value calculation issue fix
Summary:
Issue: As entire scroller edje co-ordinates was being taken instead of the actual viewport value,
if in scroller edje more parts are added apart from just "elm.swallow.content", then the viewport value
set will be wrong. hence the selection handlers will not hide when they have to hide.
solution: Instead of taking scroller edje's geometry, get the actual viewport values.
To get viewport x,y a new scrollable interface is also added.
signed-off by: Shilpa Singh <shilpa.singh@samsung.com>
@fix
Test Plan: Selection handlers have to hide correctly when the text is scrolled in a scrolled entry, if the scroller edc of entry has more parts added other than elm.swallow.content, then when we scroll the selection handlers are not hidden correctly.
Reviewers: jaehwan, woohyun, seoz, Hermet, raster
CC: govi, rajeshps, thiepha
Differential Revision: https://phab.enlightenment.org/D674
2014-04-20 20:31:49 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
|
|
|
|
(NULL, NULL, &vw, &vh));
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_size_min_restricted_calc
|
|
|
|
(sd->entry_edje, &minw, &minh, vw, 0);
|
2011-12-06 07:52:11 -08:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
/* This is a hack to workaround the way min size hints
|
|
|
|
* are treated. If the minimum width is smaller than the
|
|
|
|
* restricted width, it means the minimum doesn't
|
|
|
|
* matter. */
|
2011-12-06 07:52:11 -08:00
|
|
|
if (minw <= vw)
|
|
|
|
{
|
|
|
|
Evas_Coord ominw = -1;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
evas_object_size_hint_min_get(sd->entry_edje, &ominw, NULL);
|
2011-12-06 07:52:11 -08:00
|
|
|
minw = ominw;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->ent_mw = minw;
|
|
|
|
sd->ent_mh = minh;
|
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
if ((minw > 0) && (vw < minw)) vw = minw;
|
|
|
|
if (minh > vh) vh = minh;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line) h = vmh + minh;
|
2011-06-17 02:44:31 -07:00
|
|
|
else h = vmh;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
evas_object_resize(sd->entry_edje, vw, vh);
|
2011-06-17 02:44:31 -07:00
|
|
|
evas_object_size_hint_min_set(obj, w, h);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->single_line)
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, h);
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, -1);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-01-21 06:16:41 -08:00
|
|
|
ecore_job_del(sd->deferred_recalc_job);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->deferred_recalc_job =
|
|
|
|
ecore_job_add(_deferred_recalc_job, obj);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
2008-10-17 07:40:54 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->changed) return;
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->changed = EINA_FALSE;
|
|
|
|
sd->last_w = resw;
|
|
|
|
if (sd->scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
|
|
|
Evas_Coord vw = 0, vh = 0, vmw = 0, vmh = 0, w = -1, h = -1;
|
2011-07-03 00:49:02 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_size_min_calc(sd->entry_edje, &minw, &minh);
|
|
|
|
sd->ent_mw = minw;
|
|
|
|
sd->ent_mh = minh;
|
2011-06-17 02:44:31 -07:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
2011-07-03 00:49:02 -07:00
|
|
|
|
entry: wrong viewport value calculation issue fix
Summary:
Issue: As entire scroller edje co-ordinates was being taken instead of the actual viewport value,
if in scroller edje more parts are added apart from just "elm.swallow.content", then the viewport value
set will be wrong. hence the selection handlers will not hide when they have to hide.
solution: Instead of taking scroller edje's geometry, get the actual viewport values.
To get viewport x,y a new scrollable interface is also added.
signed-off by: Shilpa Singh <shilpa.singh@samsung.com>
@fix
Test Plan: Selection handlers have to hide correctly when the text is scrolled in a scrolled entry, if the scroller edc of entry has more parts added other than elm.swallow.content, then when we scroll the selection handlers are not hidden correctly.
Reviewers: jaehwan, woohyun, seoz, Hermet, raster
CC: govi, rajeshps, thiepha
Differential Revision: https://phab.enlightenment.org/D674
2014-04-20 20:31:49 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
|
|
|
|
(NULL, NULL, &vw, &vh));
|
2011-06-17 02:44:31 -07:00
|
|
|
|
2012-01-29 03:55:29 -08:00
|
|
|
if (minw > vw) vw = minw;
|
|
|
|
if (minh > vh) vh = minh;
|
2011-06-17 02:44:31 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_resize(sd->entry_edje, vw, vh);
|
|
|
|
edje_object_size_min_calc(sd->scr_edje, &vmw, &vmh);
|
|
|
|
if (sd->single_line) h = vmh + minh;
|
2011-06-17 02:44:31 -07:00
|
|
|
else h = vmh;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
evas_object_size_hint_min_set(obj, w, h);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line)
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, h);
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, -1);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_size_min_calc(sd->entry_edje, &minw, &minh);
|
|
|
|
sd->ent_mw = minw;
|
|
|
|
sd->ent_mh = minh;
|
2011-06-17 02:44:31 -07:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
|
|
|
evas_object_size_hint_min_set(obj, minw, minh);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->single_line)
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, minh);
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2011-07-11 21:51:39 -07:00
|
|
|
evas_object_size_hint_max_set(obj, -1, -1);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
2008-10-17 07:40:54 -07:00
|
|
|
}
|
2011-05-18 04:48:38 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_cursor_geometry_recalc(obj);
|
2008-10-14 01:05:30 -07:00
|
|
|
}
|
|
|
|
|
2012-02-27 17:50:19 -08:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_return_key_enabled_check(Evas_Object *obj)
|
2012-02-27 17:50:19 -08:00
|
|
|
{
|
|
|
|
Eina_Bool return_key_disabled = EINA_FALSE;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!sd->auto_return_key) return;
|
2012-02-27 17:50:19 -08:00
|
|
|
|
|
|
|
if (elm_entry_is_empty(obj) == EINA_TRUE)
|
|
|
|
return_key_disabled = EINA_TRUE;
|
|
|
|
|
|
|
|
elm_entry_input_panel_return_key_disabled_set(obj, return_key_disabled);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2015-09-15 03:41:51 -07:00
|
|
|
_elm_entry_elm_widget_on_focus(Eo *obj, Elm_Entry_Data *sd, Elm_Object_Item *item EINA_UNUSED)
|
2008-10-14 01:05:30 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
Evas_Object *top;
|
2013-07-05 03:04:14 -07:00
|
|
|
Eina_Bool top_is_win = EINA_FALSE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
top = elm_widget_top_get(obj);
|
2014-06-03 03:35:28 -07:00
|
|
|
if (top && eo_isa(top, ELM_WIN_CLASS))
|
2012-09-28 07:07:16 -07:00
|
|
|
top_is_win = EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
if (!sd->editable) return EINA_FALSE;
|
2008-11-16 21:58:21 -08:00
|
|
|
if (elm_widget_focus_get(obj))
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_focus_set(sd->entry_edje, EINA_TRUE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,action,focus", "elm");
|
2014-01-13 02:32:01 -08:00
|
|
|
if (top && top_is_win && sd->input_panel_enable && !sd->input_panel_show_on_demand &&
|
2013-07-13 02:58:30 -07:00
|
|
|
!edje_object_part_text_imf_context_get(sd->entry_edje, "elm.text"))
|
2011-10-26 22:43:08 -07:00
|
|
|
elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_ON);
|
2015-07-05 23:21:40 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_WIDGET_EVENT_FOCUSED, NULL));
|
2015-05-13 00:57:16 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
|
|
|
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_TRUE);
|
2012-08-30 09:45:15 -07:00
|
|
|
_return_key_enabled_check(obj);
|
2015-04-02 02:37:37 -07:00
|
|
|
_validate(obj);
|
2008-11-16 21:58:21 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,action,unfocus", "elm");
|
|
|
|
evas_object_focus_set(sd->entry_edje, EINA_FALSE);
|
2013-07-13 02:58:30 -07:00
|
|
|
if (top && top_is_win && sd->input_panel_enable &&
|
|
|
|
!edje_object_part_text_imf_context_get(sd->entry_edje, "elm.text"))
|
2011-10-26 22:43:08 -07:00
|
|
|
elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
|
2015-07-05 23:21:40 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_WIDGET_EVENT_UNFOCUSED, NULL));
|
2015-05-13 00:57:16 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
|
|
|
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_FALSE);
|
2012-11-29 00:58:49 -08:00
|
|
|
|
|
|
|
if (_elm_config->selection_clear_enable)
|
|
|
|
{
|
|
|
|
if ((sd->have_selection) && (!sd->hoversel))
|
|
|
|
{
|
|
|
|
sd->sel_mode = EINA_FALSE;
|
|
|
|
elm_widget_scroll_hold_pop(obj);
|
|
|
|
edje_object_part_text_select_allow_set(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
|
|
|
edje_object_part_text_select_none(sd->entry_edje, "elm.text");
|
|
|
|
}
|
|
|
|
}
|
2015-04-02 02:37:37 -07:00
|
|
|
edje_object_signal_emit(sd->scr_edje, "validation,default", "elm");
|
2008-11-16 21:58:21 -08:00
|
|
|
}
|
2011-10-11 19:49:23 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-08-18 21:21:36 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_on_focus_region(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
|
2011-10-19 07:17:14 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_cursor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", x, y, w, h);
|
2015-11-23 08:44:57 -08:00
|
|
|
|
|
|
|
if (sd->single_line)
|
|
|
|
{
|
|
|
|
evas_object_geometry_get(sd->entry_edje, NULL, NULL, NULL, h);
|
|
|
|
if (y) *y = 0;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2010-06-15 08:04:05 -07:00
|
|
|
}
|
|
|
|
|
2010-10-22 11:29:51 -07:00
|
|
|
static void
|
2012-11-25 22:32:53 -08:00
|
|
|
_show_region_hook(void *data EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
Evas_Object *obj)
|
2010-10-22 11:29:51 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
Evas_Coord x, y, w, h;
|
2010-10-22 11:29:51 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
elm_widget_show_region_get(obj, &x, &y, &w, &h);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_region_show(x, y, w, h));
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_sub_object_del(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Evas_Object *sobj)
|
2011-10-11 19:49:23 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
Eina_Bool ret = EINA_FALSE;
|
2012-08-30 09:45:15 -07:00
|
|
|
/* unfortunately entry doesn't follow the signal pattern
|
|
|
|
* elm,state,icon,{visible,hidden}, so we have to replicate this
|
|
|
|
* smart function */
|
|
|
|
if (sobj == elm_layout_content_get(obj, "elm.swallow.icon"))
|
2011-10-11 19:49:23 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,hide,icon", "elm");
|
2011-10-11 19:49:23 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else if (sobj == elm_layout_content_get(obj, "elm.swallow.end"))
|
2011-10-11 19:49:23 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,hide,end", "elm");
|
2011-10-11 19:49:23 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, ret = elm_obj_widget_sub_object_del(sobj));
|
2014-03-22 10:44:29 -07:00
|
|
|
if (!ret) return EINA_FALSE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-10-11 19:49:23 -07:00
|
|
|
}
|
|
|
|
|
2009-03-19 06:36:46 -07:00
|
|
|
static void
|
|
|
|
_hoversel_position(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Evas_Coord cx, cy, cw, ch, x, y, mw, mh;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
elementary / entry, list, scroller, fileselector_button, config, photocam, map, pan, bg, store, priv, pager, conform, box, clock, flipselector
fixed indentation, removed white spaces.
SVN revision: 58267
2011-04-01 12:08:56 -07:00
|
|
|
|
2011-04-01 05:10:24 -07:00
|
|
|
cx = cy = 0;
|
|
|
|
cw = ch = 1;
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_geometry_get(sd->entry_edje, &x, &y, NULL, NULL);
|
|
|
|
if (sd->use_down)
|
2011-04-01 05:10:24 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
cx = sd->downx - x;
|
|
|
|
cy = sd->downy - y;
|
2011-04-01 05:10:24 -07:00
|
|
|
cw = 1;
|
|
|
|
ch = 1;
|
|
|
|
}
|
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_cursor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch);
|
|
|
|
|
|
|
|
evas_object_size_hint_min_get(sd->hoversel, &mw, &mh);
|
2009-03-19 06:36:46 -07:00
|
|
|
if (cw < mw)
|
|
|
|
{
|
2011-03-14 19:01:42 -07:00
|
|
|
cx += (cw - mw) / 2;
|
|
|
|
cw = mw;
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
if (ch < mh)
|
|
|
|
{
|
2011-03-14 19:01:42 -07:00
|
|
|
cy += (ch - mh) / 2;
|
|
|
|
ch = mh;
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_move(sd->hoversel, x + cx, y + cy);
|
|
|
|
evas_object_resize(sd->hoversel, cw, ch);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_hover_del_job(void *data)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
2009-03-19 06:36:46 -07:00
|
|
|
|
2013-07-03 04:29:43 -07:00
|
|
|
ELM_SAFE_FREE(sd->hoversel, evas_object_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->hov_deljob = NULL;
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
static Eina_Bool
|
2012-08-30 09:45:15 -07:00
|
|
|
_hover_dismissed_cb(void *data,
|
2015-05-10 07:50:04 -07:00
|
|
|
Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
|
2014-01-06 06:30:02 -08:00
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
2010-06-23 19:54:03 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->use_down = 0;
|
|
|
|
if (sd->hoversel) evas_object_hide(sd->hoversel);
|
|
|
|
if (sd->sel_mode)
|
2010-03-25 21:45:11 -07:00
|
|
|
{
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->password)
|
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_TRUE);
|
2011-04-01 06:20:40 -07:00
|
|
|
}
|
2010-03-25 21:45:11 -07:00
|
|
|
}
|
2009-03-20 08:08:33 -07:00
|
|
|
elm_widget_scroll_freeze_pop(data);
|
2014-01-21 06:16:41 -08:00
|
|
|
ecore_job_del(sd->hov_deljob);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->hov_deljob = ecore_job_add(_hover_del_job, data);
|
2015-05-10 07:50:04 -07:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_hover_selected_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
sd->sel_mode = EINA_TRUE;
|
|
|
|
edje_object_part_text_select_none(sd->entry_edje, "elm.text");
|
|
|
|
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->password)
|
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_TRUE);
|
2011-04-01 06:20:40 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,on", "elm");
|
|
|
|
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2011-04-21 19:29:54 -07:00
|
|
|
elm_widget_scroll_hold_push(data);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
static char *
|
2012-08-30 09:45:15 -07:00
|
|
|
_item_tags_remove(const char *str)
|
2012-03-05 00:26:09 -08:00
|
|
|
{
|
|
|
|
char *ret;
|
2012-08-30 09:45:15 -07:00
|
|
|
Eina_Strbuf *buf;
|
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
if (!str)
|
|
|
|
return NULL;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
buf = eina_strbuf_new();
|
2012-03-05 00:26:09 -08:00
|
|
|
if (!buf)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!eina_strbuf_append(buf, str))
|
2012-12-21 03:03:10 -08:00
|
|
|
{
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-03-05 00:26:09 -08:00
|
|
|
|
|
|
|
while (EINA_TRUE)
|
|
|
|
{
|
|
|
|
const char *temp = eina_strbuf_string_get(buf);
|
2012-08-30 09:45:15 -07:00
|
|
|
char *start_tag = NULL;
|
|
|
|
char *end_tag = NULL;
|
|
|
|
size_t sindex;
|
|
|
|
size_t eindex;
|
|
|
|
|
|
|
|
start_tag = strstr(temp, "<item");
|
|
|
|
if (!start_tag)
|
|
|
|
start_tag = strstr(temp, "</item");
|
|
|
|
if (start_tag)
|
|
|
|
end_tag = strstr(start_tag, ">");
|
2012-03-05 00:26:09 -08:00
|
|
|
else
|
|
|
|
break;
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!end_tag || start_tag > end_tag)
|
2012-03-05 00:26:09 -08:00
|
|
|
break;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sindex = start_tag - temp;
|
|
|
|
eindex = end_tag - temp + 1;
|
2012-03-05 00:26:09 -08:00
|
|
|
if (!eina_strbuf_remove(buf, sindex, eindex))
|
|
|
|
break;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
ret = eina_strbuf_string_steal(buf);
|
|
|
|
eina_strbuf_free(buf);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-08-03 02:00:36 -07:00
|
|
|
void
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_entry_paste(Evas_Object *obj,
|
|
|
|
const char *entry)
|
2011-08-03 02:00:36 -07:00
|
|
|
{
|
2012-03-05 00:26:09 -08:00
|
|
|
char *str = NULL;
|
2012-03-28 02:02:22 -07:00
|
|
|
|
2015-08-05 23:12:24 -07:00
|
|
|
if (!entry) return;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_CHECK(obj);
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (sd->cnp_mode == ELM_CNP_MODE_NO_IMAGE)
|
2012-03-05 00:26:09 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
str = _item_tags_remove(entry);
|
2012-03-05 00:31:58 -08:00
|
|
|
if (!str) str = strdup(entry);
|
2012-03-05 00:26:09 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
str = strdup(entry);
|
2012-03-05 00:31:58 -08:00
|
|
|
if (!str) str = (char *)entry;
|
2012-03-05 00:26:09 -08:00
|
|
|
|
2015-06-16 06:41:55 -07:00
|
|
|
_edje_entry_user_insert(obj, str);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-03-05 00:31:58 -08:00
|
|
|
if (str != entry) free(str);
|
2011-08-03 02:00:36 -07:00
|
|
|
}
|
|
|
|
|
2009-03-19 06:36:46 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_paste_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2013-11-07 04:01:00 -08:00
|
|
|
Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_PASTE, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
sd->selection_asked = EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT)
|
|
|
|
formats = ELM_SEL_FORMAT_TEXT;
|
|
|
|
else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
|
|
|
|
formats |= ELM_SEL_FORMAT_IMAGE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
elm_cnp_selection_get
|
2015-06-09 01:04:48 -07:00
|
|
|
(data, ELM_SEL_TYPE_CLIPBOARD, formats, _selection_data_cb, NULL);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
2015-06-23 08:11:05 -07:00
|
|
|
static void
|
|
|
|
_selection_clear(void *data, Elm_Sel_Type selection)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
if (!sd->have_selection) return;
|
|
|
|
if ((selection == ELM_SEL_TYPE_CLIPBOARD) ||
|
|
|
|
(selection == ELM_SEL_TYPE_PRIMARY))
|
|
|
|
{
|
|
|
|
elm_entry_select_none(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-19 06:36:46 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_selection_store(Elm_Sel_Type seltype,
|
|
|
|
Evas_Object *obj)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2010-06-05 21:09:56 -07:00
|
|
|
const char *sel;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
sel = edje_object_part_text_selection_get(sd->entry_edje, "elm.text");
|
|
|
|
if ((!sel) || (!sel[0])) return; /* avoid deleting our own selection */
|
|
|
|
|
|
|
|
elm_cnp_selection_set
|
|
|
|
(obj, seltype, ELM_SEL_FORMAT_MARKUP, sel, strlen(sel));
|
2015-06-23 08:11:05 -07:00
|
|
|
elm_cnp_selection_loss_callback_set(obj, seltype, _selection_clear, obj);
|
2011-12-27 03:24:13 -08:00
|
|
|
if (seltype == ELM_SEL_TYPE_CLIPBOARD)
|
2012-08-30 09:45:15 -07:00
|
|
|
eina_stringshare_replace(&sd->cut_sel, sel);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_cut_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
2009-09-26 11:00:51 -07:00
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_CUT, NULL));
|
2010-06-17 01:50:43 -07:00
|
|
|
/* Store it */
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->sel_mode = EINA_FALSE;
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
|
|
|
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2011-04-21 19:29:54 -07:00
|
|
|
elm_widget_scroll_hold_pop(data);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
_selection_store(ELM_SEL_TYPE_CLIPBOARD, data);
|
2015-06-16 06:41:55 -07:00
|
|
|
_edje_entry_user_insert(data, "");
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_copy_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_COPY, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->sel_mode = EINA_FALSE;
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
2011-04-01 06:20:40 -07:00
|
|
|
elm_widget_scroll_hold_pop(data);
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
_selection_store(ELM_SEL_TYPE_CLIPBOARD, data);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
2009-03-22 21:55:37 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_hover_cancel_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-03-22 21:55:37 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
sd->sel_mode = EINA_FALSE;
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2011-04-21 19:29:54 -07:00
|
|
|
elm_widget_scroll_hold_pop(data);
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_none(sd->entry_edje, "elm.text");
|
2009-03-22 21:55:37 -07:00
|
|
|
}
|
|
|
|
|
2009-09-02 05:48:00 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_hover_item_clicked_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2009-09-02 05:48:00 -07:00
|
|
|
{
|
|
|
|
Elm_Entry_Context_Menu_Item *it = data;
|
2013-02-27 04:06:05 -08:00
|
|
|
if (!it) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-02-27 04:06:05 -08:00
|
|
|
if (it->func) it->func(it->data, it->obj, it);
|
2009-09-02 05:48:00 -07:00
|
|
|
}
|
|
|
|
|
2011-04-01 05:10:24 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_menu_call(Evas_Object *obj)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2009-05-13 05:21:52 -07:00
|
|
|
Evas_Object *top;
|
2009-09-02 05:48:00 -07:00
|
|
|
const Eina_List *l;
|
|
|
|
const Elm_Entry_Context_Menu_Item *it;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2013-07-02 21:12:30 -07:00
|
|
|
if (sd->anchor_hover.hover) return;
|
2015-06-03 02:41:13 -07:00
|
|
|
|
|
|
|
eo_do(obj, eo_event_callback_call(ELM_ENTRY_EVENT_CONTEXT_OPEN, NULL));
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->api) && (sd->api->obj_longpress))
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->api->obj_longpress(obj);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else if (sd->context_menu)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2010-01-18 02:28:00 -08:00
|
|
|
const char *context_menu_orientation;
|
2013-02-17 06:36:00 -08:00
|
|
|
Eina_Bool ownersel;
|
2010-02-08 19:27:11 -08:00
|
|
|
|
2013-02-17 06:36:00 -08:00
|
|
|
ownersel = elm_selection_selection_has_owner(obj);
|
|
|
|
if (!sd->items)
|
|
|
|
{
|
|
|
|
/* prevent stupid blank hoversel */
|
|
|
|
if (sd->have_selection && sd->password) return;
|
2014-05-14 05:26:33 -07:00
|
|
|
if (_elm_config->desktop_entry && (!sd->have_selection) && ((!sd->editable) || (!ownersel)))
|
|
|
|
return;
|
2013-02-17 06:36:00 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->hoversel) evas_object_del(sd->hoversel);
|
2011-04-01 05:10:24 -07:00
|
|
|
else elm_widget_scroll_freeze_push(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
sd->hoversel = elm_hoversel_add(obj);
|
2010-01-18 02:28:00 -08:00
|
|
|
context_menu_orientation = edje_object_data_get
|
2012-08-30 09:45:15 -07:00
|
|
|
(sd->entry_edje, "context_menu_orientation");
|
|
|
|
|
2010-01-18 02:28:00 -08:00
|
|
|
if ((context_menu_orientation) &&
|
|
|
|
(!strcmp(context_menu_orientation, "horizontal")))
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_hoversel_horizontal_set(sd->hoversel, EINA_TRUE);
|
|
|
|
|
|
|
|
elm_object_style_set(sd->hoversel, "entry");
|
|
|
|
elm_widget_sub_object_add(obj, sd->hoversel);
|
|
|
|
elm_object_text_set(sd->hoversel, "Text");
|
2011-04-01 05:10:24 -07:00
|
|
|
top = elm_widget_top_get(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (top) elm_hoversel_hover_parent_set(sd->hoversel, top);
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(sd->hoversel, eo_event_callback_add
|
2015-07-09 04:25:38 -07:00
|
|
|
(ELM_HOVERSEL_EVENT_DISMISSED, _hover_dismissed_cb, obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->have_selection)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->password)
|
2010-01-27 01:23:54 -08:00
|
|
|
{
|
2012-11-22 07:15:55 -08:00
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Copy"), NULL, ELM_ICON_NONE,
|
|
|
|
_copy_cb, obj);
|
|
|
|
if (sd->editable)
|
2013-12-29 02:34:31 -08:00
|
|
|
{
|
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Cut"), NULL, ELM_ICON_NONE,
|
|
|
|
_cut_cb, obj);
|
|
|
|
if (ownersel)
|
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Paste"), NULL, ELM_ICON_NONE,
|
|
|
|
_paste_cb, obj);
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Cancel"), NULL, ELM_ICON_NONE,
|
|
|
|
_hover_cancel_cb, obj);
|
2010-01-27 01:23:54 -08:00
|
|
|
}
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
2011-04-01 06:35:39 -07:00
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->sel_mode)
|
2011-04-01 06:35:39 -07:00
|
|
|
{
|
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->password)
|
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Select"), NULL, ELM_ICON_NONE,
|
|
|
|
_hover_selected_cb, obj);
|
2011-04-01 06:35:39 -07:00
|
|
|
}
|
2013-02-17 06:36:00 -08:00
|
|
|
if (ownersel)
|
2011-04-01 06:35:39 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->editable)
|
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Paste"), NULL, ELM_ICON_NONE,
|
|
|
|
_paste_cb, obj);
|
2011-04-01 06:35:39 -07:00
|
|
|
}
|
|
|
|
}
|
2012-11-22 07:15:55 -08:00
|
|
|
else
|
|
|
|
elm_hoversel_item_add
|
|
|
|
(sd->hoversel, E_("Cancel"), NULL, ELM_ICON_NONE,
|
|
|
|
_hover_cancel_cb, obj);
|
2011-04-01 06:35:39 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->items, l, it)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_hoversel_item_add(sd->hoversel, it->label, it->icon_file,
|
|
|
|
it->icon_type, _hover_item_clicked_cb, it);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->hoversel)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2011-04-01 05:10:24 -07:00
|
|
|
_hoversel_position(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_show(sd->hoversel);
|
|
|
|
elm_hoversel_hover_begin(sd->hoversel);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_part_text_select_abort(sd->entry_edje, "elm.text");
|
2011-04-01 06:20:40 -07:00
|
|
|
}
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2011-04-01 05:10:24 -07:00
|
|
|
}
|
|
|
|
|
2013-11-14 05:51:03 -08:00
|
|
|
static void _magnifier_move(void *data, Evas_Coord cx, Evas_Coord cy);
|
|
|
|
|
|
|
|
static void
|
|
|
|
_magnifier_proxy_update(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
2014-02-21 19:06:31 -08:00
|
|
|
if ((sd->start_handler_down) || (sd->end_handler_down))
|
|
|
|
{
|
|
|
|
Evas_Coord ex, ey, cx, cy, ch;
|
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL);
|
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje, "elm.text",
|
|
|
|
&cx, &cy, NULL, &ch);
|
|
|
|
_magnifier_move(data, ex + cx, ey + cy + (ch / 2));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_magnifier_move(data, sd->downx, sd->downy);
|
|
|
|
}
|
2013-11-14 05:51:03 -08:00
|
|
|
}
|
|
|
|
|
2013-06-07 01:17:30 -07:00
|
|
|
static void
|
|
|
|
_magnifier_create(void *data)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
double scale = _elm_config->magnifier_scale;
|
2013-11-12 20:29:28 -08:00
|
|
|
Evas *e;
|
2013-06-07 01:17:30 -07:00
|
|
|
Evas_Coord w, h, mw, mh;
|
|
|
|
|
2014-01-21 17:38:55 -08:00
|
|
|
evas_object_del(sd->mgf_proxy);
|
|
|
|
evas_object_del(sd->mgf_bg);
|
|
|
|
evas_object_del(sd->mgf_clip);
|
2013-06-07 01:17:30 -07:00
|
|
|
|
2013-11-12 20:29:28 -08:00
|
|
|
e = evas_object_evas_get(data);
|
|
|
|
|
2013-11-14 05:51:03 -08:00
|
|
|
//Bg
|
2013-11-12 20:29:28 -08:00
|
|
|
sd->mgf_bg = edje_object_add(e);
|
2013-06-07 01:17:30 -07:00
|
|
|
_elm_theme_object_set(data, sd->mgf_bg, "entry", "magnifier", "default");
|
|
|
|
evas_object_show(sd->mgf_bg);
|
|
|
|
|
2013-11-14 05:51:03 -08:00
|
|
|
//Proxy
|
|
|
|
sd->mgf_proxy = evas_object_image_add(e);
|
|
|
|
evas_object_event_callback_add(sd->mgf_proxy, EVAS_CALLBACK_RESIZE,
|
|
|
|
_magnifier_proxy_update, data);
|
|
|
|
evas_object_event_callback_add(sd->mgf_proxy, EVAS_CALLBACK_MOVE,
|
|
|
|
_magnifier_proxy_update, data);
|
|
|
|
edje_object_part_swallow(sd->mgf_bg, "elm.swallow.content", sd->mgf_proxy);
|
|
|
|
evas_object_image_source_set(sd->mgf_proxy, data);
|
|
|
|
evas_object_geometry_get(data, NULL, NULL, &w, &h);
|
|
|
|
|
|
|
|
//Clipper
|
2013-11-12 21:36:22 -08:00
|
|
|
sd->mgf_clip = evas_object_rectangle_add(e);
|
2013-11-14 05:51:03 -08:00
|
|
|
evas_object_show(sd->mgf_clip);
|
|
|
|
evas_object_clip_set(sd->mgf_proxy, sd->mgf_clip);
|
2013-06-07 01:17:30 -07:00
|
|
|
|
|
|
|
mw = (Evas_Coord)(scale * (float) w);
|
|
|
|
mh = (Evas_Coord)(scale * (float) h);
|
2013-11-12 20:29:28 -08:00
|
|
|
if ((mw <= 0) || (mh <= 0)) return;
|
2013-06-07 01:17:30 -07:00
|
|
|
|
|
|
|
evas_object_layer_set(sd->mgf_bg, EVAS_LAYER_MAX);
|
|
|
|
evas_object_layer_set(sd->mgf_proxy, EVAS_LAYER_MAX);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-11-14 05:51:03 -08:00
|
|
|
_magnifier_move(void *data, Evas_Coord cx, Evas_Coord cy)
|
2013-06-07 01:17:30 -07:00
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
Evas_Coord x, y, w, h;
|
2013-11-14 05:51:03 -08:00
|
|
|
Evas_Coord px, py, pw, ph;
|
|
|
|
double fx, fy, fw, fh;
|
|
|
|
double dw, dh;
|
2013-06-07 01:17:30 -07:00
|
|
|
double scale = _elm_config->magnifier_scale;
|
|
|
|
|
2013-11-14 05:51:03 -08:00
|
|
|
//Move the Magnifier
|
2013-11-07 23:08:47 -08:00
|
|
|
edje_object_parts_extends_calc(sd->mgf_bg, &x, &y, &w, &h);
|
2013-11-14 05:51:03 -08:00
|
|
|
evas_object_move(sd->mgf_bg, cx - x - (w / 2), cy - y - h);
|
|
|
|
|
|
|
|
//Set the Proxy Render Area
|
|
|
|
evas_object_geometry_get(data, &x, &y, &w, &h);
|
|
|
|
evas_object_geometry_get(sd->mgf_proxy, &px, &py, &pw, &ph);
|
|
|
|
|
|
|
|
dw = w;
|
|
|
|
dh = h;
|
|
|
|
|
|
|
|
fx = -(((double) (cx - x) / dw) * (scale * dw)) + ((double) pw * 0.5);
|
|
|
|
fy = -(((double) (cy - y) / dh) * (scale * dh)) + ((double) ph * 0.5);
|
|
|
|
fw = dw * scale;
|
|
|
|
fh = dh * scale;
|
|
|
|
evas_object_image_fill_set(sd->mgf_proxy, fx, fy, fw, fh);
|
|
|
|
|
|
|
|
//Update Clipper Area
|
|
|
|
int tx = fx;
|
|
|
|
int ty = fy;
|
|
|
|
int tw = fw;
|
|
|
|
int th = fh;
|
|
|
|
if (tx > 0) px += tx;
|
|
|
|
if (ty > 0) py += ty;
|
|
|
|
if (-(tx - pw) > tw) pw -= (-((tx - pw) + tw));
|
|
|
|
if (-(ty - ph) > th) ph -= (-((ty - ph) + th));
|
|
|
|
evas_object_move(sd->mgf_clip, px, py);
|
|
|
|
evas_object_resize(sd->mgf_clip, pw, ph);
|
2013-06-07 01:17:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_magnifier_hide(void *data)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
edje_object_signal_emit(sd->mgf_bg, "elm,action,hide,magnifier", "elm");
|
|
|
|
elm_widget_scroll_freeze_pop(data);
|
2013-11-14 05:51:03 -08:00
|
|
|
evas_object_hide(sd->mgf_clip);
|
2013-06-07 01:17:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_magnifier_show(void *data)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
edje_object_signal_emit(sd->mgf_bg, "elm,action,show,magnifier", "elm");
|
|
|
|
elm_widget_scroll_freeze_push(data);
|
2013-11-14 05:51:03 -08:00
|
|
|
evas_object_show(sd->mgf_clip);
|
2013-06-07 01:17:30 -07:00
|
|
|
}
|
|
|
|
|
2011-04-01 05:10:24 -07:00
|
|
|
static Eina_Bool
|
2012-08-30 09:45:15 -07:00
|
|
|
_long_press_cb(void *data)
|
2011-04-01 05:10:24 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-06-07 01:17:30 -07:00
|
|
|
if (_elm_config->magnifier_enable)
|
|
|
|
{
|
|
|
|
_magnifier_create(data);
|
|
|
|
_magnifier_show(data);
|
|
|
|
_magnifier_move(data, sd->downx, sd->downy);
|
|
|
|
}
|
2015-12-10 22:49:27 -08:00
|
|
|
/* Context menu will not appear if context menu disabled is set
|
|
|
|
* as false on a long press callback */
|
|
|
|
else if (!_elm_config->context_menu_disabled &&
|
|
|
|
(!_elm_config->desktop_entry))
|
2012-08-30 09:45:15 -07:00
|
|
|
_menu_call(data);
|
|
|
|
|
2013-06-07 01:17:30 -07:00
|
|
|
sd->long_pressed = EINA_TRUE;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->longpress_timer = NULL;
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_LONGPRESSED, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-06-25 02:58:14 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
2013-04-02 10:23:20 -07:00
|
|
|
static void
|
|
|
|
_key_down_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *evas EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2013-04-02 10:23:20 -07:00
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
Evas_Event_Key_Down *ev = event_info;
|
2015-12-10 22:49:27 -08:00
|
|
|
/* First check if context menu disabled is false or not, and
|
|
|
|
* then check for key id */
|
|
|
|
if ((!_elm_config->context_menu_disabled) && !strcmp(ev->key, "Menu"))
|
2013-04-02 10:23:20 -07:00
|
|
|
_menu_call(data);
|
|
|
|
}
|
|
|
|
|
2009-03-19 06:36:46 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_mouse_down_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *evas EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
void *event_info)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
if (sd->disabled) return;
|
2009-03-19 06:36:46 -07:00
|
|
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->downx = ev->canvas.x;
|
|
|
|
sd->downy = ev->canvas.y;
|
2013-06-07 01:17:30 -07:00
|
|
|
sd->long_pressed = EINA_FALSE;
|
2013-09-30 03:21:31 -07:00
|
|
|
|
2013-06-07 01:17:30 -07:00
|
|
|
if (ev->button == 1)
|
|
|
|
{
|
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
|
|
|
sd->longpress_timer = ecore_timer_add
|
|
|
|
(_elm_config->longpress_timeout, _long_press_cb, data);
|
|
|
|
}
|
2015-12-10 22:49:27 -08:00
|
|
|
/* If right button is pressed and context menu disabled is true,
|
|
|
|
* then only context menu will appear */
|
|
|
|
else if (ev->button == 3 && (!_elm_config->context_menu_disabled))
|
2012-08-02 22:33:44 -07:00
|
|
|
{
|
|
|
|
if (_elm_config->desktop_entry)
|
2014-07-06 20:42:43 -07:00
|
|
|
{
|
|
|
|
sd->use_down = 1;
|
|
|
|
_menu_call(data);
|
|
|
|
}
|
2012-08-02 22:33:44 -07:00
|
|
|
}
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_mouse_up_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *evas EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
void *event_info)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Up *ev = event_info;
|
2014-01-13 02:32:01 -08:00
|
|
|
Eina_Bool top_is_win = EINA_FALSE;
|
|
|
|
Evas_Object *top;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
if (sd->disabled) return;
|
2011-04-01 05:10:24 -07:00
|
|
|
if (ev->button == 1)
|
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
2015-12-10 22:49:27 -08:00
|
|
|
/* Since context menu disabled flag was checked at long press start while mouse
|
|
|
|
* down, hence the same should be checked at mouse up from a long press
|
|
|
|
* as well */
|
2015-12-23 05:03:45 -08:00
|
|
|
if ((sd->long_pressed) && (_elm_config->magnifier_enable))
|
2013-06-07 01:17:30 -07:00
|
|
|
{
|
|
|
|
_magnifier_hide(data);
|
2015-12-23 05:03:45 -08:00
|
|
|
if (!_elm_config->context_menu_disabled)
|
|
|
|
{
|
|
|
|
_menu_call(data);
|
|
|
|
}
|
2013-06-07 01:17:30 -07:00
|
|
|
}
|
2014-01-13 02:32:01 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
top = elm_widget_top_get(data);
|
|
|
|
if (top)
|
|
|
|
{
|
2014-06-03 03:35:28 -07:00
|
|
|
if (eo_isa(top, ELM_WIN_CLASS))
|
2014-01-13 02:32:01 -08:00
|
|
|
top_is_win = EINA_TRUE;
|
|
|
|
|
|
|
|
if (top_is_win && sd->input_panel_enable && sd->input_panel_show_on_demand &&
|
|
|
|
!edje_object_part_text_imf_context_get(sd->entry_edje, "elm.text"))
|
|
|
|
elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_ON);
|
|
|
|
}
|
|
|
|
}
|
2011-04-01 05:10:24 -07:00
|
|
|
}
|
2015-12-10 22:49:27 -08:00
|
|
|
/* Since context menu disabled flag was checked at mouse right key down,
|
|
|
|
* hence the same should be stopped at mouse up of right key as well */
|
|
|
|
else if ((ev->button == 3) && (!_elm_config->context_menu_disabled) &&
|
|
|
|
(!_elm_config->desktop_entry))
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2015-12-10 22:49:27 -08:00
|
|
|
sd->use_down = 1;
|
|
|
|
_menu_call(data);
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_mouse_move_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *evas EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
void *event_info)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Move *ev = event_info;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
if (sd->disabled) return;
|
2013-06-07 01:17:30 -07:00
|
|
|
if (ev->buttons == 1)
|
|
|
|
{
|
|
|
|
if ((sd->long_pressed) && (_elm_config->magnifier_enable))
|
2013-06-21 20:24:30 -07:00
|
|
|
{
|
|
|
|
Evas_Coord x, y;
|
|
|
|
Eina_Bool rv;
|
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &x, &y, NULL, NULL);
|
|
|
|
rv = edje_object_part_text_cursor_coord_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER,
|
|
|
|
ev->cur.canvas.x - x, ev->cur.canvas.y - y);
|
|
|
|
if (rv)
|
|
|
|
{
|
|
|
|
edje_object_part_text_cursor_copy
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_USER, EDJE_CURSOR_MAIN);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
WRN("Warning: Cannot move cursor");
|
|
|
|
|
|
|
|
_magnifier_move(data, ev->cur.canvas.x, ev->cur.canvas.y);
|
|
|
|
}
|
2013-06-07 01:17:30 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->sel_mode)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2011-03-14 19:01:42 -07:00
|
|
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
|
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
2011-03-14 19:01:42 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else if (sd->longpress_timer)
|
2011-03-14 19:01:42 -07:00
|
|
|
{
|
|
|
|
Evas_Coord dx, dy;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
dx = sd->downx - ev->cur.canvas.x;
|
2011-03-14 19:01:42 -07:00
|
|
|
dx *= dx;
|
2012-08-30 09:45:15 -07:00
|
|
|
dy = sd->downy - ev->cur.canvas.y;
|
2011-03-14 19:01:42 -07:00
|
|
|
dy *= dy;
|
|
|
|
if ((dx + dy) >
|
|
|
|
((_elm_config->finger_size / 2) *
|
|
|
|
(_elm_config->finger_size / 2)))
|
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
2011-03-14 19:01:42 -07:00
|
|
|
}
|
|
|
|
}
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else if (sd->longpress_timer)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2011-03-14 19:01:42 -07:00
|
|
|
Evas_Coord dx, dy;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
dx = sd->downx - ev->cur.canvas.x;
|
2011-03-14 19:01:42 -07:00
|
|
|
dx *= dx;
|
2012-08-30 09:45:15 -07:00
|
|
|
dy = sd->downy - ev->cur.canvas.y;
|
2011-03-14 19:01:42 -07:00
|
|
|
dy *= dy;
|
|
|
|
if ((dx + dy) >
|
|
|
|
((_elm_config->finger_size / 2) *
|
|
|
|
(_elm_config->finger_size / 2)))
|
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
2011-03-14 19:01:42 -07:00
|
|
|
}
|
2008-11-15 05:58:50 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-16 02:17:57 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_changed_handle(void *data,
|
2015-05-10 07:50:04 -07:00
|
|
|
const Eo_Event_Description* event)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2011-05-01 02:40:19 -07:00
|
|
|
Evas_Coord minh;
|
2012-04-08 22:25:27 -07:00
|
|
|
const char *text;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_freeze(evas_object_evas_get(data));
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->changed = EINA_TRUE;
|
|
|
|
/* Reset the size hints which are no more relevant. Keep the
|
|
|
|
* height, this is a hack, but doesn't really matter cause we'll
|
|
|
|
* re-eval in a moment. */
|
2011-05-01 02:40:19 -07:00
|
|
|
evas_object_size_hint_min_get(data, NULL, &minh);
|
|
|
|
evas_object_size_hint_min_set(data, -1, minh);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
elm_layout_sizing_eval(data);
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->text, eina_stringshare_del);
|
|
|
|
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(data));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(data));
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->auto_save) && (sd->file))
|
2014-01-23 06:05:24 -08:00
|
|
|
sd->delay_write = ecore_timer_add(ELM_ENTRY_DELAY_WRITE_TIME,
|
|
|
|
_delay_write, data);
|
2013-01-18 22:17:05 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_return_key_enabled_check(data);
|
|
|
|
text = edje_object_part_text_get(sd->entry_edje, "elm.text");
|
2012-04-08 22:25:27 -07:00
|
|
|
if (text)
|
|
|
|
{
|
|
|
|
if (text[0])
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(data, EINA_TRUE);
|
2012-04-08 22:25:27 -07:00
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(data, EINA_FALSE);
|
2012-04-08 22:25:27 -07:00
|
|
|
}
|
2015-04-02 02:37:37 -07:00
|
|
|
_validate(data);
|
|
|
|
|
2013-01-18 22:17:05 -08:00
|
|
|
/* callback - this could call callbacks that delete the
|
|
|
|
* entry... thus... any access to sd after this could be
|
|
|
|
* invalid */
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(event, NULL));
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
2011-06-24 01:44:39 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_changed_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-06-24 01:44:39 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
_entry_changed_handle(data, ELM_ENTRY_EVENT_CHANGED);
|
2011-06-24 01:44:39 -07:00
|
|
|
}
|
|
|
|
|
2011-08-03 02:00:36 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_changed_user_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-08-03 02:00:36 -07:00
|
|
|
{
|
2011-11-14 05:56:02 -08:00
|
|
|
Elm_Entry_Change_Info info;
|
|
|
|
Edje_Entry_Change_Info *edje_info = (Edje_Entry_Change_Info *)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_signal_callback_extra_data_get();
|
|
|
|
|
2011-11-14 05:56:02 -08:00
|
|
|
if (edje_info)
|
|
|
|
{
|
|
|
|
memcpy(&info, edje_info, sizeof(info));
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_CHANGED_USER, &info));
|
2011-11-14 05:56:02 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_CHANGED_USER, NULL));
|
2011-11-14 05:56:02 -08:00
|
|
|
}
|
2014-06-10 00:18:17 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
|
|
|
{
|
|
|
|
Elm_Atspi_Text_Change_Info atspi_info;
|
|
|
|
if (edje_info && edje_info->insert)
|
|
|
|
{
|
|
|
|
atspi_info.content = edje_info->change.insert.content;
|
|
|
|
atspi_info.pos = edje_info->change.insert.pos;
|
|
|
|
atspi_info.len = edje_info->change.insert.plain_length;
|
2015-09-03 05:07:23 -07:00
|
|
|
eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_INSERTED, &atspi_info));
|
2014-06-10 00:18:17 -07:00
|
|
|
}
|
|
|
|
else if (edje_info && !edje_info->insert)
|
|
|
|
{
|
|
|
|
atspi_info.content = edje_info->change.del.content;
|
|
|
|
atspi_info.pos = MIN(edje_info->change.del.start, edje_info->change.del.end);
|
2015-07-29 07:26:14 -07:00
|
|
|
atspi_info.len = MAX(edje_info->change.del.start, edje_info->change.del.end) - atspi_info.pos;
|
2015-09-03 05:07:23 -07:00
|
|
|
eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_REMOVED, &atspi_info));
|
2014-06-10 00:18:17 -07:00
|
|
|
}
|
|
|
|
}
|
2011-08-03 02:00:36 -07:00
|
|
|
}
|
|
|
|
|
2011-06-24 01:44:39 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_preedit_changed_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-06-24 01:44:39 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
_entry_changed_handle(data, ELM_ENTRY_EVENT_PREEDIT_CHANGED);
|
2011-06-24 01:44:39 -07:00
|
|
|
}
|
|
|
|
|
2011-11-14 05:55:57 -08:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_undo_request_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-11-14 05:55:57 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_UNDO_REQUEST, NULL));
|
2011-11-14 05:55:57 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_redo_request_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-11-14 05:55:57 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_REDO_REQUEST, NULL));
|
2011-11-14 05:55:57 -08:00
|
|
|
}
|
|
|
|
|
2008-10-16 02:17:57 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_start_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2009-02-25 11:50:45 -08:00
|
|
|
const Eina_List *l;
|
|
|
|
Evas_Object *entry;
|
2013-11-07 04:01:00 -08:00
|
|
|
const char *txt = elm_entry_selection_get(data);
|
|
|
|
Evas_Object *top;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(entries, l, entry)
|
2008-11-18 00:45:38 -08:00
|
|
|
{
|
2011-03-14 19:01:42 -07:00
|
|
|
if (entry != data) elm_entry_select_none(entry);
|
2008-11-18 00:45:38 -08:00
|
|
|
}
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_START, NULL));
|
2009-07-06 23:46:51 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
top = elm_widget_top_get(data);
|
|
|
|
if (txt && top && (elm_win_window_id_get(top)))
|
2015-06-23 08:11:05 -07:00
|
|
|
{
|
|
|
|
elm_cnp_selection_set(data, ELM_SEL_TYPE_PRIMARY,
|
|
|
|
ELM_SEL_FORMAT_MARKUP, txt, strlen(txt));
|
|
|
|
elm_cnp_selection_loss_callback_set(data, ELM_SEL_TYPE_PRIMARY, _selection_clear, data);
|
|
|
|
}
|
2015-03-19 01:43:02 -07:00
|
|
|
elm_object_focus_set(data, EINA_TRUE);
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
2011-07-24 01:17:18 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_all_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-07-24 01:17:18 -07:00
|
|
|
{
|
|
|
|
elm_entry_select_all(data);
|
|
|
|
}
|
|
|
|
|
2011-07-24 01:36:42 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_none_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-07-24 01:36:42 -07:00
|
|
|
{
|
|
|
|
elm_entry_select_none(data);
|
|
|
|
}
|
|
|
|
|
2008-10-16 02:17:57 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_changed_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
sd->have_selection = EINA_TRUE;
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_CHANGED, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
_selection_store(ELM_SEL_TYPE_PRIMARY, data);
|
2013-11-08 00:06:08 -08:00
|
|
|
_update_selection_handler(data);
|
2014-06-10 00:18:17 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
2015-09-03 05:07:23 -07:00
|
|
|
eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, NULL));
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_cleared_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
if (!sd->have_selection) return;
|
|
|
|
|
|
|
|
sd->have_selection = EINA_FALSE;
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_CLEARED, NULL));
|
2015-06-23 08:11:05 -07:00
|
|
|
if (sd->cut_sel)
|
2008-11-18 22:23:08 -08:00
|
|
|
{
|
2015-06-23 08:11:05 -07:00
|
|
|
elm_cnp_selection_set
|
|
|
|
(data, ELM_SEL_TYPE_PRIMARY, ELM_SEL_FORMAT_MARKUP,
|
|
|
|
sd->cut_sel, eina_stringshare_strlen(sd->cut_sel));
|
|
|
|
elm_cnp_selection_loss_callback_set(data, ELM_SEL_TYPE_PRIMARY, _selection_clear, data);
|
2009-07-06 23:46:51 -07:00
|
|
|
|
2015-06-23 08:11:05 -07:00
|
|
|
ELM_SAFE_FREE(sd->cut_sel, eina_stringshare_del);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
elm_object_cnp_selection_clear(data, ELM_SEL_TYPE_PRIMARY);
|
2008-11-18 22:23:08 -08:00
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
_hide_selection_handler(data);
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_paste_request_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
const char *emission,
|
2014-01-06 06:30:02 -08:00
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2013-11-07 04:01:00 -08:00
|
|
|
Evas_Object *top;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-12-27 03:24:13 -08:00
|
|
|
Elm_Sel_Type type = (emission[sizeof("ntry,paste,request,")] == '1') ?
|
|
|
|
ELM_SEL_TYPE_PRIMARY : ELM_SEL_TYPE_CLIPBOARD;
|
2012-03-29 14:24:00 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->editable) return;
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_PASTE, NULL));
|
2009-07-06 23:46:51 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
top = elm_widget_top_get(data);
|
|
|
|
if ((top) && (elm_win_window_id_get(top)))
|
|
|
|
{
|
|
|
|
Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
sd->selection_asked = EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-11-07 04:01:00 -08:00
|
|
|
if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT)
|
|
|
|
formats = ELM_SEL_FORMAT_TEXT;
|
|
|
|
else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE)
|
|
|
|
formats |= ELM_SEL_FORMAT_IMAGE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2015-06-09 01:04:48 -07:00
|
|
|
elm_cnp_selection_get(data, type, formats, _selection_data_cb, NULL);
|
2008-11-18 22:23:08 -08:00
|
|
|
}
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_copy_notify_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
_copy_cb(data, NULL, NULL);
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_cut_notify_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
_cut_cb(data, NULL, NULL);
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_cursor_changed_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
sd->cursor_pos = edje_object_part_text_cursor_pos_get
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
|
|
|
sd->cur_changed = EINA_TRUE;
|
2013-11-07 23:56:24 -08:00
|
|
|
if (elm_widget_focus_get(data))
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,action,show,cursor", "elm");
|
2012-08-30 09:45:15 -07:00
|
|
|
_cursor_geometry_recalc(data);
|
2014-06-10 00:18:17 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
2015-09-03 05:07:23 -07:00
|
|
|
eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
|
2008-10-16 23:41:07 -07:00
|
|
|
}
|
|
|
|
|
2011-12-15 06:42:22 -08:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_cursor_changed_manual_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-12-15 06:42:22 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(ELM_ENTRY_EVENT_CURSOR_CHANGED_MANUAL, NULL));
|
2014-06-10 00:18:17 -07:00
|
|
|
if (_elm_config->atspi_mode)
|
2015-09-03 05:07:23 -07:00
|
|
|
eo_do(ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN, elm_interface_atspi_accessible_event_emit(data, ELM_INTERFACE_ATSPI_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, NULL));
|
2011-12-15 06:42:22 -08:00
|
|
|
}
|
|
|
|
|
2011-07-21 14:19:55 -07:00
|
|
|
static void
|
2014-03-22 10:44:29 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(Elm_Entry_Data *sd,
|
2012-08-30 09:45:15 -07:00
|
|
|
Elm_Entry_Anchor_Info *ei)
|
2011-07-21 14:19:55 -07:00
|
|
|
{
|
|
|
|
Evas_Textblock_Rectangle *r;
|
2012-08-30 09:45:15 -07:00
|
|
|
const Eina_List *geoms, *l;
|
2011-07-21 14:19:55 -07:00
|
|
|
Evas_Coord px, py, x, y;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
geoms = edje_object_part_text_anchor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", ei->name);
|
|
|
|
|
2011-07-21 14:19:55 -07:00
|
|
|
if (!geoms) return;
|
|
|
|
|
2014-01-28 06:36:38 -08:00
|
|
|
evas_object_geometry_get(
|
|
|
|
edje_object_part_object_get(sd->entry_edje, "elm.text"),
|
|
|
|
&x, &y, NULL, NULL);
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_pointer_canvas_xy_get
|
|
|
|
(evas_object_evas_get(sd->entry_edje), &px, &py);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(geoms, l, r)
|
2011-07-21 14:19:55 -07:00
|
|
|
{
|
|
|
|
if (((r->x + x) <= px) && ((r->y + y) <= py) &&
|
|
|
|
((r->x + x + r->w) > px) && ((r->y + y + r->h) > py))
|
|
|
|
{
|
|
|
|
ei->x = r->x + x;
|
|
|
|
ei->y = r->y + y;
|
|
|
|
ei->w = r->w;
|
|
|
|
ei->h = r->h;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-16 23:41:07 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_anchor_down_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 23:41:07 -07:00
|
|
|
{
|
2011-07-21 14:19:55 -07:00
|
|
|
Elm_Entry_Anchor_Info ei;
|
2011-07-22 21:00:49 -07:00
|
|
|
const char *p;
|
|
|
|
char *p2;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-07-22 21:00:49 -07:00
|
|
|
p = emission + sizeof("nchor,mouse,down,");
|
|
|
|
ei.button = strtol(p, &p2, 10);
|
2011-08-25 14:57:23 -07:00
|
|
|
ei.name = p2 + 1;
|
2011-07-21 14:19:55 -07:00
|
|
|
ei.x = ei.y = ei.w = ei.h = 0;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(sd, &ei);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->disabled)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_DOWN, &ei));
|
2008-10-16 23:41:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_anchor_up_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-03-10 02:15:58 -08:00
|
|
|
{
|
2011-07-21 14:19:55 -07:00
|
|
|
Elm_Entry_Anchor_Info ei;
|
2011-07-22 21:00:49 -07:00
|
|
|
const char *p;
|
|
|
|
char *p2;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-07-22 21:00:49 -07:00
|
|
|
p = emission + sizeof("nchor,mouse,up,");
|
|
|
|
ei.button = strtol(p, &p2, 10);
|
2011-08-25 14:57:23 -07:00
|
|
|
ei.name = p2 + 1;
|
2011-07-21 14:19:55 -07:00
|
|
|
ei.x = ei.y = ei.w = ei.h = 0;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(sd, &ei);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->disabled)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_UP, &ei));
|
2011-03-10 02:15:58 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_anchor_hover_del_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-07-03 04:29:43 -07:00
|
|
|
ELM_SAFE_FREE(sd->anchor_hover.pop, evas_object_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->anchor_hover.hover, EVAS_CALLBACK_DEL, _anchor_hover_del_cb, obj);
|
|
|
|
}
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
static Eina_Bool
|
2012-08-30 09:45:15 -07:00
|
|
|
_anchor_hover_clicked_cb(void *data,
|
2015-05-10 07:50:04 -07:00
|
|
|
Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
elm_entry_anchor_hover_end(data);
|
2015-05-10 07:50:04 -07:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_entry_hover_anchor_clicked_do(Evas_Object *obj,
|
|
|
|
Elm_Entry_Anchor_Info *info)
|
|
|
|
{
|
|
|
|
Evas_Object *hover_parent;
|
|
|
|
Evas_Coord x, w, y, h, px, py;
|
|
|
|
Elm_Entry_Anchor_Hover_Info ei;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2013-07-02 21:12:30 -07:00
|
|
|
if (sd->hoversel) return;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ei.anchor_info = info;
|
|
|
|
|
|
|
|
sd->anchor_hover.pop = elm_icon_add(obj);
|
|
|
|
evas_object_move(sd->anchor_hover.pop, info->x, info->y);
|
|
|
|
evas_object_resize(sd->anchor_hover.pop, info->w, info->h);
|
|
|
|
|
|
|
|
sd->anchor_hover.hover = elm_hover_add(obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->anchor_hover.hover, EVAS_CALLBACK_DEL, _anchor_hover_del_cb, obj);
|
|
|
|
elm_widget_mirrored_set
|
|
|
|
(sd->anchor_hover.hover, elm_widget_mirrored_get(obj));
|
|
|
|
if (sd->anchor_hover.hover_style)
|
|
|
|
elm_object_style_set
|
|
|
|
(sd->anchor_hover.hover, sd->anchor_hover.hover_style);
|
|
|
|
|
|
|
|
hover_parent = sd->anchor_hover.hover_parent;
|
|
|
|
if (!hover_parent) hover_parent = obj;
|
|
|
|
elm_hover_parent_set(sd->anchor_hover.hover, hover_parent);
|
|
|
|
elm_hover_target_set(sd->anchor_hover.hover, sd->anchor_hover.pop);
|
|
|
|
ei.hover = sd->anchor_hover.hover;
|
|
|
|
|
|
|
|
evas_object_geometry_get(hover_parent, &x, &y, &w, &h);
|
|
|
|
ei.hover_parent.x = x;
|
|
|
|
ei.hover_parent.y = y;
|
|
|
|
ei.hover_parent.w = w;
|
|
|
|
ei.hover_parent.h = h;
|
|
|
|
px = info->x + (info->w / 2);
|
|
|
|
py = info->y + (info->h / 2);
|
|
|
|
ei.hover_left = 1;
|
|
|
|
if (px < (x + (w / 3))) ei.hover_left = 0;
|
|
|
|
ei.hover_right = 1;
|
|
|
|
if (px > (x + ((w * 2) / 3))) ei.hover_right = 0;
|
|
|
|
ei.hover_top = 1;
|
|
|
|
if (py < (y + (h / 3))) ei.hover_top = 0;
|
|
|
|
ei.hover_bottom = 1;
|
|
|
|
if (py > (y + ((h * 2) / 3))) ei.hover_bottom = 0;
|
|
|
|
|
|
|
|
/* Swap right and left because they switch sides in RTL */
|
|
|
|
if (elm_widget_mirrored_get(sd->anchor_hover.hover))
|
|
|
|
{
|
|
|
|
Eina_Bool tmp = ei.hover_left;
|
|
|
|
|
|
|
|
ei.hover_left = ei.hover_right;
|
|
|
|
ei.hover_right = tmp;
|
|
|
|
}
|
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_HOVER_OPENED, &ei));
|
|
|
|
eo_do(sd->anchor_hover.hover, eo_event_callback_add
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _anchor_hover_clicked_cb, obj));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
/* FIXME: Should just check if there's any callback registered to
|
|
|
|
* the smart events instead. This is used to determine if anyone
|
|
|
|
* cares about the hover or not. */
|
|
|
|
if (!elm_layout_content_get(sd->anchor_hover.hover, "middle") &&
|
|
|
|
!elm_layout_content_get(sd->anchor_hover.hover, "left") &&
|
|
|
|
!elm_layout_content_get(sd->anchor_hover.hover, "right") &&
|
|
|
|
!elm_layout_content_get(sd->anchor_hover.hover, "top") &&
|
|
|
|
!elm_layout_content_get(sd->anchor_hover.hover, "bottom"))
|
|
|
|
{
|
2014-01-21 17:38:55 -08:00
|
|
|
ELM_SAFE_FREE(sd->anchor_hover.hover, evas_object_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
evas_object_show(sd->anchor_hover.hover);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_entry_anchor_clicked_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
const char *emission,
|
2014-01-06 06:30:02 -08:00
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 23:41:07 -07:00
|
|
|
{
|
2008-10-24 19:11:06 -07:00
|
|
|
Elm_Entry_Anchor_Info ei;
|
2011-07-22 21:00:49 -07:00
|
|
|
const char *p;
|
|
|
|
char *p2;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-07-22 21:00:49 -07:00
|
|
|
p = emission + sizeof("nchor,mouse,clicked,");
|
|
|
|
ei.button = strtol(p, &p2, 10);
|
2011-08-25 14:57:23 -07:00
|
|
|
ei.name = p2 + 1;
|
2011-07-21 13:54:54 -07:00
|
|
|
ei.x = ei.y = ei.w = ei.h = 0;
|
2011-03-14 19:01:42 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(sd, &ei);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->disabled)
|
2012-03-06 02:09:13 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_CLICKED, &ei));
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_hover_anchor_clicked_do(data, &ei);
|
2012-03-06 02:09:13 -08:00
|
|
|
}
|
2008-10-16 23:41:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-01-06 06:30:02 -08:00
|
|
|
_entry_anchor_move_signal_cb(void *data EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 23:41:07 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_anchor_in_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 23:41:07 -07:00
|
|
|
{
|
2011-07-21 14:19:55 -07:00
|
|
|
Elm_Entry_Anchor_Info ei;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-07-22 02:08:58 -07:00
|
|
|
ei.name = emission + sizeof("nchor,mouse,in,");
|
2011-07-21 14:19:55 -07:00
|
|
|
ei.button = 0;
|
|
|
|
ei.x = ei.y = ei.w = ei.h = 0;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(sd, &ei);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->disabled)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_IN, &ei));
|
2008-10-16 23:41:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_anchor_out_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-16 23:41:07 -07:00
|
|
|
{
|
2011-07-21 14:19:55 -07:00
|
|
|
Elm_Entry_Anchor_Info ei;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2011-07-22 02:08:58 -07:00
|
|
|
ei.name = emission + sizeof("nchor,mouse,out,");
|
2011-07-21 14:19:55 -07:00
|
|
|
ei.button = 0;
|
|
|
|
ei.x = ei.y = ei.w = ei.h = 0;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_signal_anchor_geoms_do_things_with_lol(sd, &ei);
|
2011-07-21 14:19:55 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->disabled)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ANCHOR_OUT, &ei));
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
2008-10-22 01:58:56 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_key_enter_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2008-10-22 01:58:56 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ACTIVATED, NULL));
|
2008-10-22 01:58:56 -07:00
|
|
|
}
|
|
|
|
|
2012-08-14 03:47:26 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_key_escape_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2012-08-14 03:47:26 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_ABORTED, NULL));
|
2012-08-14 03:47:26 -07:00
|
|
|
}
|
|
|
|
|
2009-12-01 03:03:14 -08:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_mouse_down_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call(ELM_ENTRY_EVENT_PRESS, NULL));
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_mouse_clicked_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_mouse_double_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED_DOUBLE, NULL));
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2011-07-25 07:08:38 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_mouse_triple_signal_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2011-07-25 07:08:38 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(data, eo_event_callback_call
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED_TRIPLE, NULL));
|
2011-07-25 07:08:38 -07:00
|
|
|
}
|
|
|
|
|
2010-04-26 07:59:01 -07:00
|
|
|
static Evas_Object *
|
2012-08-30 09:45:15 -07:00
|
|
|
_item_get(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *edje EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
const char *item)
|
2010-04-26 07:59:01 -07:00
|
|
|
{
|
2010-04-27 01:06:42 -07:00
|
|
|
Eina_List *l;
|
2012-08-30 09:45:15 -07:00
|
|
|
Evas_Object *o;
|
2010-04-27 01:06:42 -07:00
|
|
|
Elm_Entry_Item_Provider *ip;
|
2014-01-08 00:42:55 -08:00
|
|
|
const char *style = elm_widget_style_get(data);
|
2010-04-26 07:59:01 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->item_providers, l, ip)
|
2010-04-27 01:06:42 -07:00
|
|
|
{
|
|
|
|
o = ip->func(ip->data, data, item);
|
|
|
|
if (o) return o;
|
|
|
|
}
|
2015-12-09 03:38:21 -08:00
|
|
|
if (item && !strncmp(item, "file://", 7))
|
2010-12-02 00:25:36 -08:00
|
|
|
{
|
2010-12-06 21:04:45 -08:00
|
|
|
const char *fname = item + 7;
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
|
2010-12-02 00:25:36 -08:00
|
|
|
o = evas_object_image_filled_add(evas_object_evas_get(data));
|
|
|
|
evas_object_image_file_set(o, fname, NULL);
|
|
|
|
if (evas_object_image_load_error_get(o) == EVAS_LOAD_ERROR_NONE)
|
|
|
|
{
|
|
|
|
evas_object_show(o);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_del(o);
|
|
|
|
o = edje_object_add(evas_object_evas_get(data));
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(data, o, "entry/emoticon", "wtf", style);
|
2010-12-02 00:25:36 -08:00
|
|
|
}
|
|
|
|
return o;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-04-26 07:59:01 -07:00
|
|
|
o = edje_object_add(evas_object_evas_get(data));
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(data, o, "entry", item, style))
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_widget_theme_object_set
|
2014-01-08 00:42:55 -08:00
|
|
|
(data, o, "entry/emoticon", "wtf", style);
|
2010-04-26 07:59:01 -07:00
|
|
|
return o;
|
|
|
|
}
|
2010-04-12 01:12:02 -07:00
|
|
|
|
2015-12-21 06:41:28 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_entry_has_new_line(const char *text)
|
|
|
|
{
|
|
|
|
if (!text) return EINA_FALSE;
|
|
|
|
|
|
|
|
while (*text)
|
|
|
|
{
|
|
|
|
if (!strncmp(text, "<br", 3) || !strncmp(text, "<ps", 3))
|
|
|
|
{
|
|
|
|
if (text[4] == '>' || ((text[4] == '/') && (text[5] == '>')))
|
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
text++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
_entry_remove_new_line(const char *text)
|
|
|
|
{
|
|
|
|
Eina_Strbuf *str;
|
|
|
|
char *new_text;
|
|
|
|
|
|
|
|
if (!_entry_has_new_line(text)) return NULL;
|
|
|
|
|
|
|
|
str = eina_strbuf_new();
|
|
|
|
eina_strbuf_append(str, text);
|
|
|
|
eina_strbuf_replace_all(str, "<br>", "");
|
|
|
|
eina_strbuf_replace_all(str, "<br/>", "");
|
|
|
|
eina_strbuf_replace_all(str, "<ps>", "");
|
|
|
|
eina_strbuf_replace_all(str, "<ps/>", "");
|
|
|
|
new_text = eina_strbuf_string_steal(str);
|
|
|
|
eina_strbuf_free(str);
|
|
|
|
return new_text;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_entry_new_line_filter_init(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
const char *text;
|
|
|
|
char *text2 = NULL;
|
|
|
|
|
|
|
|
if (elm_entry_is_empty(obj)) return;
|
|
|
|
|
|
|
|
text = elm_entry_entry_get(obj);
|
|
|
|
text2 = _entry_remove_new_line(text);
|
|
|
|
if (text2)
|
|
|
|
{
|
|
|
|
elm_entry_entry_set(obj, text2);
|
|
|
|
free(text2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_entry_new_line_filter_cb(void *data EINA_UNUSED,
|
|
|
|
Evas_Object *entry EINA_UNUSED,
|
|
|
|
char **text)
|
|
|
|
{
|
2015-12-21 06:45:34 -08:00
|
|
|
char *ret;
|
2015-12-21 06:41:28 -08:00
|
|
|
|
|
|
|
if (!*text) return;
|
|
|
|
|
2015-12-21 06:45:34 -08:00
|
|
|
ret = _entry_remove_new_line(*text);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
{
|
|
|
|
free(*text);
|
|
|
|
*text = ret;
|
|
|
|
}
|
2015-12-21 06:41:28 -08:00
|
|
|
}
|
|
|
|
|
2012-02-07 23:23:49 -08:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_markup_filter_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *edje EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED,
|
2012-08-30 09:45:15 -07:00
|
|
|
char **text)
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Elm_Entry_Markup_Filter *tf;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->markup_filters, l, tf)
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
|
|
|
tf->func(tf->data, data, text);
|
|
|
|
if (!*text)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-15 09:02:03 -07:00
|
|
|
/* This function is used to insert text by chunks in jobs */
|
|
|
|
static Eina_Bool
|
|
|
|
_text_append_idler(void *data)
|
|
|
|
{
|
|
|
|
int start;
|
|
|
|
char backup;
|
2012-08-30 09:45:15 -07:00
|
|
|
Evas_Object *obj = (Evas_Object *)data;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->text, eina_stringshare_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->changed = EINA_TRUE;
|
2011-05-15 09:02:03 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
start = sd->append_text_position;
|
2014-01-23 06:09:28 -08:00
|
|
|
if ((start + ELM_ENTRY_CHUNK_SIZE) < sd->append_text_len)
|
2011-05-15 09:02:03 -07:00
|
|
|
{
|
2011-08-22 07:20:02 -07:00
|
|
|
int pos = start;
|
|
|
|
int tag_start, esc_start;
|
|
|
|
|
|
|
|
tag_start = esc_start = -1;
|
|
|
|
/* Find proper markup cut place */
|
2014-01-23 06:09:28 -08:00
|
|
|
while (pos - start < ELM_ENTRY_CHUNK_SIZE)
|
2011-08-22 07:20:02 -07:00
|
|
|
{
|
|
|
|
int prev_pos = pos;
|
|
|
|
Eina_Unicode tmp =
|
2013-01-21 18:00:55 -08:00
|
|
|
eina_unicode_utf8_next_get(sd->append_text_left, &pos);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-08-22 07:20:02 -07:00
|
|
|
if (esc_start == -1)
|
|
|
|
{
|
|
|
|
if (tmp == '<')
|
2012-08-30 09:45:15 -07:00
|
|
|
tag_start = prev_pos;
|
2011-08-22 07:20:02 -07:00
|
|
|
else if (tmp == '>')
|
2012-08-30 09:45:15 -07:00
|
|
|
tag_start = -1;
|
2011-08-22 07:20:02 -07:00
|
|
|
}
|
2011-09-22 04:31:22 -07:00
|
|
|
if (tag_start == -1)
|
2011-08-22 07:20:02 -07:00
|
|
|
{
|
|
|
|
if (tmp == '&')
|
2012-08-30 09:45:15 -07:00
|
|
|
esc_start = prev_pos;
|
2011-08-22 07:20:02 -07:00
|
|
|
else if (tmp == ';')
|
2012-08-30 09:45:15 -07:00
|
|
|
esc_start = -1;
|
2011-08-22 07:20:02 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tag_start >= 0)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_position = tag_start;
|
2011-08-22 07:20:02 -07:00
|
|
|
}
|
|
|
|
else if (esc_start >= 0)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_position = esc_start;
|
2011-08-22 07:20:02 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_position = pos;
|
2011-08-22 07:20:02 -07:00
|
|
|
}
|
2011-05-15 09:02:03 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_position = sd->append_text_len;
|
2011-05-15 09:02:03 -07:00
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
backup = sd->append_text_left[sd->append_text_position];
|
|
|
|
sd->append_text_left[sd->append_text_position] = '\0';
|
2011-05-15 09:02:03 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_append
|
|
|
|
(sd->entry_edje, "elm.text", sd->append_text_left + start);
|
2011-05-15 09:02:03 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_left[sd->append_text_position] = backup;
|
2011-05-15 09:02:03 -07:00
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(obj, EINA_TRUE);
|
|
|
|
|
2011-05-15 09:02:03 -07:00
|
|
|
/* If there's still more to go, renew the idler, else, cleanup */
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->append_text_position < sd->append_text_len)
|
2011-05-15 09:02:03 -07:00
|
|
|
{
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-08-16 22:34:21 -07:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, sd->cursor_pos);
|
2012-08-30 09:45:15 -07:00
|
|
|
free(sd->append_text_left);
|
|
|
|
sd->append_text_left = NULL;
|
|
|
|
sd->append_text_idler = NULL;
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call
|
|
|
|
(ELM_ENTRY_EVENT_TEXT_SET_DONE, NULL));
|
2011-05-15 09:02:03 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-14 02:50:05 -07:00
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_chars_add_till_limit(Evas_Object *obj,
|
|
|
|
char **text,
|
|
|
|
int can_add,
|
|
|
|
Length_Unit unit)
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2011-09-24 19:56:54 -07:00
|
|
|
int i = 0, current_len = 0;
|
|
|
|
char *new_text;
|
|
|
|
|
|
|
|
if (!*text) return;
|
2011-06-14 02:50:05 -07:00
|
|
|
if (unit >= LENGTH_UNIT_LAST) return;
|
2013-01-07 03:37:53 -08:00
|
|
|
if (strstr(*text, "<preedit")) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-09-24 19:56:54 -07:00
|
|
|
new_text = *text;
|
|
|
|
current_len = strlen(*text);
|
2011-06-14 02:50:05 -07:00
|
|
|
while (*new_text)
|
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
int idx = 0, unit_size = 0;
|
|
|
|
char *markup, *utfstr;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-06-14 02:50:05 -07:00
|
|
|
if (*new_text == '<')
|
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
while (*(new_text + idx) != '>')
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
idx++;
|
|
|
|
if (!*(new_text + idx)) break;
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
|
|
|
}
|
2011-11-15 00:26:02 -08:00
|
|
|
else if (*new_text == '&')
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
while (*(new_text + idx) != ';')
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
idx++;
|
|
|
|
if (!*(new_text + idx)) break;
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
2011-11-15 00:26:02 -08:00
|
|
|
}
|
|
|
|
idx = evas_string_char_next_get(new_text, idx, NULL);
|
|
|
|
markup = malloc(idx + 1);
|
|
|
|
if (markup)
|
|
|
|
{
|
|
|
|
strncpy(markup, new_text, idx);
|
|
|
|
markup[idx] = 0;
|
|
|
|
utfstr = elm_entry_markup_to_utf8(markup);
|
|
|
|
if (utfstr)
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2011-11-15 00:26:02 -08:00
|
|
|
if (unit == LENGTH_UNIT_BYTE)
|
|
|
|
unit_size = strlen(utfstr);
|
|
|
|
else if (unit == LENGTH_UNIT_CHAR)
|
|
|
|
unit_size = evas_string_char_len_get(utfstr);
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(utfstr, free);
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(markup, free);
|
2011-11-15 00:26:02 -08:00
|
|
|
}
|
|
|
|
if (can_add < unit_size)
|
|
|
|
{
|
|
|
|
if (!i)
|
2011-06-14 02:50:05 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call
|
|
|
|
(ELM_ENTRY_EVENT_MAXLENGTH_REACHED, NULL));
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(*text, free);
|
2011-11-15 00:26:02 -08:00
|
|
|
return;
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
2011-11-15 00:26:02 -08:00
|
|
|
can_add = 0;
|
2012-08-30 09:45:15 -07:00
|
|
|
strncpy(new_text, new_text + idx,
|
|
|
|
current_len - ((new_text + idx) - *text));
|
2011-11-15 00:26:02 -08:00
|
|
|
current_len -= idx;
|
|
|
|
(*text)[current_len] = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
new_text += idx;
|
|
|
|
can_add -= unit_size;
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
2011-11-15 00:26:02 -08:00
|
|
|
i++;
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_ENTRY_EVENT_MAXLENGTH_REACHED, NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char *emission, const char *source)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
/* always pass to both edje objs */
|
|
|
|
edje_object_signal_emit(sd->entry_edje, emission, source);
|
2013-07-09 02:31:22 -07:00
|
|
|
edje_object_message_signal_process(sd->entry_edje);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->scr_edje)
|
2013-07-09 02:31:22 -07:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(sd->scr_edje, emission, source);
|
|
|
|
edje_object_message_signal_process(sd->scr_edje);
|
|
|
|
}
|
2011-06-14 02:50:05 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_layout_signal_callback_add (Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
Evas_Object *ro;
|
|
|
|
|
2013-10-05 01:14:12 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
ro = wd->resize_obj;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = sd->entry_edje;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, elm_obj_layout_signal_callback_add
|
2012-11-25 22:32:53 -08:00
|
|
|
(emission, source, func_cb, data));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->scr_edje)
|
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = sd->scr_edje;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, elm_obj_layout_signal_callback_add
|
2012-11-25 22:32:53 -08:00
|
|
|
(emission, source, func_cb, data));
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = ro;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void *
|
|
|
|
_elm_entry_elm_layout_signal_callback_del(Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
Evas_Object *ro;
|
2014-03-22 10:44:29 -07:00
|
|
|
void *data = NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
ro = wd->resize_obj;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = sd->entry_edje;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, data = elm_obj_layout_signal_callback_del
|
|
|
|
(emission, source, func_cb));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->scr_edje)
|
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = sd->scr_edje;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, data = elm_obj_layout_signal_callback_del
|
|
|
|
(emission, source, func_cb));
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
wd->resize_obj = ro;
|
2014-03-22 10:44:29 -07:00
|
|
|
return data;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_container_content_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, const char *part, Evas_Object *content)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool int_ret = EINA_FALSE;
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, int_ret = elm_obj_container_content_set(part, content));
|
2014-03-22 10:44:29 -07:00
|
|
|
if (!int_ret) return EINA_FALSE;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
/* too bad entry does not follow the pattern
|
|
|
|
* "elm,state,{icon,end},visible", we have to repeat ourselves */
|
|
|
|
if (!part || !strcmp(part, "icon") || !strcmp(part, "elm.swallow.icon"))
|
|
|
|
elm_entry_icon_visible_set(obj, EINA_TRUE);
|
|
|
|
|
|
|
|
if (!part || !strcmp(part, "end") || !strcmp(part, "elm.swallow.end"))
|
|
|
|
elm_entry_end_visible_set(obj, EINA_TRUE);
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Evas_Object*
|
|
|
|
_elm_entry_elm_container_content_unset(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, const char *part)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-05-09 22:07:14 -07:00
|
|
|
Evas_Object *ret = NULL;
|
|
|
|
eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_unset(part));
|
|
|
|
if (!ret) return NULL;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
/* too bad entry does not follow the pattern
|
|
|
|
* "elm,state,{icon,end},hidden", we have to repeat ourselves */
|
|
|
|
if (!part || !strcmp(part, "icon") || !strcmp(part, "elm.swallow.icon"))
|
|
|
|
elm_entry_icon_visible_set(obj, EINA_FALSE);
|
|
|
|
|
|
|
|
if (!part || !strcmp(part, "end") || !strcmp(part, "elm.swallow.end"))
|
|
|
|
elm_entry_end_visible_set(obj, EINA_FALSE);
|
|
|
|
|
2014-05-09 22:07:14 -07:00
|
|
|
return ret;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2015-07-03 03:08:23 -07:00
|
|
|
static void
|
2015-07-13 09:38:45 -07:00
|
|
|
_entry_text_append(Evas_Object* obj, const char* entry, Eina_Bool set)
|
2015-07-03 03:08:23 -07:00
|
|
|
{
|
|
|
|
int len = 0;
|
|
|
|
if (!entry) return;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
len = strlen(entry);
|
|
|
|
|
|
|
|
if (sd->append_text_left)
|
|
|
|
{
|
|
|
|
char *tmpbuf;
|
|
|
|
|
|
|
|
tmpbuf = realloc(sd->append_text_left, sd->append_text_len + len + 1);
|
|
|
|
if (!tmpbuf)
|
|
|
|
{
|
|
|
|
/* Do something */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sd->append_text_left = tmpbuf;
|
|
|
|
memcpy(sd->append_text_left + sd->append_text_len, entry, len + 1);
|
|
|
|
sd->append_text_len += len;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (len > ELM_ENTRY_CHUNK_SIZE)
|
|
|
|
{
|
|
|
|
sd->append_text_left = (char *)malloc(len + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sd->append_text_left)
|
|
|
|
{
|
|
|
|
memcpy(sd->append_text_left, entry, len + 1);
|
|
|
|
sd->append_text_position = 0;
|
|
|
|
sd->append_text_len = len;
|
|
|
|
sd->append_text_idler = ecore_idler_add(_text_append_idler, obj);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-07-13 09:38:45 -07:00
|
|
|
if (set)
|
|
|
|
{
|
|
|
|
edje_object_part_text_set(sd->entry_edje, "elm.text", entry);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
edje_object_part_text_append(sd->entry_edje, "elm.text", entry);
|
|
|
|
}
|
2015-08-16 22:34:21 -07:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, sd->cursor_pos);
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call(ELM_ENTRY_EVENT_TEXT_SET_DONE, NULL));
|
2015-07-03 03:08:23 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_layout_text_set(Eo *obj, Elm_Entry_Data *sd, const char *part, const char *entry)
|
2011-07-04 03:40:13 -07:00
|
|
|
{
|
|
|
|
int len = 0;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-07-04 03:40:13 -07:00
|
|
|
if (!entry) entry = "";
|
2013-07-22 13:34:19 -07:00
|
|
|
if (part)
|
2011-10-27 07:16:31 -07:00
|
|
|
{
|
2013-07-22 13:34:19 -07:00
|
|
|
if (!strcmp(part, "guide"))
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_set(sd->entry_edje, "elm.guide", entry);
|
2012-04-08 22:25:27 -07:00
|
|
|
else
|
2013-07-22 13:34:19 -07:00
|
|
|
edje_object_part_text_set(sd->entry_edje, part, entry);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-10-27 07:16:31 -07:00
|
|
|
}
|
|
|
|
|
2012-05-21 04:28:41 -07:00
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->text, eina_stringshare_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->changed = EINA_TRUE;
|
2011-07-04 03:40:13 -07:00
|
|
|
|
|
|
|
/* Clear currently pending job if there is one */
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->append_text_idler)
|
2011-07-04 03:40:13 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ecore_idler_del(sd->append_text_idler);
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(sd->append_text_left, free);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_idler = NULL;
|
2011-07-04 03:40:13 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
len = strlen(entry);
|
2014-08-08 00:16:42 -07:00
|
|
|
if (sd->append_text_left)
|
|
|
|
{
|
|
|
|
free(sd->append_text_left);
|
|
|
|
sd->append_text_left = NULL;
|
|
|
|
}
|
2011-07-04 03:40:13 -07:00
|
|
|
|
2015-07-03 03:08:23 -07:00
|
|
|
/* Need to clear the entry first */
|
|
|
|
edje_object_part_text_set(sd->entry_edje, "elm.text", "");
|
2015-07-13 09:38:45 -07:00
|
|
|
_entry_text_append(obj, entry, EINA_TRUE);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-12-06 23:12:58 -08:00
|
|
|
if (len > 0)
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(obj, EINA_TRUE);
|
2012-04-08 22:25:27 -07:00
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_entry_guide_update(obj, EINA_FALSE);
|
|
|
|
|
2011-09-29 05:02:49 -07:00
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-07-04 03:40:13 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static const char *
|
2015-06-25 04:21:00 -07:00
|
|
|
_elm_entry_elm_layout_text_get(const Eo *obj, Elm_Entry_Data *sd, const char *item)
|
2011-07-04 03:40:13 -07:00
|
|
|
{
|
|
|
|
const char *text;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (item)
|
|
|
|
{
|
|
|
|
if (!strcmp(item, "default")) goto proceed;
|
|
|
|
else if (!strcmp(item, "guide"))
|
2013-12-30 18:39:47 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_get(sd->entry_edje, "elm.guide");
|
2013-12-30 18:39:47 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
else
|
2013-12-30 18:39:47 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_get(sd->entry_edje, item);
|
2013-12-30 18:39:47 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
proceed:
|
|
|
|
|
|
|
|
text = edje_object_part_text_get(sd->entry_edje, "elm.text");
|
2011-07-04 03:40:13 -07:00
|
|
|
if (!text)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ERR("text=NULL for edje %p, part 'elm.text'", sd->entry_edje);
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return NULL;
|
2011-07-04 03:40:13 -07:00
|
|
|
}
|
2011-07-28 01:18:37 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->append_text_len > 0)
|
2011-07-28 01:18:37 -07:00
|
|
|
{
|
|
|
|
char *tmpbuf;
|
2014-01-21 04:00:29 -08:00
|
|
|
size_t len, tlen;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-07-05 06:32:19 -07:00
|
|
|
tlen = strlen(text);
|
2014-01-21 04:00:29 -08:00
|
|
|
len = tlen + sd->append_text_len - sd->append_text_position;
|
2013-11-21 18:06:37 -08:00
|
|
|
/* FIXME: need that or we do copy uninitialised data */
|
2014-01-21 04:00:29 -08:00
|
|
|
tmpbuf = calloc(1, len + 1);
|
2011-07-28 01:18:37 -07:00
|
|
|
if (!tmpbuf)
|
|
|
|
{
|
|
|
|
ERR("Failed to allocate memory for entry's text %p", obj);
|
2014-03-22 10:44:29 -07:00
|
|
|
return NULL;
|
2011-07-28 01:18:37 -07:00
|
|
|
}
|
|
|
|
memcpy(tmpbuf, text, tlen);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->append_text_left)
|
|
|
|
memcpy(tmpbuf + tlen, sd->append_text_left
|
|
|
|
+ sd->append_text_position, sd->append_text_len
|
|
|
|
- sd->append_text_position);
|
2014-01-21 04:00:29 -08:00
|
|
|
tmpbuf[len] = '\0';
|
2012-08-30 09:45:15 -07:00
|
|
|
eina_stringshare_replace(&sd->text, tmpbuf);
|
2011-07-28 01:18:37 -07:00
|
|
|
free(tmpbuf);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
eina_stringshare_replace(&sd->text, text);
|
2011-07-28 01:18:37 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->text;
|
2011-07-04 03:40:13 -07:00
|
|
|
}
|
|
|
|
|
2012-08-18 06:52:03 -07:00
|
|
|
static char *
|
2014-01-06 06:30:02 -08:00
|
|
|
_access_info_cb(void *data EINA_UNUSED, Evas_Object *obj)
|
2012-08-18 06:52:03 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
const char *txt;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (sd->password) return NULL;
|
2012-08-18 06:52:03 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
txt = elm_widget_access_info_get(obj);
|
2012-08-18 06:52:03 -07:00
|
|
|
|
2015-04-30 22:32:34 -07:00
|
|
|
if (!txt)
|
2015-05-18 03:31:27 -07:00
|
|
|
return _elm_util_mkup_to_text(elm_entry_entry_get(obj));
|
2015-04-30 22:32:34 -07:00
|
|
|
else return strdup(txt);
|
2012-08-18 06:52:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2014-01-06 06:30:02 -08:00
|
|
|
_access_state_cb(void *data EINA_UNUSED, Evas_Object *obj)
|
2012-08-18 06:52:03 -07:00
|
|
|
{
|
|
|
|
Eina_Strbuf *buf;
|
2013-01-31 02:56:18 -08:00
|
|
|
char *ret;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
2013-01-31 03:07:26 -08:00
|
|
|
ret = NULL;
|
2012-08-18 06:52:03 -07:00
|
|
|
buf = eina_strbuf_new();
|
|
|
|
|
|
|
|
if (elm_widget_disabled_get(obj))
|
|
|
|
eina_strbuf_append(buf, "State: Disabled");
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!sd->editable)
|
2012-08-18 06:52:03 -07:00
|
|
|
{
|
|
|
|
if (!eina_strbuf_length_get(buf))
|
|
|
|
eina_strbuf_append(buf, "State: Not Editable");
|
|
|
|
else eina_strbuf_append(buf, ", Not Editable");
|
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->password)
|
2012-08-18 06:52:03 -07:00
|
|
|
{
|
|
|
|
if (!eina_strbuf_length_get(buf))
|
|
|
|
eina_strbuf_append(buf, "State: Password");
|
|
|
|
else eina_strbuf_append(buf, ", Password");
|
|
|
|
}
|
|
|
|
|
2013-01-31 02:56:18 -08:00
|
|
|
if (!eina_strbuf_length_get(buf)) goto buf_free;
|
2012-08-18 06:52:03 -07:00
|
|
|
|
2013-01-31 02:56:18 -08:00
|
|
|
ret = eina_strbuf_string_steal(buf);
|
|
|
|
|
|
|
|
buf_free:
|
|
|
|
eina_strbuf_free(buf);
|
|
|
|
return ret;
|
2012-08-18 06:52:03 -07:00
|
|
|
}
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
static void
|
|
|
|
_entry_selection_callbacks_unregister(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "selection,start", "elm.text",
|
|
|
|
_entry_selection_start_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "selection,changed", "elm.text",
|
|
|
|
_entry_selection_changed_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "entry,selection,all,request",
|
|
|
|
"elm.text", _entry_selection_all_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "entry,selection,none,request",
|
|
|
|
"elm.text", _entry_selection_none_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "selection,cleared", "elm.text",
|
|
|
|
_entry_selection_cleared_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "entry,paste,request,*", "elm.text",
|
|
|
|
_entry_paste_request_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "entry,copy,notify", "elm.text",
|
|
|
|
_entry_copy_notify_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_del_full
|
|
|
|
(sd->entry_edje, "entry,cut,notify", "elm.text",
|
|
|
|
_entry_cut_notify_signal_cb, obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_entry_selection_callbacks_register(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "selection,start", "elm.text",
|
|
|
|
_entry_selection_start_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "selection,changed", "elm.text",
|
|
|
|
_entry_selection_changed_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "entry,selection,all,request",
|
|
|
|
"elm.text", _entry_selection_all_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "entry,selection,none,request",
|
|
|
|
"elm.text", _entry_selection_none_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "selection,cleared", "elm.text",
|
|
|
|
_entry_selection_cleared_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "entry,paste,request,*", "elm.text",
|
|
|
|
_entry_paste_request_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "entry,copy,notify", "elm.text",
|
|
|
|
_entry_copy_notify_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(sd->entry_edje, "entry,cut,notify", "elm.text",
|
|
|
|
_entry_cut_notify_signal_cb, obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-01-09 23:37:55 -08:00
|
|
|
_elm_entry_resize_internal(Evas_Object *obj)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-01-09 23:37:55 -08:00
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->line_wrap)
|
|
|
|
{
|
2014-01-09 23:37:55 -08:00
|
|
|
elm_layout_sizing_eval(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
else if (sd->scroll)
|
|
|
|
{
|
|
|
|
Evas_Coord vw = 0, vh = 0;
|
|
|
|
|
entry: wrong viewport value calculation issue fix
Summary:
Issue: As entire scroller edje co-ordinates was being taken instead of the actual viewport value,
if in scroller edje more parts are added apart from just "elm.swallow.content", then the viewport value
set will be wrong. hence the selection handlers will not hide when they have to hide.
solution: Instead of taking scroller edje's geometry, get the actual viewport values.
To get viewport x,y a new scrollable interface is also added.
signed-off by: Shilpa Singh <shilpa.singh@samsung.com>
@fix
Test Plan: Selection handlers have to hide correctly when the text is scrolled in a scrolled entry, if the scroller edc of entry has more parts added other than elm.swallow.content, then when we scroll the selection handlers are not hidden correctly.
Reviewers: jaehwan, woohyun, seoz, Hermet, raster
CC: govi, rajeshps, thiepha
Differential Revision: https://phab.enlightenment.org/D674
2014-04-20 20:31:49 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
|
|
|
|
(NULL, NULL, &vw, &vh));
|
2012-08-30 09:45:15 -07:00
|
|
|
if (vw < sd->ent_mw) vw = sd->ent_mw;
|
|
|
|
if (vh < sd->ent_mh) vh = sd->ent_mh;
|
|
|
|
evas_object_resize(sd->entry_edje, vw, vh);
|
|
|
|
}
|
|
|
|
|
2014-01-09 23:37:55 -08:00
|
|
|
if (sd->hoversel) _hoversel_position(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_resize_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_elm_entry_resize_internal(data);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2013-11-08 00:06:08 -08:00
|
|
|
static void
|
|
|
|
_start_handler_mouse_down_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
|
|
|
Evas_Coord ex, ey;
|
|
|
|
Evas_Coord cx, cy, cw, ch;
|
2014-03-06 02:33:05 -08:00
|
|
|
int start_pos, end_pos, main_pos, pos;
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
sd->start_handler_down = EINA_TRUE;
|
2014-03-06 02:33:05 -08:00
|
|
|
start_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
2013-11-08 00:06:08 -08:00
|
|
|
EDJE_CURSOR_SELECTION_BEGIN);
|
2014-03-06 02:33:05 -08:00
|
|
|
end_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_SELECTION_END);
|
2013-11-08 00:06:08 -08:00
|
|
|
main_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN);
|
2014-03-06 02:33:05 -08:00
|
|
|
if (start_pos <= end_pos)
|
|
|
|
{
|
|
|
|
pos = start_pos;
|
|
|
|
sd->sel_handler_cursor = EDJE_CURSOR_SELECTION_BEGIN;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pos = end_pos;
|
|
|
|
sd->sel_handler_cursor = EDJE_CURSOR_SELECTION_END;
|
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
if (pos != main_pos)
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, pos);
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje, "elm.text",
|
|
|
|
&cx, &cy, &cw, &ch);
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL);
|
2014-03-06 02:33:05 -08:00
|
|
|
sd->ox = ev->canvas.x - (ex + cx + (cw / 2));
|
|
|
|
sd->oy = ev->canvas.y - (ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2014-03-06 03:12:58 -08:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
|
|
|
sd->long_pressed = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
|
|
|
{
|
|
|
|
_magnifier_create(data);
|
|
|
|
_magnifier_show(data);
|
2013-11-08 00:18:28 -08:00
|
|
|
_magnifier_move(data, ex + cx, ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_start_handler_mouse_up_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
sd->start_handler_down = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
|
|
|
_magnifier_hide(data);
|
2015-12-10 22:49:27 -08:00
|
|
|
/* Context menu should not appear, even in case of selector mode, if the
|
|
|
|
* flag is false (disabled) */
|
|
|
|
if ((!_elm_config->context_menu_disabled) &&
|
|
|
|
(!_elm_config->desktop_entry) && (sd->long_pressed))
|
2013-11-08 00:06:08 -08:00
|
|
|
_menu_call(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_start_handler_mouse_move_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
if (!sd->start_handler_down) return;
|
2013-11-08 00:06:08 -08:00
|
|
|
Evas_Event_Mouse_Move *ev = event_info;
|
|
|
|
Evas_Coord ex, ey;
|
|
|
|
Evas_Coord cx, cy, ch;
|
2014-03-06 02:33:05 -08:00
|
|
|
int pos;
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL);
|
2014-03-06 02:33:05 -08:00
|
|
|
cx = ev->cur.canvas.x - sd->ox - ex;
|
|
|
|
cy = ev->cur.canvas.y - sd->oy - ey;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (cx <= 0) cx = 1;
|
2014-03-06 02:33:05 -08:00
|
|
|
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_coord_set(sd->entry_edje, "elm.text",
|
2014-03-06 02:33:05 -08:00
|
|
|
sd->sel_handler_cursor, cx, cy);
|
|
|
|
pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
sd->sel_handler_cursor);
|
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, pos);
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje,
|
|
|
|
"elm.text",
|
|
|
|
&cx, &cy, NULL, &ch);
|
2014-03-06 03:12:58 -08:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
|
|
|
sd->long_pressed = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
2013-11-08 00:18:28 -08:00
|
|
|
_magnifier_move(data, ex + cx, ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_end_handler_mouse_down_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
|
|
|
Evas_Coord ex, ey;
|
|
|
|
Evas_Coord cx, cy, cw, ch;
|
2014-03-06 02:33:05 -08:00
|
|
|
int pos, start_pos, end_pos, main_pos;
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
sd->end_handler_down = EINA_TRUE;
|
2014-03-06 02:33:05 -08:00
|
|
|
start_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_SELECTION_BEGIN);
|
|
|
|
end_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
2013-11-08 00:06:08 -08:00
|
|
|
EDJE_CURSOR_SELECTION_END);
|
2014-03-06 02:33:05 -08:00
|
|
|
if (start_pos < end_pos)
|
|
|
|
{
|
|
|
|
pos = end_pos;
|
|
|
|
sd->sel_handler_cursor = EDJE_CURSOR_SELECTION_END;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pos = start_pos;
|
|
|
|
sd->sel_handler_cursor = EDJE_CURSOR_SELECTION_BEGIN;
|
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
main_pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN);
|
|
|
|
if (pos != main_pos)
|
2013-11-08 00:18:28 -08:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, pos);
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje, "elm.text",
|
|
|
|
&cx, &cy, &cw, &ch);
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL);
|
2014-03-06 02:33:05 -08:00
|
|
|
sd->ox = ev->canvas.x - (ex + cx + (cw / 2));
|
|
|
|
sd->oy = ev->canvas.y - (ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2014-03-06 03:12:58 -08:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
|
|
|
sd->long_pressed = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
|
|
|
{
|
|
|
|
_magnifier_create(data);
|
|
|
|
_magnifier_show(data);
|
2013-11-08 00:18:28 -08:00
|
|
|
_magnifier_move(data, ex + cx, ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_end_handler_mouse_up_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
sd->end_handler_down = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
|
|
|
_magnifier_hide(data);
|
2015-12-10 22:49:27 -08:00
|
|
|
/* Context menu appear was checked in case of selector start, and hence
|
|
|
|
* the same should be checked at selector end as well */
|
|
|
|
if ((!_elm_config->context_menu_disabled) &&
|
|
|
|
(!_elm_config->desktop_entry) && (sd->long_pressed))
|
2013-11-08 00:06:08 -08:00
|
|
|
_menu_call(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_end_handler_mouse_move_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
|
|
|
|
2013-11-08 00:18:28 -08:00
|
|
|
if (!sd->end_handler_down) return;
|
2013-11-08 00:06:08 -08:00
|
|
|
Evas_Event_Mouse_Move *ev = event_info;
|
|
|
|
Evas_Coord ex, ey;
|
|
|
|
Evas_Coord cx, cy, ch;
|
2014-03-06 02:33:05 -08:00
|
|
|
int pos;
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
evas_object_geometry_get(sd->entry_edje, &ex, &ey, NULL, NULL);
|
2014-03-06 02:33:05 -08:00
|
|
|
cx = ev->cur.canvas.x - sd->ox - ex;
|
|
|
|
cy = ev->cur.canvas.y - sd->oy - ey;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (cx <= 0) cx = 1;
|
2013-11-21 18:06:37 -08:00
|
|
|
|
2014-03-06 02:33:05 -08:00
|
|
|
edje_object_part_text_cursor_coord_set(sd->entry_edje, "elm.text",
|
|
|
|
sd->sel_handler_cursor, cx, cy);
|
|
|
|
pos = edje_object_part_text_cursor_pos_get(sd->entry_edje, "elm.text",
|
|
|
|
sd->sel_handler_cursor);
|
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text",
|
|
|
|
EDJE_CURSOR_MAIN, pos);
|
2013-11-08 00:06:08 -08:00
|
|
|
edje_object_part_text_cursor_geometry_get(sd->entry_edje,
|
|
|
|
"elm.text",
|
|
|
|
&cx, &cy, NULL, &ch);
|
2014-03-06 03:12:58 -08:00
|
|
|
ELM_SAFE_FREE(sd->longpress_timer, ecore_timer_del);
|
|
|
|
sd->long_pressed = EINA_FALSE;
|
2013-11-08 00:06:08 -08:00
|
|
|
if (_elm_config->magnifier_enable)
|
2013-11-08 00:18:28 -08:00
|
|
|
_magnifier_move(data, ex + cx, ey + cy + (ch / 2));
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_add(Eo *obj, Elm_Entry_Data *priv)
|
2008-10-14 01:05:30 -07:00
|
|
|
{
|
2013-10-05 01:14:12 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
|
2013-09-24 21:33:39 -07:00
|
|
|
elm_widget_sub_object_parent_add(obj);
|
2013-08-26 08:29:45 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
priv->entry_edje = wd->resize_obj;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
priv->cnp_mode = ELM_CNP_MODE_MARKUP;
|
|
|
|
priv->line_wrap = ELM_WRAP_WORD;
|
|
|
|
priv->context_menu = EINA_TRUE;
|
|
|
|
priv->auto_save = EINA_TRUE;
|
|
|
|
priv->editable = EINA_TRUE;
|
|
|
|
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
priv->drop_format = ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE;
|
|
|
|
elm_drop_target_add(obj, priv->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
|
|
|
|
2013-03-01 18:04:31 -08:00
|
|
|
if (!elm_layout_theme_set(obj, "entry", "base", elm_widget_style_get(obj)))
|
2013-12-25 20:03:55 -08:00
|
|
|
CRI("Failed to set layout!");
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
|
|
|
|
evas_object_data_set(priv->hit_rect, "_elm_leaveme", obj);
|
2015-07-28 12:00:58 -07:00
|
|
|
|
|
|
|
Evas_Object* clip = evas_object_clip_get(priv->entry_edje);
|
|
|
|
evas_object_clip_set(priv->hit_rect, clip);
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_smart_member_add(priv->hit_rect, obj);
|
|
|
|
elm_widget_sub_object_add(obj, priv->hit_rect);
|
|
|
|
|
|
|
|
/* common scroller hit rectangle setup */
|
|
|
|
evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
|
|
|
|
evas_object_show(priv->hit_rect);
|
|
|
|
evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
|
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_objects_set(priv->entry_edje, priv->hit_rect));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
edje_object_item_provider_set(priv->entry_edje, _item_get, obj);
|
|
|
|
|
|
|
|
edje_object_text_markup_filter_callback_add
|
|
|
|
(priv->entry_edje, "elm.text", _markup_filter_cb, obj);
|
|
|
|
|
2013-04-02 10:23:20 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(priv->entry_edje, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(priv->entry_edje, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(priv->entry_edje, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(priv->entry_edje, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj);
|
|
|
|
|
|
|
|
/* this code can't go in smart_resize. sizing gets wrong */
|
|
|
|
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
|
|
|
|
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,changed", "elm.text",
|
|
|
|
_entry_changed_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,changed,user", "elm.text",
|
|
|
|
_entry_changed_user_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "preedit,changed", "elm.text",
|
|
|
|
_entry_preedit_changed_signal_cb, obj);
|
|
|
|
|
|
|
|
_entry_selection_callbacks_register(obj);
|
|
|
|
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "cursor,changed", "elm.text",
|
|
|
|
_entry_cursor_changed_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "cursor,changed,manual", "elm.text",
|
|
|
|
_entry_cursor_changed_manual_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,down,*", "elm.text",
|
|
|
|
_entry_anchor_down_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,up,*", "elm.text",
|
|
|
|
_entry_anchor_up_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,clicked,*", "elm.text",
|
|
|
|
_entry_anchor_clicked_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,move,*", "elm.text",
|
|
|
|
_entry_anchor_move_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,in,*", "elm.text",
|
|
|
|
_entry_anchor_in_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "anchor,mouse,out,*", "elm.text",
|
|
|
|
_entry_anchor_out_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,key,enter", "elm.text",
|
|
|
|
_entry_key_enter_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,key,escape", "elm.text",
|
|
|
|
_entry_key_escape_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "mouse,down,1", "elm.text",
|
|
|
|
_entry_mouse_down_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "mouse,clicked,1", "elm.text",
|
|
|
|
_entry_mouse_clicked_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "mouse,down,1,double", "elm.text",
|
|
|
|
_entry_mouse_double_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "mouse,down,1,triple", "elm.text",
|
|
|
|
_entry_mouse_triple_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,undo,request", "elm.text",
|
|
|
|
_entry_undo_request_signal_cb, obj);
|
|
|
|
edje_object_signal_callback_add
|
|
|
|
(priv->entry_edje, "entry,redo,request", "elm.text",
|
|
|
|
_entry_redo_request_signal_cb, obj);
|
|
|
|
|
|
|
|
elm_layout_text_set(obj, "elm.text", "");
|
|
|
|
|
|
|
|
elm_object_sub_cursor_set
|
2012-11-25 22:32:53 -08:00
|
|
|
(wd->resize_obj, obj, ELM_CURSOR_XTERM);
|
2010-09-27 21:28:14 -07:00
|
|
|
elm_widget_can_focus_set(obj, EINA_TRUE);
|
2011-04-01 06:20:40 -07:00
|
|
|
if (_elm_config->desktop_entry)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(priv->entry_edje, "elm.text", EINA_TRUE);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
2008-11-18 22:23:08 -08:00
|
|
|
|
2011-08-25 00:25:37 -07:00
|
|
|
elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
|
2012-02-02 20:51:38 -08:00
|
|
|
elm_entry_input_panel_enabled_set(obj, EINA_TRUE);
|
2012-02-13 20:54:19 -08:00
|
|
|
elm_entry_prediction_allow_set(obj, EINA_TRUE);
|
2014-09-01 03:04:05 -07:00
|
|
|
elm_entry_input_hint_set(obj, ELM_INPUT_HINT_AUTO_COMPLETE);
|
2011-08-25 00:25:37 -07:00
|
|
|
|
2013-06-26 09:54:26 -07:00
|
|
|
priv->autocapital_type = (Elm_Autocapital_Type)edje_object_part_text_autocapital_type_get
|
2012-08-30 09:45:15 -07:00
|
|
|
(priv->entry_edje, "elm.text");
|
2011-10-26 22:43:08 -07:00
|
|
|
|
2008-11-18 00:45:38 -08:00
|
|
|
entries = eina_list_prepend(entries, obj);
|
2010-02-08 19:27:11 -08:00
|
|
|
|
2009-12-01 03:03:14 -08:00
|
|
|
// module - find module for entry
|
2012-08-30 09:45:15 -07:00
|
|
|
priv->api = _module_find(obj);
|
2009-12-01 03:03:14 -08:00
|
|
|
// if found - hook in
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((priv->api) && (priv->api->obj_hook)) priv->api->obj_hook(obj);
|
2010-02-08 19:27:11 -08:00
|
|
|
|
2011-02-08 04:08:28 -08:00
|
|
|
_mirrored_set(obj, elm_widget_mirrored_get(obj));
|
2012-08-18 06:52:03 -07:00
|
|
|
|
|
|
|
// access
|
2012-08-30 09:45:15 -07:00
|
|
|
_elm_access_object_register(obj, priv->entry_edje);
|
2012-08-18 06:52:03 -07:00
|
|
|
_elm_access_text_set
|
2013-07-30 20:53:04 -07:00
|
|
|
(_elm_access_info_get(obj), ELM_ACCESS_TYPE, E_("Entry"));
|
2012-08-18 06:52:03 -07:00
|
|
|
_elm_access_callback_set
|
2013-07-30 20:53:04 -07:00
|
|
|
(_elm_access_info_get(obj), ELM_ACCESS_INFO, _access_info_cb, NULL);
|
2012-08-18 06:52:03 -07:00
|
|
|
_elm_access_callback_set
|
2013-07-30 20:53:04 -07:00
|
|
|
(_elm_access_info_get(obj), ELM_ACCESS_STATE, _access_state_cb, NULL);
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
if (_elm_config->desktop_entry)
|
|
|
|
priv->sel_handler_disabled = EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_create_selection_handlers(Evas_Object *obj, Elm_Entry_Data *sd)
|
|
|
|
{
|
|
|
|
Evas_Object *handle;
|
2015-01-19 17:32:06 -08:00
|
|
|
const char *style = elm_widget_style_get(obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
|
|
|
|
handle = edje_object_add(evas_object_evas_get(obj));
|
|
|
|
sd->start_handler = handle;
|
2015-01-19 17:32:06 -08:00
|
|
|
_elm_theme_object_set(obj, handle, "entry", "handler/start", style);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_DOWN,
|
2013-11-08 00:06:08 -08:00
|
|
|
_start_handler_mouse_down_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_MOVE,
|
2013-11-08 00:06:08 -08:00
|
|
|
_start_handler_mouse_move_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_UP,
|
2013-11-08 00:06:08 -08:00
|
|
|
_start_handler_mouse_up_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_show(handle);
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
handle = edje_object_add(evas_object_evas_get(obj));
|
|
|
|
sd->end_handler = handle;
|
2015-01-19 17:32:06 -08:00
|
|
|
_elm_theme_object_set(obj, handle, "entry", "handler/end", style);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_DOWN,
|
2013-11-08 00:06:08 -08:00
|
|
|
_end_handler_mouse_down_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_MOVE,
|
2013-11-08 00:06:08 -08:00
|
|
|
_end_handler_mouse_move_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_event_callback_add(handle, EVAS_CALLBACK_MOUSE_UP,
|
2013-11-08 00:06:08 -08:00
|
|
|
_end_handler_mouse_up_cb, obj);
|
2014-04-24 01:52:22 -07:00
|
|
|
evas_object_show(handle);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_del(Eo *obj, Elm_Entry_Data *sd)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
Elm_Entry_Context_Menu_Item *it;
|
|
|
|
Elm_Entry_Item_Provider *ip;
|
|
|
|
Elm_Entry_Markup_Filter *tf;
|
|
|
|
|
|
|
|
if (sd->delay_write)
|
|
|
|
{
|
2013-11-15 20:21:36 -08:00
|
|
|
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->auto_save) _save_do(obj);
|
|
|
|
}
|
|
|
|
|
2014-01-09 23:37:55 -08:00
|
|
|
if (sd->scroll)
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_resize_cb_set(NULL));
|
2014-01-09 23:37:55 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_anchor_hover_end(obj);
|
|
|
|
elm_entry_anchor_hover_parent_set(obj, NULL);
|
|
|
|
|
|
|
|
evas_event_freeze(evas_object_evas_get(obj));
|
|
|
|
|
2014-01-21 06:16:41 -08:00
|
|
|
eina_stringshare_del(sd->file);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-01-21 06:16:41 -08:00
|
|
|
ecore_job_del(sd->hov_deljob);
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->api) && (sd->api->obj_unhook))
|
|
|
|
sd->api->obj_unhook(obj); // module - unhook
|
|
|
|
|
2014-01-21 06:16:41 -08:00
|
|
|
evas_object_del(sd->mgf_proxy);
|
|
|
|
evas_object_del(sd->mgf_bg);
|
|
|
|
evas_object_del(sd->mgf_clip);
|
2013-06-07 01:17:30 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
entries = eina_list_remove(entries, obj);
|
2014-01-21 06:16:41 -08:00
|
|
|
eina_stringshare_del(sd->cut_sel);
|
|
|
|
eina_stringshare_del(sd->text);
|
|
|
|
ecore_job_del(sd->deferred_recalc_job);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->append_text_idler)
|
|
|
|
{
|
|
|
|
ecore_idler_del(sd->append_text_idler);
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(sd->append_text_left, free);
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->append_text_idler = NULL;
|
|
|
|
}
|
2014-01-21 06:16:41 -08:00
|
|
|
ecore_timer_del(sd->longpress_timer);
|
2013-03-08 20:23:42 -08:00
|
|
|
EINA_LIST_FREE(sd->items, it)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
eina_stringshare_del(it->label);
|
|
|
|
eina_stringshare_del(it->icon_file);
|
|
|
|
eina_stringshare_del(it->icon_group);
|
|
|
|
free(it);
|
|
|
|
}
|
2013-03-08 20:23:42 -08:00
|
|
|
EINA_LIST_FREE(sd->item_providers, ip)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
free(ip);
|
|
|
|
}
|
2013-03-08 20:23:42 -08:00
|
|
|
EINA_LIST_FREE(sd->markup_filters, tf)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
|
|
|
_filter_free(tf);
|
|
|
|
}
|
2013-11-15 20:21:36 -08:00
|
|
|
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
|
2014-01-21 17:12:44 -08:00
|
|
|
free(sd->input_panel_imdata);
|
|
|
|
eina_stringshare_del(sd->anchor_hover.hover_style);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
evas_event_thaw(evas_object_evas_get(obj));
|
|
|
|
evas_event_thaw_eval(evas_object_evas_get(obj));
|
|
|
|
|
2014-04-24 01:52:22 -07:00
|
|
|
if (sd->start_handler)
|
|
|
|
{
|
|
|
|
evas_object_del(sd->start_handler);
|
|
|
|
evas_object_del(sd->end_handler);
|
|
|
|
}
|
2013-11-08 00:06:08 -08:00
|
|
|
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_move(Eo *obj, Elm_Entry_Data *sd, Evas_Coord x, Evas_Coord y)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_move(x, y));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
evas_object_move(sd->hit_rect, x, y);
|
|
|
|
|
|
|
|
if (sd->hoversel) _hoversel_position(obj);
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
if (edje_object_part_text_selection_get(sd->entry_edje, "elm.text"))
|
|
|
|
_update_selection_handler(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_resize(Eo *obj, Elm_Entry_Data *sd, Evas_Coord w, Evas_Coord h)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_resize(w, h));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
evas_object_resize(sd->hit_rect, w, h);
|
2015-05-19 05:13:55 -07:00
|
|
|
if (sd->have_selection)
|
|
|
|
_update_selection_handler(obj);
|
2014-05-25 19:28:12 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_show(Eo *obj, Elm_Entry_Data *sd)
|
2014-05-25 19:28:12 -07:00
|
|
|
{
|
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_show());
|
|
|
|
|
|
|
|
if (sd->have_selection)
|
|
|
|
_update_selection_handler(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_hide(Eo *obj, Elm_Entry_Data *sd)
|
2014-05-25 19:28:12 -07:00
|
|
|
{
|
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
|
|
|
|
|
|
|
|
if (sd->have_selection)
|
|
|
|
_hide_selection_handler(obj);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2014-06-03 03:35:28 -07:00
|
|
|
_elm_entry_evas_object_smart_member_add(Eo *obj, Elm_Entry_Data *sd, Evas_Object *member)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2013-03-18 09:07:38 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, evas_obj_smart_member_add(member));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->hit_rect)
|
|
|
|
evas_object_raise(sd->hit_rect);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static const Elm_Layout_Part_Alias_Description *
|
|
|
|
_elm_entry_elm_layout_content_aliases_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd EINA_UNUSED)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return _content_aliases;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_layout_theme_enable(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd EINA_UNUSED)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_FALSE;
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_entry_add(Evas_Object *parent)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
|
2012-11-25 22:32:53 -08:00
|
|
|
Evas_Object *obj = eo_add(MY_CLASS, parent);
|
|
|
|
return obj;
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2015-04-02 02:37:37 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_cb_added(void *data EINA_UNUSED,
|
|
|
|
Eo *obj,
|
|
|
|
const Eo_Event_Description *desc EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
const Eo_Callback_Array_Item *event = event_info;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
if (event->desc == ELM_ENTRY_EVENT_VALIDATE)
|
|
|
|
sd->validators++;
|
|
|
|
return EO_CALLBACK_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2015-12-21 03:41:34 -08:00
|
|
|
_cb_deleted(void *data EINA_UNUSED,
|
2015-04-02 02:37:37 -07:00
|
|
|
Eo *obj,
|
|
|
|
const Eo_Event_Description *desc EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
const Eo_Callback_Array_Item *event = event_info;
|
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
if (event->desc == ELM_ENTRY_EVENT_VALIDATE)
|
|
|
|
sd->validators--;
|
|
|
|
return EO_CALLBACK_CONTINUE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-05-19 05:34:07 -07:00
|
|
|
EOLIAN static Eo *
|
2014-03-22 10:44:29 -07:00
|
|
|
_elm_entry_eo_base_constructor(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2015-05-19 05:34:07 -07:00
|
|
|
obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
|
2012-11-25 22:32:53 -08:00
|
|
|
eo_do(obj,
|
2013-11-07 03:44:22 -08:00
|
|
|
evas_obj_type_set(MY_CLASS_NAME_LEGACY),
|
2014-06-10 00:18:17 -07:00
|
|
|
evas_obj_smart_callbacks_descriptions_set(_smart_callbacks),
|
2015-04-02 02:37:37 -07:00
|
|
|
elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_ENTRY),
|
|
|
|
eo_event_callback_add(EO_EV_CALLBACK_ADD, _cb_added, NULL),
|
2015-12-21 03:41:34 -08:00
|
|
|
eo_event_callback_add(EO_EV_CALLBACK_DEL, _cb_deleted, NULL));
|
2015-05-19 05:34:07 -07:00
|
|
|
|
|
|
|
return obj;
|
2008-10-14 01:05:30 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_text_style_user_push(Eo *obj, Elm_Entry_Data *sd, const char *style)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_style_user_push(sd->entry_edje, "elm.text", style);
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2012-05-30 05:18:48 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_text_style_user_pop(Eo *obj, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_style_user_pop(sd->entry_edje, "elm.text");
|
|
|
|
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2012-05-30 05:18:48 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static const char*
|
2015-06-25 04:21:00 -07:00
|
|
|
_elm_entry_text_style_user_peek(const Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_style_user_peek(sd->entry_edje, "elm.text");
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_single_line_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool single_line)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line == single_line) return;
|
|
|
|
|
|
|
|
sd->single_line = single_line;
|
|
|
|
sd->line_wrap = ELM_WRAP_NONE;
|
2013-02-06 21:55:49 -08:00
|
|
|
if (elm_entry_cnp_mode_get(obj) == ELM_CNP_MODE_MARKUP)
|
|
|
|
elm_entry_cnp_mode_set(obj, ELM_CNP_MODE_NO_IMAGE);
|
2015-12-21 06:41:28 -08:00
|
|
|
if (sd->single_line)
|
|
|
|
{
|
|
|
|
_entry_new_line_filter_init(obj);
|
|
|
|
elm_entry_markup_filter_append(obj, _entry_new_line_filter_cb, NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
elm_entry_markup_filter_remove(obj, _entry_new_line_filter_cb, NULL);
|
|
|
|
}
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line)
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_policy_set(ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF));
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
|
|
|
{
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_policy_set(sd->policy_h, sd->policy_v));
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2008-10-22 01:58:56 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_single_line_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2008-10-22 01:58:56 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->single_line;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_password_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool password)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
password = !!password;
|
|
|
|
|
|
|
|
if (sd->password == password) return;
|
|
|
|
sd->password = password;
|
|
|
|
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
elm_drop_target_del(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2011-12-03 14:16:14 -08:00
|
|
|
if (password)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->single_line = EINA_TRUE;
|
|
|
|
sd->line_wrap = ELM_WRAP_NONE;
|
2014-09-01 03:04:05 -07:00
|
|
|
elm_entry_input_hint_set(obj, ((sd->input_hints & ~ELM_INPUT_HINT_AUTO_COMPLETE) | ELM_INPUT_HINT_SENSITIVE_DATA));
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_callbacks_unregister(obj);
|
2015-06-03 08:36:42 -07:00
|
|
|
elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_PASSWORD_TEXT);
|
2011-12-03 14:16:14 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
sd->drop_format = _get_drop_format(obj);
|
|
|
|
elm_drop_target_add(obj, sd->drop_format,
|
2013-02-21 05:21:08 -08:00
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2013-05-13 04:18:24 -07:00
|
|
|
|
2014-09-01 03:04:05 -07:00
|
|
|
elm_entry_input_hint_set(obj, ((sd->input_hints | ELM_INPUT_HINT_AUTO_COMPLETE) & ~ELM_INPUT_HINT_SENSITIVE_DATA));
|
2012-08-30 09:45:15 -07:00
|
|
|
_entry_selection_callbacks_register(obj);
|
2015-06-03 08:36:42 -07:00
|
|
|
elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_ENTRY);
|
2012-08-30 09:45:15 -07:00
|
|
|
}
|
|
|
|
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2008-10-22 01:58:56 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_password_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->password;
|
2010-03-25 10:27:00 -07:00
|
|
|
}
|
|
|
|
|
2012-01-02 03:17:29 -08:00
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_entry_set(Evas_Object *obj,
|
|
|
|
const char *entry)
|
2008-10-14 01:05:30 -07:00
|
|
|
{
|
2012-10-18 17:56:03 -07:00
|
|
|
ELM_ENTRY_CHECK(obj);
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_layout_text_set(NULL, entry));
|
2008-10-14 01:05:30 -07:00
|
|
|
}
|
2008-10-15 02:58:44 -07:00
|
|
|
|
2012-01-02 03:17:29 -08:00
|
|
|
EAPI const char *
|
|
|
|
elm_entry_entry_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-10-18 17:56:03 -07:00
|
|
|
ELM_ENTRY_CHECK(obj) NULL;
|
2014-04-03 08:02:32 -07:00
|
|
|
const char *text = NULL;
|
|
|
|
eo_do((Eo *)obj, text = elm_obj_layout_text_get(NULL));
|
2012-11-25 22:32:53 -08:00
|
|
|
return text;
|
2012-01-02 03:17:29 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_entry_append(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char *entry)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2011-06-13 04:07:43 -07:00
|
|
|
if (!entry) entry = "";
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
sd->changed = EINA_TRUE;
|
2015-07-13 09:38:45 -07:00
|
|
|
_entry_text_append(obj, entry, EINA_FALSE);
|
2011-06-13 04:07:43 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2015-06-25 04:21:00 -07:00
|
|
|
_elm_entry_is_empty(const Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
Eina_Bool ret;
|
2012-08-30 09:45:15 -07:00
|
|
|
/* FIXME: until there's support for that in textblock, we just
|
|
|
|
* check to see if the there is text or not. */
|
2011-01-24 19:04:33 -08:00
|
|
|
const Evas_Object *tb;
|
|
|
|
Evas_Textblock_Cursor *cur;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
/* It's a hack until we get the support suggested above. We just
|
2015-10-28 10:06:29 -07:00
|
|
|
* create a cursor, point it to the beginning, and then try to
|
2012-08-30 09:45:15 -07:00
|
|
|
* advance it, if it can advance, the tb is not empty, otherwise it
|
|
|
|
* is. */
|
|
|
|
tb = edje_object_part_object_get(sd->entry_edje, "elm.text");
|
|
|
|
|
|
|
|
/* This is actually, ok for the time being, these hackish stuff
|
|
|
|
will be removed once evas 1.0 is out */
|
|
|
|
cur = evas_object_textblock_cursor_new((Evas_Object *)tb);
|
2011-01-24 19:04:33 -08:00
|
|
|
evas_textblock_cursor_pos_set(cur, 0);
|
2014-03-22 10:44:29 -07:00
|
|
|
ret = evas_textblock_cursor_char_next(cur);
|
2011-01-24 19:04:33 -08:00
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return !ret;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Evas_Object*
|
|
|
|
_elm_entry_textblock_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return (Evas_Object *)edje_object_part_object_get
|
2013-12-30 18:23:28 -08:00
|
|
|
(sd->entry_edje, "elm.text");
|
2011-11-14 05:56:06 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_calc_force(Eo *obj, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_calc_force(sd->entry_edje);
|
|
|
|
sd->changed = EINA_TRUE;
|
|
|
|
elm_layout_sizing_eval(obj);
|
2011-11-14 05:56:06 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static const char*
|
|
|
|
_elm_entry_selection_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2013-11-08 00:06:08 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
if ((sd->password)) return NULL;
|
|
|
|
return edje_object_part_text_selection_get(sd->entry_edje, "elm.text");
|
2013-11-08 00:06:08 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_selection_handler_disabled_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool disabled)
|
2013-11-08 00:06:08 -08:00
|
|
|
{
|
|
|
|
if (sd->sel_handler_disabled == disabled) return;
|
|
|
|
sd->sel_handler_disabled = disabled;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_selection_handler_disabled_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2008-10-16 02:17:57 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->sel_handler_disabled;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_entry_insert(Eo *obj, Elm_Entry_Data *sd, const char *entry)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_insert(sd->entry_edje, "elm.text", entry);
|
|
|
|
sd->changed = EINA_TRUE;
|
|
|
|
elm_layout_sizing_eval(obj);
|
2008-10-16 02:17:57 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_line_wrap_set(Eo *obj, Elm_Entry_Data *sd, Elm_Wrap_Type wrap)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->line_wrap == wrap) return;
|
|
|
|
sd->last_w = -1;
|
|
|
|
sd->line_wrap = wrap;
|
2014-03-14 23:36:41 -07:00
|
|
|
if (wrap == ELM_WRAP_NONE)
|
2014-03-15 11:08:19 -07:00
|
|
|
ELM_SAFE_FREE(sd->deferred_recalc_job, ecore_job_del);
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2008-10-24 19:11:06 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Wrap_Type
|
|
|
|
_elm_entry_line_wrap_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2008-10-24 19:11:06 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->line_wrap;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_editable_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool editable)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->editable == editable) return;
|
|
|
|
sd->editable = editable;
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2010-09-06 23:56:16 -07:00
|
|
|
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
elm_drop_target_del(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2010-09-06 23:56:16 -07:00
|
|
|
if (editable)
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
{
|
|
|
|
sd->drop_format = _get_drop_format(obj);
|
|
|
|
elm_drop_target_add(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
|
|
|
}
|
2008-10-17 07:40:54 -07:00
|
|
|
}
|
2008-11-18 00:45:38 -08:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_editable_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2008-11-18 00:45:38 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->editable;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_select_none(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->password)) return;
|
|
|
|
if (sd->sel_mode)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->sel_mode = EINA_FALSE;
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2014-03-07 10:51:25 -08:00
|
|
|
if (sd->have_selection)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call
|
|
|
|
(EVAS_SELECTABLE_INTERFACE_EVENT_SELECTION_CLEARED, NULL));
|
2014-03-07 10:51:25 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->have_selection = EINA_FALSE;
|
|
|
|
edje_object_part_text_select_none(sd->entry_edje, "elm.text");
|
2013-11-08 00:06:08 -08:00
|
|
|
|
|
|
|
_hide_selection_handler(obj);
|
2008-11-18 00:45:38 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_select_all(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->password)) return;
|
|
|
|
if (sd->sel_mode)
|
2009-03-19 06:36:46 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->sel_mode = EINA_FALSE;
|
2011-04-01 06:20:40 -07:00
|
|
|
if (!_elm_config->desktop_entry)
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
2009-03-19 06:36:46 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_all(sd->entry_edje, "elm.text");
|
2008-11-18 00:45:38 -08:00
|
|
|
}
|
2009-01-26 16:44:29 -08:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_select_region_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, int start, int end)
|
2014-02-05 02:16:13 -08:00
|
|
|
{
|
|
|
|
if ((sd->password)) return;
|
|
|
|
if (sd->sel_mode)
|
|
|
|
{
|
|
|
|
sd->sel_mode = EINA_FALSE;
|
|
|
|
if (!_elm_config->desktop_entry)
|
|
|
|
edje_object_part_text_select_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", EINA_FALSE);
|
|
|
|
edje_object_signal_emit(sd->entry_edje, "elm,state,select,off", "elm");
|
|
|
|
}
|
|
|
|
|
2014-08-15 01:44:13 -07:00
|
|
|
/* Set have selection false to not be cleared handler in
|
|
|
|
selection_cleared_signal_cb() since that callback will be called while
|
|
|
|
resetting edje text. */
|
|
|
|
sd->have_selection = EINA_FALSE;
|
|
|
|
|
2014-02-05 02:16:13 -08:00
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, start);
|
|
|
|
edje_object_part_text_select_begin(sd->entry_edje, "elm.text");
|
|
|
|
edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, end);
|
|
|
|
edje_object_part_text_select_extend(sd->entry_edje, "elm.text");
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_geometry_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
|
2011-01-23 19:01:33 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_cursor_geometry_get
|
|
|
|
(sd->entry_edje, "elm.text", x, y, w, h);
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2011-01-23 19:01:33 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_next(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_next
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_prev(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_prev
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_up(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_up
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_down(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_down
|
2012-08-30 09:45:15 -07:00
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_begin_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
edje_object_part_text_cursor_begin_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_end_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
edje_object_part_text_cursor_end_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_line_begin_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
edje_object_part_text_cursor_line_begin_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_line_end_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_cursor_line_end_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_selection_begin(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_begin(sd->entry_edje, "elm.text");
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_selection_end(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_select_extend(sd->entry_edje, "elm.text");
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_is_format_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_is_format_get
|
2012-11-25 22:32:53 -08:00
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_cursor_is_visible_format_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_is_visible_format_get
|
2012-08-30 09:45:15 -07:00
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static char*
|
|
|
|
_elm_entry_cursor_content_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_content_get
|
2012-08-30 09:45:15 -07:00
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cursor_pos_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, int pos)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_cursor_pos_set
|
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN, pos);
|
|
|
|
edje_object_message_signal_process(sd->entry_edje);
|
2011-02-27 02:25:45 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_cursor_pos_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_cursor_pos_get
|
2012-08-30 09:45:15 -07:00
|
|
|
(sd->entry_edje, "elm.text", EDJE_CURSOR_MAIN);
|
2011-02-27 02:25:45 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_selection_cut(Eo *obj, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->password)) return;
|
|
|
|
_cut_cb(obj, NULL, NULL);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_selection_copy(Eo *obj, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->password)) return;
|
|
|
|
_copy_cb(obj, NULL, NULL);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_selection_paste(Eo *obj, Elm_Entry_Data *sd)
|
2009-12-01 03:03:14 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if ((sd->password)) return;
|
|
|
|
_paste_cb(obj, NULL, NULL);
|
2009-12-01 03:03:14 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_context_menu_clear(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-09-02 05:48:00 -07:00
|
|
|
{
|
|
|
|
Elm_Entry_Context_Menu_Item *it;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-03-08 20:23:42 -08:00
|
|
|
EINA_LIST_FREE(sd->items, it)
|
2009-09-02 05:48:00 -07:00
|
|
|
{
|
|
|
|
eina_stringshare_del(it->label);
|
|
|
|
eina_stringshare_del(it->icon_file);
|
|
|
|
eina_stringshare_del(it->icon_group);
|
|
|
|
free(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_context_menu_item_add(Eo *obj, Elm_Entry_Data *sd, const char *label, const char *icon_file, Elm_Icon_Type icon_type, Evas_Smart_Cb func, const void *data)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2009-09-02 05:48:00 -07:00
|
|
|
Elm_Entry_Context_Menu_Item *it;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2009-09-02 05:48:00 -07:00
|
|
|
it = calloc(1, sizeof(Elm_Entry_Context_Menu_Item));
|
|
|
|
if (!it) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
sd->items = eina_list_append(sd->items, it);
|
2009-09-02 05:48:00 -07:00
|
|
|
it->obj = obj;
|
|
|
|
it->label = eina_stringshare_add(label);
|
|
|
|
it->icon_file = eina_stringshare_add(icon_file);
|
|
|
|
it->icon_type = icon_type;
|
|
|
|
it->func = func;
|
|
|
|
it->data = (void *)data;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_context_menu_disabled_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool disabled)
|
2009-10-10 22:48:24 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->context_menu == !disabled) return;
|
|
|
|
sd->context_menu = !disabled;
|
2009-10-10 22:48:24 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_context_menu_disabled_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2009-10-10 22:48:24 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return !sd->context_menu;
|
2009-10-10 22:48:24 -07:00
|
|
|
}
|
|
|
|
|
2013-02-27 04:06:05 -08:00
|
|
|
EAPI const char *
|
|
|
|
elm_entry_context_menu_item_label_get(const Elm_Entry_Context_Menu_Item *item)
|
|
|
|
{
|
2014-05-10 07:15:54 -07:00
|
|
|
if (!item) return NULL;
|
2013-02-27 04:06:05 -08:00
|
|
|
return item->label;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
elm_entry_context_menu_item_icon_get(const Elm_Entry_Context_Menu_Item *item,
|
|
|
|
const char **icon_file,
|
|
|
|
const char **icon_group,
|
|
|
|
Elm_Icon_Type *icon_type)
|
|
|
|
{
|
2014-05-10 07:15:54 -07:00
|
|
|
if (!item) return;
|
2013-02-27 04:06:05 -08:00
|
|
|
if (icon_file) *icon_file = item->icon_file;
|
|
|
|
if (icon_group) *icon_group = item->icon_group;
|
|
|
|
if (icon_type) *icon_type = item->icon_type;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_item_provider_append(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data)
|
2010-04-27 01:06:42 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
Elm_Entry_Item_Provider *ip;
|
|
|
|
|
2010-12-03 06:08:33 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ip = calloc(1, sizeof(Elm_Entry_Item_Provider));
|
2010-04-27 01:06:42 -07:00
|
|
|
if (!ip) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-04-27 01:06:42 -07:00
|
|
|
ip->func = func;
|
|
|
|
ip->data = data;
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->item_providers = eina_list_append(sd->item_providers, ip);
|
2010-04-27 01:06:42 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_item_provider_prepend(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
Elm_Entry_Item_Provider *ip;
|
|
|
|
|
2010-12-03 06:08:33 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ip = calloc(1, sizeof(Elm_Entry_Item_Provider));
|
2010-04-27 01:06:42 -07:00
|
|
|
if (!ip) return;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-04-27 01:06:42 -07:00
|
|
|
ip->func = func;
|
|
|
|
ip->data = data;
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->item_providers = eina_list_prepend(sd->item_providers, ip);
|
2010-04-27 01:06:42 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_item_provider_remove(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data)
|
2010-04-27 01:06:42 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Elm_Entry_Item_Provider *ip;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-12-03 06:08:33 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->item_providers, l, ip)
|
2010-04-27 01:06:42 -07:00
|
|
|
{
|
2011-02-14 00:47:19 -08:00
|
|
|
if ((ip->func == func) && ((!data) || (ip->data == data)))
|
2010-04-27 01:06:42 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->item_providers = eina_list_remove_list(sd->item_providers, l);
|
2010-04-27 01:06:42 -07:00
|
|
|
free(ip);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_markup_filter_append(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Filter_Cb func, void *data)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-02-07 23:23:49 -08:00
|
|
|
Elm_Entry_Markup_Filter *tf;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
|
|
|
|
|
|
|
tf = _filter_new(func, data);
|
|
|
|
if (!tf) return;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->markup_filters = eina_list_append(sd->markup_filters, tf);
|
2012-02-07 23:23:49 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_markup_filter_prepend(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Filter_Cb func, void *data)
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
|
|
|
Elm_Entry_Markup_Filter *tf;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
|
|
|
|
|
|
|
tf = _filter_new(func, data);
|
|
|
|
if (!tf) return;
|
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->markup_filters = eina_list_prepend(sd->markup_filters, tf);
|
2012-02-07 23:23:49 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_markup_filter_remove(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Entry_Filter_Cb func, void *data)
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Elm_Entry_Markup_Filter *tf;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(func);
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->markup_filters, l, tf)
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
2013-05-16 02:10:13 -07:00
|
|
|
if ((tf->func == func) && ((!data) || (tf->orig_data == data)))
|
2012-02-07 23:23:49 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->markup_filters = eina_list_remove_list(sd->markup_filters, l);
|
2012-02-07 23:23:49 -08:00
|
|
|
_filter_free(tf);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-26 16:44:29 -08:00
|
|
|
EAPI char *
|
|
|
|
elm_entry_markup_to_utf8(const char *s)
|
|
|
|
{
|
2010-12-19 22:05:59 -08:00
|
|
|
char *ss = _elm_util_mkup_to_text(s);
|
2010-03-24 22:13:59 -07:00
|
|
|
if (!ss) ss = strdup("");
|
|
|
|
return ss;
|
2009-01-26 16:44:29 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI char *
|
|
|
|
elm_entry_utf8_to_markup(const char *s)
|
|
|
|
{
|
2010-12-19 22:05:59 -08:00
|
|
|
char *ss = _elm_util_text_to_mkup(s);
|
2010-03-24 22:13:59 -07:00
|
|
|
if (!ss) ss = strdup("");
|
|
|
|
return ss;
|
2009-01-26 16:44:29 -08:00
|
|
|
}
|
2010-09-06 23:56:16 -07:00
|
|
|
|
2011-12-30 02:02:19 -08:00
|
|
|
static const char *
|
|
|
|
_text_get(const Evas_Object *obj)
|
|
|
|
{
|
|
|
|
return elm_object_text_get(obj);
|
|
|
|
}
|
|
|
|
|
2010-10-07 05:50:00 -07:00
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_filter_limit_size(void *data,
|
|
|
|
Evas_Object *entry,
|
|
|
|
char **text)
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
const char *(*text_get)(const Evas_Object *);
|
2010-10-07 05:50:00 -07:00
|
|
|
Elm_Entry_Filter_Limit_Size *lim = data;
|
2011-09-24 21:14:17 -07:00
|
|
|
char *current, *utfstr;
|
2010-10-07 05:50:00 -07:00
|
|
|
int len, newlen;
|
|
|
|
|
2010-12-03 06:08:33 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(data);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(entry);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(text);
|
2010-10-07 05:50:00 -07:00
|
|
|
|
|
|
|
/* hack. I don't want to copy the entire function to work with
|
|
|
|
* scrolled_entry */
|
2011-12-30 02:02:19 -08:00
|
|
|
text_get = _text_get;
|
2010-10-07 05:50:00 -07:00
|
|
|
|
|
|
|
current = elm_entry_markup_to_utf8(text_get(entry));
|
2011-09-24 21:14:17 -07:00
|
|
|
utfstr = elm_entry_markup_to_utf8(*text);
|
2010-10-07 05:50:00 -07:00
|
|
|
|
|
|
|
if (lim->max_char_count > 0)
|
|
|
|
{
|
|
|
|
len = evas_string_char_len_get(current);
|
2012-04-06 01:13:41 -07:00
|
|
|
newlen = evas_string_char_len_get(utfstr);
|
|
|
|
if ((len >= lim->max_char_count) && (newlen > 0))
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(entry, eo_event_callback_call
|
|
|
|
(ELM_ENTRY_EVENT_MAXLENGTH_REACHED, NULL));
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(*text, free);
|
2011-09-24 21:14:17 -07:00
|
|
|
free(current);
|
|
|
|
free(utfstr);
|
2010-10-07 05:50:00 -07:00
|
|
|
return;
|
|
|
|
}
|
2011-06-14 02:50:05 -07:00
|
|
|
if ((len + newlen) > lim->max_char_count)
|
2012-08-30 09:45:15 -07:00
|
|
|
_chars_add_till_limit
|
|
|
|
(entry, text, (lim->max_char_count - len), LENGTH_UNIT_CHAR);
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
2011-06-14 02:50:05 -07:00
|
|
|
else if (lim->max_byte_count > 0)
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
|
|
|
len = strlen(current);
|
2012-04-06 01:13:41 -07:00
|
|
|
newlen = strlen(utfstr);
|
|
|
|
if ((len >= lim->max_byte_count) && (newlen > 0))
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(entry, eo_event_callback_call
|
|
|
|
(ELM_ENTRY_EVENT_MAXLENGTH_REACHED, NULL));
|
2014-01-21 18:08:47 -08:00
|
|
|
ELM_SAFE_FREE(*text, free);
|
2011-09-24 21:14:17 -07:00
|
|
|
free(current);
|
|
|
|
free(utfstr);
|
2010-10-07 05:50:00 -07:00
|
|
|
return;
|
|
|
|
}
|
2011-06-14 02:50:05 -07:00
|
|
|
if ((len + newlen) > lim->max_byte_count)
|
2012-08-30 09:45:15 -07:00
|
|
|
_chars_add_till_limit
|
|
|
|
(entry, text, (lim->max_byte_count - len), LENGTH_UNIT_BYTE);
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2010-10-07 05:50:00 -07:00
|
|
|
free(current);
|
2011-09-24 21:14:17 -07:00
|
|
|
free(utfstr);
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_filter_accept_set(void *data,
|
2013-12-30 01:25:15 -08:00
|
|
|
Evas_Object *entry,
|
2012-08-30 09:45:15 -07:00
|
|
|
char **text)
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
int read_idx, last_read_idx = 0, read_char;
|
2010-10-07 05:50:00 -07:00
|
|
|
Elm_Entry_Filter_Accept_Set *as = data;
|
2012-08-30 09:45:15 -07:00
|
|
|
Eina_Bool goes_in;
|
2013-12-30 01:25:15 -08:00
|
|
|
Eina_Bool rejected = EINA_FALSE;
|
2010-10-07 05:50:00 -07:00
|
|
|
const char *set;
|
|
|
|
char *insert;
|
|
|
|
|
2010-12-03 06:08:33 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(data);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(text);
|
|
|
|
|
|
|
|
if ((!as->accepted) && (!as->rejected))
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
return;
|
2010-10-07 05:50:00 -07:00
|
|
|
|
|
|
|
if (as->accepted)
|
|
|
|
{
|
|
|
|
set = as->accepted;
|
|
|
|
goes_in = EINA_TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
set = as->rejected;
|
|
|
|
goes_in = EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
insert = *text;
|
|
|
|
read_idx = evas_string_char_next_get(*text, 0, &read_char);
|
|
|
|
while (read_char)
|
|
|
|
{
|
|
|
|
int cmp_idx, cmp_char;
|
|
|
|
Eina_Bool in_set = EINA_FALSE;
|
|
|
|
|
2013-05-01 22:49:45 -07:00
|
|
|
if (read_char == '<')
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2013-05-01 22:49:45 -07:00
|
|
|
while (read_char && (read_char != '>'))
|
|
|
|
read_idx = evas_string_char_next_get(*text, read_idx, &read_char);
|
|
|
|
|
|
|
|
if (goes_in) in_set = EINA_TRUE;
|
|
|
|
else in_set = EINA_FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (read_char == '&')
|
2010-10-07 05:50:00 -07:00
|
|
|
{
|
2013-05-01 22:49:45 -07:00
|
|
|
while (read_char && (read_char != ';'))
|
|
|
|
read_idx = evas_string_char_next_get(*text, read_idx, &read_char);
|
|
|
|
|
|
|
|
if (!read_char)
|
|
|
|
{
|
|
|
|
if (goes_in) in_set = EINA_TRUE;
|
|
|
|
else in_set = EINA_FALSE;
|
|
|
|
goto inserting;
|
|
|
|
}
|
|
|
|
if (read_char == ';')
|
|
|
|
{
|
|
|
|
char *tag;
|
2013-06-27 00:30:54 -07:00
|
|
|
int utf8 = 0;
|
2013-05-01 22:49:45 -07:00
|
|
|
tag = malloc(read_idx - last_read_idx + 1);
|
|
|
|
if (tag)
|
|
|
|
{
|
2013-06-27 00:30:54 -07:00
|
|
|
char *markup;
|
2013-05-01 22:49:45 -07:00
|
|
|
strncpy(tag, (*text) + last_read_idx, read_idx - last_read_idx);
|
2013-06-27 00:30:54 -07:00
|
|
|
tag[read_idx - last_read_idx] = 0;
|
|
|
|
markup = elm_entry_markup_to_utf8(tag);
|
2013-05-01 22:49:45 -07:00
|
|
|
free(tag);
|
2013-06-27 00:30:54 -07:00
|
|
|
if (markup)
|
|
|
|
{
|
|
|
|
utf8 = *markup;
|
|
|
|
free(markup);
|
|
|
|
}
|
2013-05-05 23:51:54 -07:00
|
|
|
if (!utf8)
|
|
|
|
{
|
|
|
|
in_set = EINA_FALSE;
|
|
|
|
goto inserting;
|
|
|
|
}
|
|
|
|
read_char = utf8;
|
2013-05-01 22:49:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cmp_idx = evas_string_char_next_get(set, 0, &cmp_char);
|
|
|
|
while (cmp_char)
|
|
|
|
{
|
|
|
|
if (read_char == cmp_char)
|
|
|
|
{
|
|
|
|
in_set = EINA_TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
cmp_idx = evas_string_char_next_get(set, cmp_idx, &cmp_char);
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
|
|
|
}
|
2013-05-01 22:49:45 -07:00
|
|
|
|
|
|
|
inserting:
|
|
|
|
|
2010-10-07 05:50:00 -07:00
|
|
|
if (in_set == goes_in)
|
|
|
|
{
|
|
|
|
int size = read_idx - last_read_idx;
|
|
|
|
const char *src = (*text) + last_read_idx;
|
|
|
|
if (src != insert)
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
memcpy(insert, *text + last_read_idx, size);
|
2010-10-07 05:50:00 -07:00
|
|
|
insert += size;
|
|
|
|
}
|
2013-12-30 01:25:15 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
rejected = EINA_TRUE;
|
|
|
|
}
|
2013-05-01 22:49:45 -07:00
|
|
|
|
|
|
|
if (read_char)
|
|
|
|
{
|
|
|
|
last_read_idx = read_idx;
|
|
|
|
read_idx = evas_string_char_next_get(*text, read_idx, &read_char);
|
|
|
|
}
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
|
|
|
*insert = 0;
|
2013-12-30 01:25:15 -08:00
|
|
|
if (rejected)
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(entry, eo_event_callback_call(ELM_ENTRY_EVENT_REJECTED, NULL));
|
2010-10-07 05:50:00 -07:00
|
|
|
}
|
2010-09-06 23:56:16 -07:00
|
|
|
|
2015-07-01 10:30:23 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_file_text_format_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Text_Format format)
|
|
|
|
{
|
|
|
|
sd->format = format;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_entry_file_set(Evas_Object *obj, const char *file, Elm_Text_Format format)
|
|
|
|
{
|
|
|
|
Eina_Bool ret;
|
|
|
|
eo_do(obj, elm_obj_entry_file_text_format_set(format),
|
|
|
|
ret = efl_file_set(file, NULL));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2015-07-01 10:30:23 -07:00
|
|
|
_elm_entry_efl_file_file_set(Eo *obj, Elm_Entry_Data *sd, const char *file, const char *group EINA_UNUSED)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->auto_save) _save_do(obj);
|
|
|
|
eina_stringshare_replace(&sd->file, file);
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool int_ret = _load_do(obj);
|
2014-03-22 10:44:29 -07:00
|
|
|
return int_ret;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2015-07-01 10:30:23 -07:00
|
|
|
EAPI void
|
|
|
|
elm_entry_file_get(const Evas_Object *obj, const char **file, Elm_Text_Format *format)
|
|
|
|
{
|
|
|
|
eo_do(obj, efl_file_get(file, NULL));
|
|
|
|
if (format)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
if (!sd) return;
|
|
|
|
*format = sd->format;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2015-07-01 10:30:23 -07:00
|
|
|
_elm_entry_efl_file_file_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char **file, const char **group)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (file) *file = sd->file;
|
2015-07-01 10:30:23 -07:00
|
|
|
if (group) *group = NULL;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_file_save(Eo *obj, Elm_Entry_Data *sd)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2013-05-29 04:51:06 -07:00
|
|
|
ELM_SAFE_FREE(sd->delay_write, ecore_timer_del);
|
2012-08-30 09:45:15 -07:00
|
|
|
_save_do(obj);
|
2014-01-23 06:05:24 -08:00
|
|
|
sd->delay_write = ecore_timer_add(ELM_ENTRY_DELAY_WRITE_TIME,
|
|
|
|
_delay_write, obj);
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_autosave_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool auto_save)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->auto_save = !!auto_save;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_autosave_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->auto_save;
|
Remove elm_notepad
Notepad had a big issue: users couldn't access the entry, so notepad
was something near to an useless widget.
We needed to choose between wrap all entry functions or add these file
save / load and autosave features to entries.
As discussed on the emails list, we decided to go with the second
option, so we won't have an extra widget with lots of wrap functions.
Notepad was internally just an elm_entry with a scroll, so using
a scrolled entry with a file set will do the job.
I've added a test called Entry Notepad that looks like the removed
Notepad test. But we will see the improvements - you can clear the entry
or whatever you want, because the entry is the object you are creating.
If you were using elm_notepad before, just s/notepad/scrolled_entry
and almost everything should work fine. Another change was the function
file_save(obj, file, format), is now just file_save(obj), and the
file and format used are defined by file_set().
At last, some getters were added.
SVN revision: 54145
2010-11-04 04:56:15 -07:00
|
|
|
}
|
2011-01-13 15:04:25 -08:00
|
|
|
|
2012-03-05 00:31:58 -08:00
|
|
|
EINA_DEPRECATED EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_cnp_textonly_set(Evas_Object *obj,
|
|
|
|
Eina_Bool textonly)
|
2012-03-05 00:26:09 -08:00
|
|
|
{
|
2012-03-05 00:34:56 -08:00
|
|
|
Elm_Cnp_Mode cnp_mode = ELM_CNP_MODE_MARKUP;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
ELM_ENTRY_CHECK(obj);
|
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
if (textonly)
|
|
|
|
cnp_mode = ELM_CNP_MODE_NO_IMAGE;
|
|
|
|
elm_entry_cnp_mode_set(obj, cnp_mode);
|
|
|
|
}
|
|
|
|
|
2012-03-05 00:31:58 -08:00
|
|
|
EINA_DEPRECATED EAPI Eina_Bool
|
2012-03-05 00:26:09 -08:00
|
|
|
elm_entry_cnp_textonly_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_CHECK(obj) EINA_FALSE;
|
|
|
|
|
2012-03-05 00:26:09 -08:00
|
|
|
return elm_entry_cnp_mode_get(obj) != ELM_CNP_MODE_MARKUP;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_cnp_mode_set(Eo *obj, Elm_Entry_Data *sd, Elm_Cnp_Mode cnp_mode)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2011-01-13 15:04:25 -08:00
|
|
|
Elm_Sel_Format format = ELM_SEL_FORMAT_MARKUP;
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
|
|
|
|
if (sd->cnp_mode == cnp_mode) return;
|
|
|
|
sd->cnp_mode = cnp_mode;
|
|
|
|
if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT)
|
2012-03-05 00:26:09 -08:00
|
|
|
format = ELM_SEL_FORMAT_TEXT;
|
2012-08-30 09:45:15 -07:00
|
|
|
else if (cnp_mode == ELM_CNP_MODE_MARKUP)
|
|
|
|
format |= ELM_SEL_FORMAT_IMAGE;
|
2013-11-07 04:01:00 -08:00
|
|
|
|
[Dnd] Fix double text insert issue in elm_entry, drop at disable, non-editable entry
Summary:
Issue 1: If you drop text to elm_entry, text is inserted twice.
Reason: Drop callbacks are registered multiple times in elm_entry.
Resolve: Register only one drop callback at entry side.
Issue 2: Even thought entry is disabled, non-editable, you still can drop text, image file. (Example, run Entry Scrolled and drop text, image file to disabled or non-editable entries).
Reason: Drop callback are registered but not remove when entry is set to disabled, non-editable mode.
Resolve: Correct registering and removing drop callbacks in entry.
Reviewers: JackDanielZ, raster
Reviewed By: raster
CC: woohyun
Differential Revision: https://phab.enlightenment.org/D565
2014-02-18 19:25:08 -08:00
|
|
|
elm_drop_target_del(obj, sd->drop_format,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
|
|
|
sd->drop_format = format;
|
|
|
|
elm_drop_target_add(obj, sd->drop_format,
|
2013-02-21 05:21:08 -08:00
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
NULL, NULL,
|
|
|
|
_drag_drop_cb, NULL);
|
2011-01-13 15:04:25 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Cnp_Mode
|
|
|
|
_elm_entry_cnp_mode_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->cnp_mode;
|
2011-01-13 15:04:25 -08:00
|
|
|
}
|
|
|
|
|
2014-01-09 23:37:55 -08:00
|
|
|
static void
|
|
|
|
_elm_entry_content_viewport_resize_cb(Evas_Object *obj,
|
|
|
|
Evas_Coord w EINA_UNUSED, Evas_Coord h EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_elm_entry_resize_internal(obj);
|
|
|
|
}
|
|
|
|
|
2014-03-20 03:33:42 -07:00
|
|
|
static void
|
|
|
|
_scroll_cb(Evas_Object *obj, void *data EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
2014-05-22 14:33:46 -07:00
|
|
|
/* here we need to emit the signal that the elm_scroller would have done */
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call
|
|
|
|
(EVAS_SCROLLABLE_INTERFACE_EVENT_SCROLL, NULL));
|
2014-05-22 14:33:46 -07:00
|
|
|
|
2014-03-20 03:33:42 -07:00
|
|
|
if (sd->have_selection)
|
|
|
|
_update_selection_handler(obj);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_scrollable_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
|
|
|
scroll = !!scroll;
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->scroll == scroll) return;
|
|
|
|
sd->scroll = scroll;
|
|
|
|
|
|
|
|
if (sd->scroll)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
/* we now must re-theme ourselves to a scroller decoration
|
|
|
|
* and move the entry looking object to be the content of the
|
|
|
|
* scrollable view */
|
2013-10-16 08:54:54 -07:00
|
|
|
elm_widget_resize_object_set(obj, NULL, EINA_TRUE);
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_widget_sub_object_add(obj, sd->entry_edje);
|
|
|
|
|
|
|
|
if (!sd->scr_edje)
|
2011-12-05 17:07:04 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->scr_edje = edje_object_add(evas_object_evas_get(obj));
|
|
|
|
|
|
|
|
elm_widget_theme_object_set
|
|
|
|
(obj, sd->scr_edje, "scroller", "entry",
|
|
|
|
elm_widget_style_get(obj));
|
|
|
|
|
|
|
|
evas_object_size_hint_weight_set
|
|
|
|
(sd->scr_edje, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set
|
|
|
|
(sd->scr_edje, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
|
|
|
|
evas_object_propagate_events_set(sd->scr_edje, EINA_TRUE);
|
2011-12-05 17:07:04 -08:00
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2013-10-16 08:54:54 -07:00
|
|
|
elm_widget_resize_object_set(obj, sd->scr_edje, EINA_TRUE);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_objects_set(sd->scr_edje, sd->hit_rect));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2014-03-20 03:33:42 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_scroll_cb_set(_scroll_cb));
|
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_bounce_allow_set(sd->h_bounce, sd->v_bounce));
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->single_line)
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_policy_set(ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF));
|
2011-12-05 18:19:43 -08:00
|
|
|
else
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_policy_set(sd->policy_h, sd->policy_v));
|
|
|
|
eo_do(obj, elm_interface_scrollable_content_set(sd->entry_edje));
|
|
|
|
eo_do(obj, elm_interface_scrollable_content_viewport_resize_cb_set(_elm_entry_content_viewport_resize_cb));
|
2013-01-10 06:06:50 -08:00
|
|
|
elm_widget_on_show_region_hook_set(obj, _show_region_hook, NULL);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->scr_edje)
|
2011-12-05 17:07:04 -08:00
|
|
|
{
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_content_set(NULL));
|
2012-08-30 09:45:15 -07:00
|
|
|
evas_object_hide(sd->scr_edje);
|
2011-12-05 17:07:04 -08:00
|
|
|
}
|
2013-10-16 08:54:54 -07:00
|
|
|
elm_widget_resize_object_set(obj, sd->entry_edje, EINA_TRUE);
|
2012-08-30 09:45:15 -07:00
|
|
|
|
|
|
|
if (sd->scr_edje)
|
|
|
|
elm_widget_sub_object_add(obj, sd->scr_edje);
|
|
|
|
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_objects_set(sd->entry_edje, sd->hit_rect));
|
2012-08-30 09:45:15 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
elm_widget_on_show_region_hook_set(obj, NULL, NULL);
|
|
|
|
}
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->last_w = -1;
|
2014-04-03 08:02:32 -07:00
|
|
|
eo_do(obj, elm_obj_widget_theme_apply());
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_scrollable_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->scroll;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_icon_visible_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Eina_Bool setting)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (!elm_layout_content_get(obj, "elm.swallow.icon")) return;
|
2011-10-27 07:16:31 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
if (setting)
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,show,icon", "elm");
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,hide,icon", "elm");
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_end_visible_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Eina_Bool setting)
|
2012-08-30 09:45:15 -07:00
|
|
|
{
|
2013-07-09 00:57:16 -07:00
|
|
|
if (!elm_layout_content_get(obj, "elm.swallow.end")) return;
|
2011-10-27 07:16:26 -07:00
|
|
|
|
2011-06-17 02:44:31 -07:00
|
|
|
if (setting)
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,show,end", "elm");
|
2011-06-17 02:44:31 -07:00
|
|
|
else
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,hide,end", "elm");
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_scrollbar_policy_set(Evas_Object *obj,
|
|
|
|
Elm_Scroller_Policy h,
|
|
|
|
Elm_Scroller_Policy v)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_CHECK(obj);
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_policy_set(h, v));
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_interface_scrollable_policy_set(Eo *obj, Elm_Entry_Data *sd, Elm_Scroller_Policy h, Elm_Scroller_Policy v)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->policy_h = h;
|
|
|
|
sd->policy_v = v;
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, elm_interface_scrollable_policy_set(sd->policy_h, sd->policy_v));
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_bounce_set(Evas_Object *obj,
|
|
|
|
Eina_Bool h_bounce,
|
|
|
|
Eina_Bool v_bounce)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_CHECK(obj);
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do(obj, elm_interface_scrollable_bounce_allow_set(h_bounce, v_bounce));
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_interface_scrollable_bounce_allow_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool h_bounce, Eina_Bool v_bounce)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->h_bounce = h_bounce;
|
|
|
|
sd->v_bounce = v_bounce;
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do_super(obj, MY_CLASS, elm_interface_scrollable_bounce_allow_set(h_bounce, v_bounce));
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-08-30 09:45:15 -07:00
|
|
|
elm_entry_bounce_get(const Evas_Object *obj,
|
|
|
|
Eina_Bool *h_bounce,
|
|
|
|
Eina_Bool *v_bounce)
|
2011-06-17 02:44:31 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_CHECK(obj);
|
2014-03-17 04:44:40 -07:00
|
|
|
eo_do((Eo *) obj, elm_interface_scrollable_bounce_allow_get(h_bounce, v_bounce));
|
2011-06-17 02:44:31 -07:00
|
|
|
}
|
2011-08-25 00:25:37 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_layout_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Input_Panel_Layout layout)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_layout = layout;
|
2011-08-25 00:25:37 -07:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_layout_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Panel_Layout)layout);
|
2014-09-01 03:04:05 -07:00
|
|
|
|
|
|
|
if (layout == ELM_INPUT_PANEL_LAYOUT_PASSWORD)
|
|
|
|
elm_entry_input_hint_set(obj, ((sd->input_hints & ~ELM_INPUT_HINT_AUTO_COMPLETE) | ELM_INPUT_HINT_SENSITIVE_DATA));
|
|
|
|
else if (layout == ELM_INPUT_PANEL_LAYOUT_TERMINAL)
|
|
|
|
elm_entry_input_hint_set(obj, (sd->input_hints & ~ELM_INPUT_HINT_AUTO_COMPLETE));
|
2011-08-25 00:25:37 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Input_Panel_Layout
|
|
|
|
_elm_entry_input_panel_layout_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_layout;
|
2011-08-25 00:25:37 -07:00
|
|
|
}
|
2011-10-26 22:43:08 -07:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_layout_variation_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, int variation)
|
2013-03-27 01:34:19 -07:00
|
|
|
{
|
|
|
|
sd->input_panel_layout_variation = variation;
|
|
|
|
|
|
|
|
edje_object_part_text_input_panel_layout_variation_set
|
|
|
|
(sd->entry_edje, "elm.text", variation);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_input_panel_layout_variation_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2013-03-27 01:34:19 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_layout_variation;
|
2013-03-27 01:34:19 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_autocapital_type_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Autocapital_Type autocapital_type)
|
2011-10-26 22:43:08 -07:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->autocapital_type = autocapital_type;
|
|
|
|
edje_object_part_text_autocapital_type_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Text_Autocapital_Type)autocapital_type);
|
2011-10-26 22:43:08 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Autocapital_Type
|
|
|
|
_elm_entry_autocapital_type_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2011-10-26 22:43:08 -07:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->autocapital_type;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_prediction_allow_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool prediction)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->prediction_allow = prediction;
|
|
|
|
edje_object_part_text_prediction_allow_set
|
|
|
|
(sd->entry_edje, "elm.text", prediction);
|
2012-02-13 20:54:19 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_prediction_allow_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-02-13 03:43:58 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->prediction_allow;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-09-01 03:04:05 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_hint_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Input_Hints hints)
|
|
|
|
{
|
|
|
|
sd->input_hints = hints;
|
|
|
|
|
|
|
|
edje_object_part_text_input_hint_set
|
2015-07-29 07:26:14 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Hints)hints);
|
2014-09-01 03:04:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Elm_Input_Hints
|
|
|
|
_elm_entry_input_hint_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
|
|
|
{
|
|
|
|
return sd->input_hints;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_imf_context_reset(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_imf_context_reset(sd->entry_edje, "elm.text");
|
2012-02-13 03:43:58 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_enabled_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool enabled)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_enable = enabled;
|
|
|
|
edje_object_part_text_input_panel_enabled_set
|
|
|
|
(sd->entry_edje, "elm.text", enabled);
|
2011-10-26 22:43:08 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_input_panel_enabled_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_enable;
|
2012-02-02 23:32:40 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_show(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-02-12 22:50:45 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_show(sd->entry_edje, "elm.text");
|
2012-02-12 22:50:45 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_hide(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-02-12 22:50:45 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_hide(sd->entry_edje, "elm.text");
|
2012-02-12 22:50:45 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_language_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Input_Panel_Lang lang)
|
2012-02-15 00:42:46 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_lang = lang;
|
|
|
|
edje_object_part_text_input_panel_language_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Panel_Lang)lang);
|
2012-02-15 00:42:46 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Input_Panel_Lang
|
|
|
|
_elm_entry_input_panel_language_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-02-15 00:42:46 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_lang;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_imdata_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const void *data, int len)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-01-21 18:08:47 -08:00
|
|
|
free(sd->input_panel_imdata);
|
2012-02-15 00:42:46 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_imdata = calloc(1, len);
|
|
|
|
sd->input_panel_imdata_len = len;
|
|
|
|
memcpy(sd->input_panel_imdata, data, len);
|
2012-02-15 00:42:46 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_imdata_set
|
|
|
|
(sd->entry_edje, "elm.text", sd->input_panel_imdata,
|
|
|
|
sd->input_panel_imdata_len);
|
2012-02-15 00:42:46 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
2015-06-25 04:21:00 -07:00
|
|
|
_elm_entry_input_panel_imdata_get(const Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, void *data, int *len)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_imdata_get
|
|
|
|
(sd->entry_edje, "elm.text", data, len);
|
2012-02-15 00:42:46 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_return_key_type_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Elm_Input_Panel_Return_Key_Type return_key_type)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_return_key_type = return_key_type;
|
2012-02-15 00:42:46 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_return_key_type_set
|
2013-06-26 09:54:26 -07:00
|
|
|
(sd->entry_edje, "elm.text", (Edje_Input_Panel_Return_Key_Type)return_key_type);
|
2012-02-15 00:42:46 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Elm_Input_Panel_Return_Key_Type
|
|
|
|
_elm_entry_input_panel_return_key_type_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-02-15 00:42:46 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_return_key_type;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_return_key_disabled_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool disabled)
|
2012-02-15 00:42:46 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->input_panel_return_key_disabled = disabled;
|
2012-02-15 00:42:46 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
edje_object_part_text_input_panel_return_key_disabled_set
|
|
|
|
(sd->entry_edje, "elm.text", disabled);
|
2012-02-15 00:42:46 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_input_panel_return_key_disabled_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-02-27 17:50:19 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_return_key_disabled;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_return_key_autoenabled_set(Eo *obj, Elm_Entry_Data *sd, Eina_Bool enabled)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->auto_return_key = enabled;
|
|
|
|
_return_key_enabled_check(obj);
|
2012-02-27 17:50:19 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_input_panel_show_on_demand_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, Eina_Bool ondemand)
|
2014-01-13 02:32:01 -08:00
|
|
|
{
|
|
|
|
sd->input_panel_show_on_demand = ondemand;
|
|
|
|
|
|
|
|
edje_object_part_text_input_panel_show_on_demand_set
|
|
|
|
(sd->entry_edje, "elm.text", ondemand);
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_input_panel_show_on_demand_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2014-01-13 02:32:01 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->input_panel_show_on_demand;
|
2014-01-13 02:32:01 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void*
|
|
|
|
_elm_entry_imf_context_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2014-01-13 02:32:01 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
if (!sd) return NULL;
|
2014-01-13 02:32:01 -08:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
return edje_object_part_text_imf_context_get(sd->entry_edje, "elm.text");
|
2012-03-02 02:34:58 -08:00
|
|
|
}
|
2012-03-06 02:09:13 -08:00
|
|
|
|
|
|
|
/* START - ANCHOR HOVER */
|
|
|
|
static void
|
2012-08-30 09:45:15 -07:00
|
|
|
_anchor_parent_del_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-03-06 02:09:13 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
ELM_ENTRY_DATA_GET(data, sd);
|
2012-03-06 02:09:13 -08:00
|
|
|
|
2012-08-30 09:45:15 -07:00
|
|
|
sd->anchor_hover.hover_parent = NULL;
|
2012-04-25 04:34:28 -07:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_anchor_hover_parent_set(Eo *obj, Elm_Entry_Data *sd, Evas_Object *parent)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
if (sd->anchor_hover.hover_parent)
|
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->anchor_hover.hover_parent, EVAS_CALLBACK_DEL,
|
|
|
|
_anchor_parent_del_cb, obj);
|
|
|
|
sd->anchor_hover.hover_parent = parent;
|
|
|
|
if (sd->anchor_hover.hover_parent)
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->anchor_hover.hover_parent, EVAS_CALLBACK_DEL,
|
|
|
|
_anchor_parent_del_cb, obj);
|
2012-03-06 02:09:13 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Evas_Object*
|
|
|
|
_elm_entry_anchor_hover_parent_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-03-06 02:09:13 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->anchor_hover.hover_parent;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_anchor_hover_style_set(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char *style)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-08-30 09:45:15 -07:00
|
|
|
eina_stringshare_replace(&sd->anchor_hover.hover_style, style);
|
2012-03-06 02:09:13 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static const char*
|
|
|
|
_elm_entry_anchor_hover_style_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-03-06 02:09:13 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return sd->anchor_hover.hover_style;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_anchor_hover_end(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2013-07-03 04:29:43 -07:00
|
|
|
ELM_SAFE_FREE(sd->anchor_hover.hover, evas_object_del);
|
|
|
|
ELM_SAFE_FREE(sd->anchor_hover.pop, evas_object_del);
|
2012-03-06 02:09:13 -08:00
|
|
|
}
|
2013-04-16 04:05:04 -07:00
|
|
|
/* END - ANCHOR HOVER */
|
2012-03-06 02:09:13 -08:00
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_activate(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Elm_Activate act)
|
2014-01-20 01:45:51 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
|
2014-01-20 01:45:51 -08:00
|
|
|
|
|
|
|
ELM_ENTRY_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
if (!elm_widget_disabled_get(obj) &&
|
|
|
|
!evas_object_freeze_events_get(obj))
|
|
|
|
{
|
2015-05-10 07:50:04 -07:00
|
|
|
eo_do(obj, eo_event_callback_call
|
|
|
|
(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL));
|
2014-01-20 01:45:51 -08:00
|
|
|
if (sd->editable && sd->input_panel_enable)
|
|
|
|
edje_object_part_text_input_panel_show(sd->entry_edje, "elm.text");
|
|
|
|
}
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_TRUE;
|
2014-01-20 01:45:51 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Entry_Data *_pd EINA_UNUSED)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_FALSE;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Entry_Data *_pd EINA_UNUSED)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-22 10:44:29 -07:00
|
|
|
return EINA_FALSE;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-03-22 10:44:29 -07:00
|
|
|
_elm_entry_class_constructor(Eo_Class *klass)
|
|
|
|
{
|
2013-11-07 03:44:22 -08:00
|
|
|
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-06-10 00:18:17 -07:00
|
|
|
// ATSPI Accessibility
|
|
|
|
|
|
|
|
EOLIAN static Eina_Unicode
|
|
|
|
_elm_entry_elm_interface_atspi_text_character_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int offset)
|
|
|
|
{
|
|
|
|
char *txt;
|
2014-06-19 02:30:21 -07:00
|
|
|
int idx = 0;
|
2014-06-10 00:18:17 -07:00
|
|
|
Eina_Unicode ret = 0;
|
|
|
|
if (offset < 0) return ret;
|
|
|
|
|
|
|
|
txt = _elm_util_mkup_to_text(elm_entry_entry_get(obj));
|
|
|
|
if (!txt) return ret;
|
|
|
|
|
2014-06-19 02:30:21 -07:00
|
|
|
ret = eina_unicode_utf8_next_get(txt, &idx);
|
|
|
|
while (offset--) ret = eina_unicode_utf8_next_get(txt, &idx);
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
free(txt);
|
|
|
|
|
2015-06-03 08:36:42 -07:00
|
|
|
if (_pd->password)
|
|
|
|
ret = ENTRY_PASSWORD_MASK_CHARACTER;
|
|
|
|
|
2014-06-10 00:18:17 -07:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_elm_interface_atspi_text_character_count_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
char *txt;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
txt = _elm_util_mkup_to_text(elm_entry_entry_get(obj));
|
|
|
|
if (!txt) return ret;
|
|
|
|
|
|
|
|
ret = eina_unicode_utf8_get_len(txt);
|
|
|
|
free(txt);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static char*
|
|
|
|
_elm_entry_elm_interface_atspi_text_string_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Elm_Atspi_Text_Granularity granularity, int *start_offset, int *end_offset)
|
|
|
|
{
|
|
|
|
Evas_Textblock_Cursor *cur = NULL, *cur2 = NULL;
|
|
|
|
Evas_Object *tblk;
|
|
|
|
char *ret = NULL;
|
|
|
|
|
|
|
|
tblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!tblk) goto fail;
|
|
|
|
|
|
|
|
cur = evas_object_textblock_cursor_new(tblk);
|
|
|
|
cur2 = evas_object_textblock_cursor_new(tblk);
|
2014-06-11 00:05:54 -07:00
|
|
|
if (!cur || !cur2) goto fail;
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur, *start_offset);
|
|
|
|
if (evas_textblock_cursor_pos_get(cur) != *start_offset) goto fail;
|
|
|
|
|
|
|
|
switch (granularity)
|
|
|
|
{
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_CHAR:
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_WORD:
|
|
|
|
evas_textblock_cursor_word_start(cur);
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_SENTENCE:
|
|
|
|
// TODO - add sentence support in textblock first
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_LINE:
|
|
|
|
evas_textblock_cursor_line_char_first(cur);
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_PARAGRAPH:
|
|
|
|
evas_textblock_cursor_paragraph_char_first(cur);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
*start_offset = evas_textblock_cursor_pos_get(cur);
|
|
|
|
evas_textblock_cursor_copy(cur, cur2);
|
|
|
|
|
|
|
|
switch (granularity)
|
|
|
|
{
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_CHAR:
|
|
|
|
evas_textblock_cursor_char_next(cur2);
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_WORD:
|
|
|
|
evas_textblock_cursor_word_end(cur2);
|
|
|
|
// since word_end sets cursor position ON (before) last
|
|
|
|
// char of word, we need to manually advance cursor to get
|
|
|
|
// proper string from function range_text_get
|
|
|
|
evas_textblock_cursor_char_next(cur2);
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_SENTENCE:
|
|
|
|
// TODO - add sentence support in textblock first
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_LINE:
|
|
|
|
evas_textblock_cursor_line_char_last(cur2);
|
|
|
|
break;
|
|
|
|
case ELM_ATSPI_TEXT_GRANULARITY_PARAGRAPH:
|
|
|
|
evas_textblock_cursor_paragraph_char_last(cur2);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (end_offset) *end_offset = evas_textblock_cursor_pos_get(cur2);
|
|
|
|
|
|
|
|
ret = evas_textblock_cursor_range_text_get(cur, cur2, EVAS_TEXTBLOCK_TEXT_PLAIN);
|
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
2015-06-03 08:36:42 -07:00
|
|
|
if (ret && _pd->password)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
while (ret[i] != '\0')
|
|
|
|
ret[i++] = ENTRY_PASSWORD_MASK_CHARACTER;
|
|
|
|
}
|
|
|
|
|
2014-06-10 00:18:17 -07:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
fail:
|
|
|
|
if (start_offset) *start_offset = -1;
|
|
|
|
if (end_offset) *end_offset = -1;
|
|
|
|
if (cur) evas_textblock_cursor_free(cur);
|
|
|
|
if (cur2) evas_textblock_cursor_free(cur2);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static char*
|
|
|
|
_elm_entry_elm_interface_atspi_text_text_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int start_offset, int end_offset)
|
|
|
|
{
|
|
|
|
Evas_Textblock_Cursor *cur = NULL, *cur2 = NULL;
|
|
|
|
Evas_Object *tblk;
|
|
|
|
char *ret = NULL;
|
|
|
|
|
|
|
|
tblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!tblk) goto fail;
|
|
|
|
|
|
|
|
cur = evas_object_textblock_cursor_new(tblk);
|
|
|
|
cur2 = evas_object_textblock_cursor_new(tblk);
|
2014-06-11 00:05:54 -07:00
|
|
|
if (!cur || !cur2) goto fail;
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur, start_offset);
|
|
|
|
if (evas_textblock_cursor_pos_get(cur) != start_offset) goto fail;
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur2, end_offset);
|
|
|
|
if (evas_textblock_cursor_pos_get(cur2) != end_offset) goto fail;
|
|
|
|
|
|
|
|
ret = evas_textblock_cursor_range_text_get(cur, cur2, EVAS_TEXTBLOCK_TEXT_PLAIN);
|
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
2015-06-03 08:36:42 -07:00
|
|
|
if (ret && _pd->password)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
while (ret[i] != '\0')
|
|
|
|
ret[i++] = ENTRY_PASSWORD_MASK_CHARACTER;
|
|
|
|
}
|
|
|
|
|
2014-06-10 00:18:17 -07:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
fail:
|
|
|
|
if (cur) evas_textblock_cursor_free(cur);
|
|
|
|
if (cur2) evas_textblock_cursor_free(cur2);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_elm_interface_atspi_text_caret_offset_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return elm_entry_cursor_pos_get(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_caret_offset_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int offset)
|
|
|
|
{
|
|
|
|
elm_entry_cursor_pos_set(obj, offset);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_elm_interface_atspi_text_selections_count_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return elm_entry_selection_get(obj) ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static void
|
|
|
|
_elm_entry_elm_interface_atspi_text_selection_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int selection_number, int *start_offset, int *end_offset)
|
|
|
|
{
|
|
|
|
*start_offset = *end_offset = -1;
|
|
|
|
if (!elm_entry_selection_get(obj)) return;
|
|
|
|
if (selection_number != 0) return;
|
|
|
|
|
|
|
|
*start_offset = edje_object_part_text_cursor_pos_get(_pd->entry_edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN);
|
|
|
|
*end_offset = edje_object_part_text_cursor_pos_get(_pd->entry_edje, "elm.text", EDJE_CURSOR_SELECTION_END);
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_selection_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int selection_number, int start_offset, int end_offset)
|
|
|
|
{
|
|
|
|
if (selection_number != 0) return EINA_FALSE;
|
|
|
|
|
|
|
|
elm_entry_select_region_set(obj, start_offset, end_offset);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_selection_remove(Eo *obj, Elm_Entry_Data *pd EINA_UNUSED, int selection_number)
|
|
|
|
{
|
|
|
|
if (selection_number != 0) return EINA_FALSE;
|
|
|
|
elm_entry_select_none(obj);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_selection_add(Eo *obj, Elm_Entry_Data *pd EINA_UNUSED, int start_offset, int end_offset)
|
|
|
|
{
|
|
|
|
elm_entry_select_region_set(obj, start_offset, end_offset);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_List*
|
|
|
|
_elm_entry_elm_interface_atspi_text_bounded_ranges_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *_pd EINA_UNUSED, Eina_Bool screen_coods EINA_UNUSED, Eina_Rectangle rect EINA_UNUSED, Elm_Atspi_Text_Clip_Type xclip EINA_UNUSED, Elm_Atspi_Text_Clip_Type yclip EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static int
|
|
|
|
_elm_entry_elm_interface_atspi_text_offset_at_point_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Eina_Bool screen_coods, int x, int y)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return -1;
|
|
|
|
|
|
|
|
cur = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur) return -1;
|
|
|
|
|
|
|
|
if (screen_coods)
|
|
|
|
{
|
|
|
|
int ee_x, ee_y;
|
|
|
|
Ecore_Evas *ee= ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
|
|
|
|
ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
|
|
|
|
x -= ee_x;
|
|
|
|
y -= ee_y;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!evas_textblock_cursor_char_coord_set(cur, x, y))
|
|
|
|
{
|
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = evas_textblock_cursor_pos_get(cur);
|
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_character_extents_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int offset, Eina_Bool screen_coods, Eina_Rectangle *rect)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur) return EINA_FALSE;
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur, offset);
|
|
|
|
|
|
|
|
ret = evas_textblock_cursor_char_geometry_get(cur, &rect->x, &rect->y, &rect->w, &rect->h);
|
|
|
|
evas_textblock_cursor_free(cur);
|
|
|
|
|
|
|
|
if (ret == -1) return EINA_FALSE;
|
|
|
|
|
|
|
|
if (screen_coods)
|
|
|
|
{
|
|
|
|
int ee_x, ee_y;
|
|
|
|
Ecore_Evas *ee= ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
|
|
|
|
ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
|
|
|
|
rect->x += ee_x;
|
|
|
|
rect->y += ee_y;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_range_extents_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, Eina_Bool screen_coods, int start_offset, int end_offset, Eina_Rectangle *rect)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur1, *cur2;
|
|
|
|
int ret;
|
2014-06-19 02:30:21 -07:00
|
|
|
int x, xx, y, yy;
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur1 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur1) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur2 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur2)
|
|
|
|
{
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur1, start_offset);
|
|
|
|
evas_textblock_cursor_pos_set(cur2, end_offset);
|
|
|
|
|
2014-06-19 02:30:21 -07:00
|
|
|
ret = evas_textblock_cursor_char_geometry_get(cur1, &x, &y, NULL, NULL);
|
|
|
|
ret += evas_textblock_cursor_char_geometry_get(cur2, &xx, &yy, NULL, NULL);
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
|
|
|
if (ret != 0) return EINA_FALSE;
|
|
|
|
|
2014-06-19 02:30:21 -07:00
|
|
|
rect->x = x < xx ? x : xx;
|
|
|
|
rect->y = y < yy ? y : yy;
|
|
|
|
rect->w = abs(x - xx);
|
|
|
|
rect->h = abs(y - yy);
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
if (screen_coods)
|
|
|
|
{
|
|
|
|
int ee_x, ee_y;
|
|
|
|
Ecore_Evas *ee= ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
|
|
|
|
ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
|
|
|
|
rect->x += ee_x;
|
|
|
|
rect->y += ee_y;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Elm_Atspi_Text_Attribute*
|
|
|
|
_textblock_node_format_to_atspi_text_attr(const Evas_Object_Textblock_Node_Format *format)
|
|
|
|
{
|
|
|
|
Elm_Atspi_Text_Attribute *ret = NULL;
|
|
|
|
const char *txt;
|
|
|
|
|
|
|
|
txt = evas_textblock_node_format_text_get(format);
|
|
|
|
if (!txt) return NULL;
|
|
|
|
|
|
|
|
if (txt[0] == '-') return NULL; // skip closing format
|
|
|
|
|
|
|
|
if (!strncmp(txt, "+ ", 2))
|
|
|
|
{
|
|
|
|
const char *tmp = &txt[2];
|
|
|
|
|
|
|
|
while (*tmp != '\0' && *tmp != '=') tmp++;
|
|
|
|
if (*tmp++ != '=') return NULL;
|
|
|
|
|
|
|
|
ret = calloc(1, sizeof(Elm_Atspi_Text_Attribute));
|
|
|
|
if (!ret) return NULL;
|
|
|
|
|
|
|
|
ret->value = eina_stringshare_add(tmp);
|
|
|
|
int size = &txt[2] - tmp + 1;
|
|
|
|
ret->name = eina_stringshare_add_length(&txt[2], size > 0 ? size : -size);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_text_attribute_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, const char *attr_name EINA_UNUSED, int *start_offset, int *end_offset, char **value)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur1, *cur2;
|
|
|
|
Eina_List *formats, *l;
|
|
|
|
Evas_Object_Textblock_Node_Format *format;
|
|
|
|
Elm_Atspi_Text_Attribute *attr;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur1 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur1) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur2 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur2)
|
|
|
|
{
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur1, *start_offset);
|
|
|
|
evas_textblock_cursor_pos_set(cur2, *end_offset);
|
|
|
|
|
|
|
|
formats = evas_textblock_cursor_range_formats_get(cur1, cur2);
|
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
|
|
|
if (!formats) return EINA_FALSE;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(formats, l , format)
|
|
|
|
{
|
|
|
|
attr = _textblock_node_format_to_atspi_text_attr(format);
|
|
|
|
if (!attr) continue;
|
|
|
|
if (!strcmp(attr->name, attr_name))
|
|
|
|
{
|
|
|
|
*value = attr->value ? strdup(attr->value) : NULL;
|
|
|
|
elm_atspi_text_text_attribute_free(attr);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
elm_atspi_text_text_attribute_free(attr);
|
|
|
|
}
|
|
|
|
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_List*
|
|
|
|
_elm_entry_elm_interface_atspi_text_attributes_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int *start_offset, int *end_offset)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur1, *cur2;
|
|
|
|
Eina_List *formats, *ret = NULL, *l;
|
|
|
|
Evas_Object_Textblock_Node_Format *format;
|
|
|
|
Elm_Atspi_Text_Attribute *attr;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return NULL;
|
|
|
|
|
|
|
|
cur1 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur1) return NULL;
|
|
|
|
|
|
|
|
cur2 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur2)
|
|
|
|
{
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur1, *start_offset);
|
|
|
|
evas_textblock_cursor_pos_set(cur2, *end_offset);
|
|
|
|
|
|
|
|
formats = evas_textblock_cursor_range_formats_get(cur1, cur2);
|
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
2014-08-22 01:20:57 -07:00
|
|
|
if (!formats) return NULL;
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH(formats, l , format)
|
|
|
|
{
|
|
|
|
attr = _textblock_node_format_to_atspi_text_attr(format);
|
|
|
|
if (!attr) continue;
|
|
|
|
ret = eina_list_append(ret, attr);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_List*
|
|
|
|
_elm_entry_elm_interface_atspi_text_default_attributes_get(Eo *obj EINA_UNUSED, Elm_Entry_Data *_pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Eina_List *ret = NULL;
|
|
|
|
const Evas_Object_Textblock_Node_Format *format;
|
|
|
|
Elm_Atspi_Text_Attribute *attr;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return NULL;
|
|
|
|
|
|
|
|
format = evas_textblock_node_format_first_get(txtblk);
|
2014-08-22 01:20:57 -07:00
|
|
|
if (!format) return NULL;
|
2014-06-10 00:18:17 -07:00
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
attr = _textblock_node_format_to_atspi_text_attr(format);
|
|
|
|
if (!attr) continue;
|
|
|
|
ret = eina_list_append(ret, attr);
|
|
|
|
}
|
|
|
|
while ((format = evas_textblock_node_format_next_get(format)) != NULL);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_content_set(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, const char *content)
|
|
|
|
{
|
|
|
|
elm_entry_entry_set(obj, content);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_insert(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, const char *string, int position)
|
|
|
|
{
|
|
|
|
elm_entry_cursor_pos_set(obj, position);
|
|
|
|
elm_entry_entry_insert(obj, string);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_copy(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int start, int end)
|
|
|
|
{
|
|
|
|
elm_entry_select_region_set(obj, start, end);
|
|
|
|
elm_entry_selection_copy(obj);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_delete(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int start_offset, int end_offset)
|
|
|
|
{
|
|
|
|
Evas_Object *txtblk;
|
|
|
|
Evas_Textblock_Cursor *cur1, *cur2;
|
|
|
|
|
|
|
|
txtblk = elm_entry_textblock_get(obj);
|
|
|
|
if (!txtblk) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur1 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur1) return EINA_FALSE;
|
|
|
|
|
|
|
|
cur2 = evas_object_textblock_cursor_new(txtblk);
|
|
|
|
if (!cur2)
|
|
|
|
{
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_textblock_cursor_pos_set(cur1, start_offset);
|
|
|
|
evas_textblock_cursor_pos_set(cur2, end_offset);
|
|
|
|
|
|
|
|
evas_textblock_cursor_range_delete(cur1, cur2);
|
|
|
|
|
|
|
|
evas_textblock_cursor_free(cur1);
|
|
|
|
evas_textblock_cursor_free(cur2);
|
|
|
|
|
|
|
|
elm_entry_calc_force(obj);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_paste(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int position)
|
|
|
|
{
|
|
|
|
elm_entry_cursor_pos_set(obj, position);
|
|
|
|
elm_entry_selection_paste(obj);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EOLIAN static Eina_Bool
|
|
|
|
_elm_entry_elm_interface_atspi_editable_text_cut(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED, int start, int end)
|
|
|
|
{
|
|
|
|
elm_entry_select_region_set(obj, start, end);
|
|
|
|
elm_entry_selection_cut(obj);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2014-10-24 04:12:51 -07:00
|
|
|
EOLIAN static Elm_Atspi_State_Set
|
|
|
|
_elm_entry_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Elm_Atspi_State_Set ret;
|
|
|
|
eo_do_super(obj, ELM_ENTRY_CLASS, ret = elm_interface_atspi_accessible_state_set_get());
|
|
|
|
|
|
|
|
if (elm_entry_editable_get(obj))
|
|
|
|
STATE_TYPE_SET(ret, ELM_ATSPI_STATE_EDITABLE);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-06-03 08:36:42 -07:00
|
|
|
EOLIAN static char*
|
2015-12-17 00:36:02 -08:00
|
|
|
_elm_entry_elm_interface_atspi_accessible_name_get(Eo *obj, Elm_Entry_Data *sd)
|
2015-06-03 08:36:42 -07:00
|
|
|
{
|
2015-12-17 00:36:02 -08:00
|
|
|
char *name;
|
|
|
|
eo_do_super(obj, ELM_ENTRY_CLASS, name = elm_interface_atspi_accessible_name_get());
|
|
|
|
if (name && strncmp("", name, 1)) return name;
|
2015-06-03 08:36:42 -07:00
|
|
|
const char *ret = edje_object_part_text_get(sd->entry_edje, "elm.guide");
|
|
|
|
return ret ? strdup(ret) : NULL;
|
|
|
|
}
|
|
|
|
|
2014-03-22 10:44:29 -07:00
|
|
|
#include "elm_entry.eo.c"
|