summaryrefslogtreecommitdiff
path: root/main/src/control/ivug-popup.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/control/ivug-popup.c')
-rwxr-xr-xmain/src/control/ivug-popup.c643
1 files changed, 643 insertions, 0 deletions
diff --git a/main/src/control/ivug-popup.c b/main/src/control/ivug-popup.c
new file mode 100755
index 0000000..78c9d5e
--- /dev/null
+++ b/main/src/control/ivug-popup.c
@@ -0,0 +1,643 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ivug-popup.h"
+#include "ivug-vibration.h"
+
+#define NOTIFY_TIMEOUT 3.0
+
+#define IVUG_POPUP_EDJ_NAME EDJ_PATH"/ivug-popup.edj"
+
+typedef struct _Ivug_Popup
+{
+ Evas_Object *parent;
+ Evas_Object *popup;
+ Evas_Object *layout;
+
+ Evas_Object *obj;
+
+ int selected_index;
+
+ Popup_Response response;
+
+ int haptic_handle;
+
+ Evas_Smart_Cb callback;
+ void *data;
+
+}Ivug_Popup;
+
+typedef struct
+{
+ int index;
+ char *name;
+ Evas_Object *radio_main;
+ Ivug_Popup *p_iv_popup;
+} ivug_radio_popup_item;
+
+static Ivug_Popup * ivug_popup_create()
+{
+ Ivug_Popup *iv_popup = calloc(1, sizeof(Ivug_Popup));
+
+ iv_popup->haptic_handle = INVALID_HAPTIC_HANDLE;
+
+ return iv_popup;
+}
+
+static void ivug_popup_delete(Ivug_Popup *iv_popup)
+{
+ if ( iv_popup->haptic_handle != INVALID_HAPTIC_HANDLE )
+ {
+ ivug_vibration_stop(iv_popup->haptic_handle);
+ ivug_vibration_delete(iv_popup->haptic_handle);
+
+ iv_popup->haptic_handle = INVALID_HAPTIC_HANDLE;
+ }
+
+ if(iv_popup->popup)
+ {
+ evas_object_del(iv_popup->popup);
+ iv_popup->popup = NULL;
+ }
+
+ if(iv_popup->layout)
+ {
+ evas_object_del(iv_popup->layout);
+ iv_popup->layout = NULL;
+ }
+
+ free(iv_popup);
+}
+
+static void _on_popup_response(void *data, Evas_Object *obj, void *event_info )
+{
+ IV_ASSERT(data != NULL);
+
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+ Popup_Response response = (Popup_Response)evas_object_data_get(obj, "response");
+ MSG_IMAGEVIEW_HIGH("response callback=%d", response);
+
+ if(iv_popup->callback)
+ {
+ iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response);
+ }
+
+ ivug_popup_delete(iv_popup);
+}
+
+
+static void _on_ctxpopup_dismissed( void *data, Evas_Object *obj, void *event_info )
+{
+// Triggered when clicked outside ctxpopup
+ MSG_IMAGEVIEW_HIGH("Dismissed response");
+
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+
+ ivug_popup_delete(iv_popup);
+}
+
+Evas_Object*
+ivug_deletepopup_show(Evas_Object* parent, const char* title,
+ const char* contents, Evas_Smart_Cb response, void* user_data)
+{
+ Evas_Object *popup;
+ Evas_Object *btn_delete;
+ Evas_Object *btn_cancel;
+ //create popup
+
+ IV_ASSERT(response != NULL);
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ popup = elm_popup_add(parent);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, contents);
+ elm_object_part_text_set(popup, "title,text", title);
+
+ btn_delete = elm_button_add(popup);
+ elm_object_style_set(btn_delete, "popup_button/default");
+ elm_object_text_set(btn_delete, IDS_DELETE);
+ elm_object_part_content_set(popup, "button1", btn_delete);
+ evas_object_data_set(btn_delete, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_delete, "clicked", _on_popup_response, iv_popup);
+
+ btn_cancel = elm_button_add(popup);
+ elm_object_style_set(btn_cancel, "popup_button/default");
+ elm_object_text_set(btn_cancel, IDS_CANCEL);
+ elm_object_part_content_set(popup, "button2", btn_cancel);
+ evas_object_data_set(btn_cancel, "response", (void *)POPUP_RESPONSE_CANCEL);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _on_popup_response, iv_popup);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = user_data;
+
+ evas_object_show(popup);
+
+ return popup;
+}
+
+
+Evas_Object*
+ivug_2btn_popup_show(Evas_Object* parent, const char* title,
+ const char* contents, Evas_Smart_Cb response, void* user_data)
+{
+ IV_ASSERT(response != NULL);
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ Evas_Object *popup;
+ Evas_Object *btn_yes;
+ Evas_Object *btn_no;
+ //create popup
+
+ popup = elm_popup_add(parent);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, contents);
+ if(title)
+ {
+ elm_object_part_text_set(popup, "title,text", title);
+ }
+
+ btn_yes = elm_button_add(popup);
+ elm_object_style_set(btn_yes, "popup_button/default");
+ elm_object_text_set(btn_yes, IDS_YES);
+ elm_object_part_content_set(popup, "button1", btn_yes);
+ evas_object_data_set(btn_yes, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_yes, "clicked", _on_popup_response, iv_popup);
+
+ btn_no = elm_button_add(popup);
+ elm_object_style_set(btn_no, "popup_button/default");
+ elm_object_text_set(btn_no, IDS_NO);
+ elm_object_part_content_set(popup, "button2", btn_no);
+ evas_object_data_set(btn_no, "response", (void *)POPUP_RESPONSE_CANCEL);
+ evas_object_smart_callback_add(btn_no, "clicked", _on_popup_response, iv_popup);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = user_data;
+
+ evas_object_show(popup);
+ evas_object_layer_set(popup, EVAS_LAYER_MAX);
+
+ return popup;
+}
+
+Evas_Object*
+ivug_1btn_popup_show(Evas_Object* parent, const char* title,
+ const char* contents, Evas_Smart_Cb response, void* user_data)
+{
+ IV_ASSERT(response != NULL);
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ Evas_Object *popup;
+ Evas_Object *btn_yes;
+ //create popup
+
+ popup = elm_popup_add(parent);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, contents);
+ if(title)
+ {
+ elm_object_part_text_set(popup, "title,text", title);
+ }
+
+ btn_yes = elm_button_add(popup);
+ elm_object_style_set(btn_yes, "popup_button/default");
+ elm_object_text_set(btn_yes, IDS_OK);
+ elm_object_part_content_set(popup, "button1", btn_yes);
+ evas_object_data_set(btn_yes, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_yes, "clicked", _on_popup_response, iv_popup);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = user_data;
+
+ evas_object_show(popup);
+ evas_object_layer_set(popup, EVAS_LAYER_MAX);
+
+ return popup;
+}
+
+static void _on_longpress_popup_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ IV_ASSERT(data != NULL);
+
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+
+ const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info);
+ if(label == NULL)
+ {
+ MSG_MAIN_ERROR("label is NULL");
+ ivug_popup_delete(iv_popup);
+ return;
+ }
+ MSG_MAIN_HIGH("text(%s) is clicked", label);
+
+ Longpress_Popup_Response response = LPPOPUP_RESPONSE_NONE;
+ if(strncmp(label, IDS_COPY, strlen(label)) == 0)
+ {
+ response = LPPOPUP_RESPONSE_COPY;
+ }
+ else
+ {
+ MSG_MAIN_WARN("Unknown Share type : %s", label);
+ }
+ MSG_MAIN_HIGH("response=%d", response);
+
+ if(iv_popup->callback)
+ {
+ iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response);
+ }
+
+ ivug_popup_delete(iv_popup);
+}
+
+Evas_Object*
+ivug_longpress_popup_show(Evas_Object *parent, int x, int y, Evas_Smart_Cb response, void *data)
+{
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ Evas_Object* ctx_popup = NULL;
+
+ ctx_popup = elm_ctxpopup_add(parent);
+
+ elm_ctxpopup_item_append(ctx_popup, IDS_COPY, NULL, _on_longpress_popup_selected, iv_popup);
+
+ evas_object_smart_callback_add(ctx_popup, "dismissed", _on_ctxpopup_dismissed, iv_popup);
+
+ evas_object_move(ctx_popup, x, y);
+
+ iv_popup->popup = ctx_popup;
+ iv_popup->callback = response;
+ iv_popup->data = data;
+
+ evas_object_show(ctx_popup);
+
+ return ctx_popup;
+}
+
+void
+_ivug_rename_enter_click_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+ IV_ASSERT(iv_popup != NULL);
+
+ Evas_Object *entry = iv_popup->obj;
+
+ char *name = elm_entry_markup_to_utf8 ( elm_entry_entry_get(entry) );
+
+ MSG_IMAGEVIEW_HIGH("name = %s", name);
+
+ if(name)
+ {
+ char *new_name = NULL;
+ new_name = ivug_strip_string(name);
+ if(new_name == NULL)
+ {
+ MSG_IMAGEVIEW_ERROR( "rename failed");
+ free(name);
+ ecore_imf_context_input_panel_hide(elm_entry_imf_context_get(entry));
+ return;
+ }
+ elm_object_text_set(entry, new_name);
+ if(iv_popup->callback)
+ {
+ iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)POPUP_RESPONSE_OK);
+ }
+ ivug_popup_delete(iv_popup);
+ }
+ else
+ {
+ //ecore_imf_context_input_panel_hide(elm_entry_imf_context_get(entry));
+ }
+}
+
+void
+_ivug_rename_entry_changed(void *data, Evas_Object *obj, void *event_info)
+{
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+ IV_ASSERT(iv_popup != NULL);
+
+ Evas_Object *entry = iv_popup->obj;
+ Evas_Object *btn_ok = elm_object_part_content_get(iv_popup->popup, "button1");
+
+ char *content = elm_entry_markup_to_utf8 ( elm_entry_entry_get(entry) );
+
+ if (strlen(content) == 0)
+ {
+ MSG_IMAGEVIEW_HIGH("ISF1 : %s", content);
+ elm_object_disabled_set(btn_ok, EINA_TRUE);
+ }
+ else
+ {
+ MSG_IMAGEVIEW_HIGH("ISF : %s", content);
+ elm_object_disabled_set(btn_ok, EINA_FALSE);
+ }
+ free(content);
+}
+
+void
+_ivug_rename_maxlength_reached(void *data, Evas_Object *obj, void *event_info)
+{
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+ IV_ASSERT(iv_popup != NULL);
+
+ if ( iv_popup->haptic_handle == INVALID_HAPTIC_HANDLE )
+ {
+ iv_popup->haptic_handle = ivug_vibration_create();
+ }
+ else
+ {
+ ivug_vibration_stop(iv_popup->haptic_handle);
+ }
+
+ ivug_vibration_play(iv_popup->haptic_handle ,VIBRATION_DURATION);
+
+}
+
+Evas_Object *ivug_rename_popup_show(Evas_Object *parent, const char *filename, Evas_Smart_Cb response, void *data)
+{
+ Evas_Object *popup = NULL;
+ Evas_Object *entry = NULL;
+ Evas_Object *layout = NULL;
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ popup = elm_popup_add(parent);
+ if(!popup)
+ {
+ MSG_IMAGEVIEW_ERROR("popup is NULL");
+ goto ENTRY_POPUP_FREE;
+ }
+ //evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ //elm_object_style_set(popup, "menustyle");
+ elm_object_part_text_set(popup, "title,text", "Rename");
+
+ layout = elm_layout_add(popup);
+ if(!layout)
+ {
+ MSG_IMAGEVIEW_ERROR("layout is NULL");
+ goto ENTRY_POPUP_FREE;
+ }
+ if(elm_layout_file_set(layout, IVUG_POPUP_EDJ_NAME, "popup_entryview") == EINA_FALSE)
+ {
+ MSG_IMAGEVIEW_ERROR("elm_layout_file_set error");;
+ goto ENTRY_POPUP_FREE;
+ }
+ //evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ entry = elm_entry_add(popup);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_object_text_set(entry, filename);
+ elm_entry_cursor_end_set(entry);
+ elm_object_part_content_set(layout, "elm.swallow.content", entry);
+ elm_object_content_set(popup, layout);
+
+ evas_object_smart_callback_add(entry, "activated", _ivug_rename_enter_click_cb, iv_popup);
+ evas_object_smart_callback_add(entry, "changed", _ivug_rename_entry_changed, iv_popup);
+
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+ limit_filter_data.max_char_count = 64;
+ limit_filter_data.max_byte_count = 0;
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
+ evas_object_smart_callback_add(entry, "maxlength,reached", _ivug_rename_maxlength_reached, (void *)iv_popup);
+
+ evas_object_show(layout);
+
+ Evas_Object *btn_ok = elm_button_add(popup);
+ elm_object_style_set(btn_ok, "popup_button/default");
+ elm_object_text_set(btn_ok, IDS_OK);
+ elm_object_part_content_set(popup, "button1", btn_ok);
+ evas_object_data_set(btn_ok, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_ok, "clicked", _ivug_rename_enter_click_cb, iv_popup);
+
+ Evas_Object *btn_cancel = elm_button_add(popup);
+ elm_object_style_set(btn_cancel, "popup_button/default");
+ elm_object_text_set(btn_cancel, IDS_CANCEL);
+ elm_object_part_content_set(popup, "button2", btn_cancel);
+ evas_object_data_set(btn_cancel, "response", (void *)POPUP_RESPONSE_CANCEL);
+ evas_object_smart_callback_add(btn_cancel, "clicked", _on_popup_response, iv_popup);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = data;
+ iv_popup->obj = entry;
+
+ evas_object_show(popup);
+
+ return popup;
+
+ENTRY_POPUP_FREE:
+ if(popup)
+ {
+ evas_object_del(popup);
+ }
+ if(layout)
+ {
+ evas_object_del(layout);
+ }
+ if(entry)
+ {
+ evas_object_del(entry);
+ }
+ return NULL;
+}
+
+static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ IV_ASSERT(data != NULL);
+
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+ Popup_Response response = (Popup_Response)evas_object_data_get(obj, "response");
+ MSG_IMAGEVIEW_HIGH("response callback=%d", response);
+
+ if(iv_popup->callback)
+ {
+ iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response);
+ }
+
+ ivug_popup_delete(iv_popup);
+}
+
+static char *
+_gl_text_get(void *data, Evas_Object *obj, const char *part)
+{
+ ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data;
+ //int index = popup_item->index;
+
+ if (strcmp(part, "elm.text") == 0)
+ {
+ return strdup(popup_item->name);
+ }
+ return NULL;
+}
+
+static Evas_Object *
+_gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data;
+
+ Evas_Object *radio;
+ Evas_Object *radio_main = popup_item->radio_main;
+ int index = popup_item->index;
+ int selected_index = popup_item->p_iv_popup->selected_index;
+
+ if (strcmp(part, "elm.icon") == 0 || strcmp(part, "elm.swallow.icon") == 0)
+ {
+ radio = elm_radio_add(obj);
+ elm_radio_state_value_set(radio, index);
+ elm_radio_group_add(radio, radio_main);
+ if (index == selected_index)
+ elm_radio_value_set(radio, selected_index);
+ evas_object_size_hint_weight_set(radio, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(radio, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ return radio;
+ }
+
+ return NULL;
+}
+
+static void
+_gl_del(void *data, Evas_Object *obj)
+{
+ ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data;
+
+ if(popup_item->name)
+ {
+ free(popup_item->name);
+ popup_item->name = NULL;
+ }
+
+ free(popup_item);
+
+ return;
+}
+
+static void
+_gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ IV_ASSERT(data != NULL);
+
+ Ivug_Popup *iv_popup = (Ivug_Popup *)data;
+
+ Elm_Object_Item *item = (Elm_Object_Item *) event_info;
+ ivug_radio_popup_item *popup_item = NULL;
+
+ MSG_IMAGEVIEW_HIGH("_gl_sel");
+
+ if (item)
+ {
+ popup_item = (ivug_radio_popup_item *)elm_object_item_data_get(item);
+ iv_popup->selected_index = popup_item->index;
+ elm_genlist_item_update(item);
+
+ if(iv_popup->callback)
+ {
+ iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)iv_popup->selected_index);
+ }
+
+ ivug_popup_delete(iv_popup);
+ }
+}
+
+Evas_Object *ivug_radio_popoup_show(Evas_Object *parent, char *title,
+ int selected_index, Eina_List *name_list, Evas_Smart_Cb response, void *data)
+{
+#define GET_POPUP_HEIGHT(icnt) (((113*icnt-1) > 408) ? (408) : (113*icnt-1))
+#define GET_POPUP_WIDTH(icnt) (614)
+
+ Evas_Object *popup;
+ int index = 0;
+ Elm_Object_Item *item;
+ Evas_Object *genlist;
+ Evas_Object *btn_close;
+ Evas_Object *radio_main;
+
+ static Elm_Genlist_Item_Class itc = {0,};
+
+ ivug_radio_popup_item *popup_item;
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ popup = elm_popup_add(parent);
+ elm_object_style_set(popup, "min_menustyle");
+ elm_object_part_text_set(popup, "title,text", title);
+ evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, iv_popup);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ btn_close = elm_button_add(popup);
+ elm_object_style_set(btn_close, "popup_button/default");
+ elm_object_text_set(btn_close, IDS_CLOSE);
+ elm_object_part_content_set(popup, "button1", btn_close);
+ evas_object_data_set(btn_close, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_close, "clicked", _on_popup_response, iv_popup);
+
+ itc.item_style = "1text.1icon.2";
+ itc.func.text_get = _gl_text_get;
+ itc.func.content_get = _gl_content_get;
+ itc.func.state_get = NULL;
+ itc.func.del = _gl_del;
+
+ genlist = elm_genlist_add(popup);
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_propagate_events_set(genlist, EINA_FALSE);
+
+ radio_main = elm_radio_add(genlist);
+ elm_radio_state_value_set(radio_main, -1);
+ elm_radio_value_set(radio_main, -1);
+ evas_object_propagate_events_set(radio_main, EINA_FALSE);
+
+ Eina_List *l = NULL;
+ char *name = NULL;
+
+ EINA_LIST_FOREACH(name_list, l, name)
+ {
+ popup_item = calloc(1, sizeof(ivug_radio_popup_item));
+ popup_item->index = index++;
+ popup_item->name = strdup(name);
+ popup_item->radio_main = radio_main;
+ popup_item->p_iv_popup = iv_popup;
+
+ item = elm_genlist_item_append(genlist, &itc, (void *)popup_item, NULL,
+ ELM_GENLIST_ITEM_NONE, _gl_sel, iv_popup);
+ }
+
+ Evas_Object *box;
+ box = elm_box_add(popup);
+ evas_object_size_hint_min_set(box, GET_POPUP_WIDTH(index-1) * elm_config_scale_get(), GET_POPUP_HEIGHT(index-1) * elm_config_scale_get());
+ evas_object_show(genlist);
+ elm_box_pack_end(box, genlist);
+ elm_object_content_set(popup, box);
+ //elm_object_content_set(popup, genlist);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = data;
+ iv_popup->obj = radio_main;
+ iv_popup->selected_index = selected_index;
+
+ evas_object_show(popup);
+
+ return popup;
+}
+
+