File Manager / src / view /
popup.c
- /*
- * Copyright 2014 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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 "view/popup.h"
- #include "view/list-view.h"
- #include "utils/logger.h"
- #include "utils/app-types.h"
- #include "utils/config.h"
- #include "utils/common-utils.h"
- #include "main-app.h"
- #include <efl_extension.h>
- static const char *const POPUP_BTN_OK = "Ok";
- static const char *const POPUP_BTN_RETRY = "Retry";
- static const char *const POPUP_BTN_CANCEL = "Cancel";
- static const char *const POPUP_TEXT_DELETE = "Selected nodes will be deleted. Are you sure?";
- static const char *const POPUP_TEXT_COPY_MOVE = "Data saved in clipboard";
- static const char *const POPUP_TEXT_FILE_EXISTS = "Folder already exists";
- static const char *const POPUP_TEXT_CREATE_FOLDER_FAIL = "Fail to create folder";
- static const char *const POPUP_TEXT_INCORRECT_NAME = "Empty folder name";
- static const char *const POPUP_TEXT_NEW_FOLDER = "New Folder";
- static const char *const POPUP_TEXT_TITLE_NEW_FOLDER = "Add new folder";
- static const char *const POPUP_TEXT_EMPTY_EDIT_FIELD = "Enter the folder name";
- static const char *const POPUP_TEXT_MOVE_ERROR = "Moving error";
- static const char *const POPUP_TEXT_MOVE_RECURSIVE_ERROR = "Cannot move catalog into itself";
- static const char *const POPUP_TEXT_COPY_ERROR = "Operation copy failed";
- static const char *const POPUP_TEXT_COPY_RECURSIVE_ERROR = "Cannot copy catalog into itself";
- static const char *const POPUP_TEXT_ERROR = "Operation failed";
- static int _popup_delete_type_create(view_data *view);
- static int _popup_copy_move_type_create(view_data *view);
- static int _popup_new_folder_type_create(view_data *view, const char *folder_name);
- static int _popup_incorrect_name_type_create(view_data *view);
- static int _popup_copy_move_error_type_create(view_data *view, const char *error_text);
- static int _popup_error_type_create(view_data *view);
- static int _popup_create_folder_error_type_create(view_data *view, const char *folder_name, const char *error_text);
- static Evas_Object *_popup_new(Evas_Object *parent, const char *text, const void *data);
- static int _popup_button_add(Evas_Object *parent, const char *part, const char *btn_text, Evas_Smart_Cb btn_cb, void *cb_data);
- static int _popup_editfield_add(Evas_Object *popup, const char *folder_name);
- static void _popup_cancel_cb(void *data, Evas_Object *obj, void *event_info);
- static void _popup_delete_ok_cb(void *data, Evas_Object *obj, void *event_info);
- static void _popup_create_folder_ok_cb(void *data, Evas_Object *obj, void *event_info);
- static void _popup_create_folder_error_ok_cb(void *data, Evas_Object *obj, void *event_info);
- static void _popup_incorrect_name_ok_cb(void *data, Evas_Object *obj, void *event_info);
- static void _popup_back_button_cb(void *data, Evas_Object *obj, void *event_info);
- int popup_create(view_data *view, popup_type type)
- {
- RETVM_IF(!view, RESULT_TYPE_INVALID_ARG, "View obj is NULL");
- int res = RESULT_TYPE_OK;
- switch (type) {
- case POPUP_TYPE_DELETE:
- res = _popup_delete_type_create(view);
- break;
- case POPUP_TYPE_COPY_MOVE:
- res = _popup_copy_move_type_create(view);
- break;
- case POPUP_TYPE_NEW_FOLDER:
- res = _popup_new_folder_type_create(view, POPUP_TEXT_NEW_FOLDER);
- break;
- case POPUP_TYPE_WRONG_FILE_NAME:
- res = _popup_incorrect_name_type_create(view);
- break;
- case POPUP_TYPE_FAIL_TO_MOVE:
- res = _popup_copy_move_error_type_create(view, POPUP_TEXT_MOVE_ERROR);
- break;
- case POPUP_TYPE_MOVE_RECURSIVE_FAIL:
- res = _popup_copy_move_error_type_create(view, POPUP_TEXT_MOVE_RECURSIVE_ERROR);
- break;
- case POPUP_TYPE_FAIL_TO_COPY:
- res = _popup_copy_move_error_type_create(view, POPUP_TEXT_COPY_ERROR);
- break;
- case POPUP_TYPE_COPY_RECURSIVE_FAIL:
- res = _popup_copy_move_error_type_create(view, POPUP_TEXT_COPY_RECURSIVE_ERROR);
- break;
- case POPUP_TYPE_ERROR:
- res = _popup_error_type_create(view);
- break;
- default:
- ERR("Incorrect popup type");
- res = RESULT_TYPE_FAIL;
- break;
- }
- return res;
- }
- static int _popup_delete_type_create(view_data *view)
- {
- Evas_Object *popup = _popup_new(view->navi, POPUP_TEXT_DELETE, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_delete_ok_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- res = _popup_button_add(popup, "button2", POPUP_BTN_CANCEL, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static int _popup_copy_move_type_create(view_data *view)
- {
- Evas_Object *popup = _popup_new(view->navi, POPUP_TEXT_COPY_MOVE, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static int _popup_new_folder_type_create(view_data *view, const char *folder_name)
- {
- RETVM_IF(!folder_name, RESULT_TYPE_INVALID_ARG, "Folder name is NULL");
- Evas_Object *popup = _popup_new(view->navi, NULL, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- elm_object_part_text_set(popup, "title,text", POPUP_TEXT_TITLE_NEW_FOLDER);
- int res = _popup_editfield_add(popup, folder_name);
- RETVM_IF(res != RESULT_TYPE_OK, res, "Fail to add editfield");
- res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_create_folder_ok_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- res = _popup_button_add(popup, "button2", POPUP_BTN_CANCEL, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static int _popup_copy_move_error_type_create(view_data *view, const char *error_text)
- {
- Evas_Object *popup = _popup_new(view->navi, error_text, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static int _popup_create_folder_error_type_create(view_data *view, const char *folder_name, const char *error_text)
- {
- Evas_Object *popup = _popup_new(view->navi, error_text, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_RETRY, _popup_create_folder_error_ok_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- res = _popup_button_add(popup, "button2", POPUP_BTN_CANCEL, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- evas_object_data_set(popup, "folder_name", folder_name);
- return res;
- }
- static int _popup_error_type_create(view_data *view)
- {
- Evas_Object *popup = _popup_new(view->navi, POPUP_TEXT_ERROR, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_cancel_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static int _popup_incorrect_name_type_create(view_data *view)
- {
- Evas_Object *popup = _popup_new(view->navi, POPUP_TEXT_INCORRECT_NAME, view);
- RETVM_IF(!popup, RESULT_TYPE_INVALID_ARG, "Fail to create popup");
- int res = _popup_button_add(popup, "button1", POPUP_BTN_OK, _popup_incorrect_name_ok_cb, popup);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create button");
- evas_object_del(popup);
- return RESULT_TYPE_FAIL;
- }
- return RESULT_TYPE_OK;
- }
- static void _popup_back_button_cb(void *data, Evas_Object *obj, void *event_info)
- {
- evas_object_del(obj);
- }
- static Evas_Object *_popup_new(Evas_Object *parent, const char *text, const void *data)
- {
- Evas_Object *popup = elm_popup_add(parent);
- RETVM_IF(!popup, NULL, "Fail to create popup");
- elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
- eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_button_cb, NULL);
- elm_object_style_set(popup, "default");
- elm_object_text_set(popup, text);
- evas_object_data_set(popup, "view", data);
- evas_object_show(popup);
- return popup;
- }
- static int _popup_editfield_add(Evas_Object *popup, const char *folder_name)
- {
- Evas_Object *editfield = elm_layout_add(popup);
- RETVM_IF(!editfield, RESULT_TYPE_FAIL, "Fail to create editfield");
- elm_layout_theme_set(editfield, "layout", "editfield", "singleline");
- evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, 0.0);
- evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, 0.0);
- Evas_Object *entry = elm_entry_add(editfield);
- if (!entry) {
- ERR("Fail to create entry");
- evas_object_del(editfield);
- return RESULT_TYPE_FAIL;
- }
- evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_entry_scrollable_set(entry, EINA_TRUE);
- elm_entry_single_line_set(entry, EINA_TRUE);
- elm_object_part_text_set(entry, "elm.guide", POPUP_TEXT_EMPTY_EDIT_FIELD);
- elm_object_part_text_set(entry, "elm.text", folder_name);
- elm_entry_cursor_end_set(entry);
- elm_object_focus_set(entry, EINA_TRUE);
- elm_object_part_content_set(editfield, "elm.swallow.content", entry);
- elm_object_content_set(popup, editfield);
- return RESULT_TYPE_OK;
- }
- static int _popup_button_add(Evas_Object *parent, const char *part, const char *btn_text, Evas_Smart_Cb btn_cb, void *cb_data)
- {
- Evas_Object *btn = elm_button_add(parent);
- RETVM_IF(!btn, RESULT_TYPE_INVALID_ARG, "Fail to create button");
- evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_object_text_set(btn, btn_text);
- evas_object_smart_callback_add(btn, "clicked", btn_cb, cb_data);
- elm_object_part_content_set(parent, part, btn);
- return RESULT_TYPE_OK;
- }
- static void _popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
- {
- RETM_IF(!data, "Data is NULL");
- char *folder_name = evas_object_data_get(data, "folder_name");
- free(folder_name);
- evas_object_del(data);
- }
- static void _popup_delete_ok_cb(void *data, Evas_Object *obj, void *event_info)
- {
- RETM_IF(!data, "Data is NULL");
- view_data *view = evas_object_data_get(data, "view");
- evas_object_del(data);
- view->app->status.curr_mode = MODE_DEFAULT;
- int res = list_view_delete_items(view);
- RETM_IF(res != RESULT_TYPE_OK, "Fail to delete file");
- }
- static void _popup_create_folder_ok_cb(void *data, Evas_Object *obj, void *event_info)
- {
- RETM_IF(!data, "Data is NULL");
- Evas_Object *popup = data;
- view_data *view = evas_object_data_get(popup, "view");
- Evas_Object *editfield = elm_object_content_get(popup);
- Evas_Object *entry = elm_object_part_content_get(editfield, "elm.swallow.content");
- const char *folder_name = elm_entry_entry_get(entry);
- int res = RESULT_TYPE_OK;
- if (!folder_name || common_util_is_string_empty(folder_name)) {
- evas_object_del(data);
- res = _popup_incorrect_name_type_create(view);
- RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
- return;
- }
- res = list_view_create_folder(view, folder_name);
- if (res != RESULT_TYPE_OK) {
- char *temp_name = strdup(folder_name);
- if (!temp_name) {
- ERR("Fail to allocate memory for current folder name");
- evas_object_del(data);
- return;
- }
- evas_object_del(data);
- const char *error_text = NULL;
- error_text = (res == RESULT_TYPE_DUPLICATED_NAME) ? POPUP_TEXT_FILE_EXISTS
- : POPUP_TEXT_CREATE_FOLDER_FAIL;
- res = _popup_create_folder_error_type_create(view, temp_name, error_text);
- if (res != RESULT_TYPE_OK) {
- ERR("Fail to create popup");
- free(temp_name);
- }
- return;
- }
- res = list_view_update(view->navi_item, UPDATE_TYPE_VIEW | UPDATE_TYPE_CTRL_BAR_MODE);
- evas_object_del(data);
- RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
- }
- static void _popup_create_folder_error_ok_cb(void *data, Evas_Object *obj, void *event_info)
- {
- RETM_IF(!data, "Data is NULL");
- char *folder_name = evas_object_data_get(data, "folder_name");
- view_data *view = evas_object_data_get(data, "view");
- evas_object_del(data);
- int res = _popup_new_folder_type_create(view, folder_name);
- free(folder_name);
- RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
- }
- static void _popup_incorrect_name_ok_cb(void *data, Evas_Object *obj, void *event_info)
- {
- RETM_IF(!data, "Data is NULL");
- view_data *view = evas_object_data_get(data, "view");
- evas_object_del(data);
- int res = _popup_new_folder_type_create(view, POPUP_TEXT_NEW_FOLDER);
- RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
- }