3 * Copyright 2012 Samsung Electronics Co., Ltd
5 * Licensed under the Flora License, Version 1.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include <Ecore_X.h> /* ecore_x_window_size_get */
20 #include <utilX.h> /* KEY_END */
22 #include "calc-main.h"
23 #include "calc-view.h"
26 extern char calculator_input_str[];
27 extern int calculator_cursor_pos;
29 extern int cur_fontsize;
30 extern int default_fontsize;
33 extern int small_fontsize;
34 extern int scientific_result_len;
36 extern void calc_xxx(struct appdata *ap); /* will be removed */
37 extern void _calc_entry_text_set_rotate(struct appdata *ad);
38 extern void calc_por_pannel_load(struct appdata *ad);
39 extern void calc_lans_pannel_load(struct appdata *ad);
40 Evas_Object *load_edj(Evas_Object * parent, const char *file, const char *group)
45 eo = elm_layout_add(parent);
47 r = elm_layout_file_set(eo, file, group);
52 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND,
61 * @When rotate to landscape view (Scientific calculation)
62 * @param[in] ad The appdata
63 * @param[in] angle The rotate angle 90 or 270
67 static void __to_landscape(struct appdata *ad, int angle)
73 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
74 calc_lans_pannel_load(ad);
75 edje_object_signal_emit(_EDJ(ad->edje), "landscape", "");
76 elm_win_rotation_with_resize_set(ad->win, angle);
77 //elm_win_rotation_with_resize_set(ad->eo, angle);/*when rotating, resize the window eo*/
78 default_fontsize = 98;
83 scientific_result_len = 13;
84 _calc_entry_text_set_rotate(ad);
85 if (!ad->panel_show) {
86 calc_view_show_histroy(ad->hist_area);
87 edje_object_signal_emit(_EDJ(ad->edje), "show,hist", "");
94 * @When rotate to protrait view (Basic calculation)
95 * @param[in] ad The appdata
96 * @param[in] angle The rotate angle 0 or 180
100 static void __to_portrait(struct appdata *ad, int angle)
106 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
107 calc_por_pannel_load(ad);
108 edje_object_signal_emit(_EDJ(ad->edje), "portrait", "");
109 elm_win_rotation_with_resize_set(ad->win, angle);
110 //elm_win_rotation_with_resize_set(ad->eo, angle);/*when rotating, resize the window eo*/
111 default_fontsize = 70;
116 scientific_result_len = 8;
117 _calc_entry_text_set_rotate(ad);
118 if (!ad->panel_show) {
119 calc_view_show_histroy(ad->hist_area);
120 edje_object_signal_emit(_EDJ(ad->edje), "show,hist", "");
134 static void _rotate(app_device_orientation_e mode, void *data)
140 struct appdata *ad = (struct appdata *)data;
143 case APP_DEVICE_ORIENTATION_0: //[1]0
144 __to_portrait(ad, 0);
147 case APP_DEVICE_ORIENTATION_180: //[2]180
148 __to_portrait(ad, 180);
151 case APP_DEVICE_ORIENTATION_270: //[3]-90
152 __to_landscape(ad, 270);
155 case APP_DEVICE_ORIENTATION_90: //[4]90
156 __to_landscape(ad, 90);
162 if (!ad->panel_show) {
163 calc_view_revise_history_scroller(ad);
165 calc_view_revise_input_scroller(ad);
168 /* When rotate, the size of input scroller will be changed. So it should adjust to cursor position. */
169 calc_view_revise_input_scroller(ad);
183 static void _win_del(void *data, Evas_Object * obj, void *event_info)
196 static int _set_input_entry_focus(void *data)
199 struct appdata *ad = (struct appdata *)data;
200 elm_object_focus_set(ad->input_entry, EINA_TRUE); //set focus
201 _calc_entry_clear(ad->input_entry);
203 return ECORE_CALLBACK_CANCEL; //0
214 static int _load_idle_view(void *data)
217 struct appdata *ad = (struct appdata *)data;
218 calc_view_load_in_idle(ad);
220 return ECORE_CALLBACK_CANCEL; //0
228 * @return Evas_Object*
231 static Evas_Object *_create_win(const char *name)
236 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
238 elm_win_title_set(eo, name);
239 evas_object_smart_callback_add(eo, "delete,request", _win_del,
241 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w,
243 evas_object_resize(eo, w, h);
257 static void _on_exit(struct appdata *ad)
260 if (ad->por_pannel) {
261 evas_object_del(ad->por_pannel);
262 ad->por_pannel = NULL;
265 if (ad->lan_pannel) {
266 evas_object_del(ad->lan_pannel);
267 ad->lan_pannel = NULL;
270 if (ad->input_entry) {
271 evas_object_del(ad->input_entry);
272 ad->input_entry = NULL;
274 if (ad->clear_item) {
275 elm_object_item_del(ad->clear_item);
276 ad->clear_item = NULL;
278 if (ad->more_btn_popup) {
279 evas_object_del(ad->more_btn_popup);
280 ad->more_btn_popup = NULL;
283 evas_object_del(ad->more_btn);
287 elm_object_item_del(ad->navi_it);
292 evas_object_del(ad->nf);
295 if (ad->window_icon) {
296 evas_object_del(ad->window_icon);
297 ad->window_icon = NULL;
301 evas_object_del(ad->hist_area);
302 ad->hist_area = NULL;
305 if (ad->hist_scroll) {
306 evas_object_del(ad->hist_scroll);
307 ad->hist_scroll = NULL;
312 evas_object_del(ad->edje);
317 evas_object_del(ad->layout);
322 evas_object_del(ad->bg);
327 evas_object_del(ad->win);
332 if (ad->calc_timer) {
333 ecore_timer_del(ad->calc_timer);
334 ad->calc_timer = NULL;
336 if (ad->wrong_timer) {
337 ecore_timer_del(ad->wrong_timer);
338 ad->wrong_timer = NULL;
341 feedback_deinitialize();
354 static bool app_create(void *data)
357 struct appdata *ad = (struct appdata *)data;
359 /* Use elm_theme_extension_add() API before creating any widgets */
360 elm_theme_extension_add(NULL, CALCULATOR_THEME);
363 ad->win = _create_win(PACKAGE);
364 if (ad->win == NULL) {
367 evas_object_smart_callback_add(ad->win, "profile,changed", win_profile_changed_cb, ad);
368 evas_object_show(ad->win);
370 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
372 /* will be removed */
377 ad->panel_show = EINA_TRUE;
380 int ret = vconf_get_bool(VCONFKEY_SETAPPL_ROTATE_LOCK_BOOL, &value);
383 _rotate(APP_DEVICE_ORIENTATION_0, ad);
385 app_device_orientation_e curr = app_get_device_orientation();
389 app_device_orientation_e curr = app_get_device_orientation();
392 /* register callback */
393 ecore_idler_add((Ecore_Task_Cb) _set_input_entry_focus, ad);
394 ecore_idler_add((Ecore_Task_Cb) _load_idle_view, ad);
396 return TRUE; //EXIT_SUCCESS
408 static void app_terminate(void *data)
410 // Release all resources
411 struct appdata *ad = (struct appdata *)data;
423 static void app_pause(void *data)
425 // Take necessary actions when application becomes invisible
436 static void app_resume(void *data)
438 // Take necessary actions when application becomes visible.
439 struct appdata *ad = (struct appdata *)data;
440 elm_object_focus_set(ad->input_entry, EINA_TRUE);
445 * The entry of the program
452 int main(int argc, char *argv[])
457 app_event_callback_s event_callback;
459 event_callback.create = app_create;
460 event_callback.terminate = app_terminate;
461 event_callback.pause = app_pause;
462 event_callback.resume = app_resume;
463 event_callback.service = NULL;
464 event_callback.low_memory = NULL;
465 event_callback.low_battery = NULL;
466 event_callback.device_orientation = _rotate;
467 event_callback.language_changed = NULL;
468 event_callback.region_format_changed = NULL;
470 memset(&ad, 0x0, sizeof(struct appdata));
472 return app_efl_main(&argc, &argv, &event_callback, &ad);