From 3402716a8ff56b333a17800dc24e2fb0730fd974 Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Sat, 16 Feb 2013 00:53:19 +0900 Subject: [PATCH] Tizen 2.0 Release --- CMakeLists.txt | 32 + LICENSE.APLv2.0 | 202 ++ LICENSE.Flora | 206 ++ NOTICE | 9 + data/reader.js | 937 +++++ inc/IntAddBookmarkForm.h | 130 + inc/IntAddressbar.h | 190 ++ inc/IntBookmarkData.h | 220 ++ inc/IntBookmarkListForm.h | 147 + inc/IntBookmarkPresentationModel.h | 297 ++ inc/IntBrightnessForm.h | 101 + inc/IntCommonLib.h | 106 + inc/IntConfirmationPopup.h | 58 + inc/IntCreateBookmarkFolderForm.h | 97 + inc/IntDefaultCustomItem.h | 79 + inc/IntDropDownCustomItem.h | 111 + inc/IntEditBookmarkListForm.h | 116 + inc/IntEditHistoryListForm.h | 149 + inc/IntEditHomePageForm.h | 114 + inc/IntFaviconManager.h | 137 + inc/IntFontManager.h | 115 + inc/IntFormFactory.h | 77 + inc/IntHistoryData.h | 232 ++ inc/IntHistoryListForm.h | 215 ++ inc/IntHistoryPresentationModel.h | 248 ++ inc/IntIAddressbarEventListener.h | 56 + inc/IntISettingChangeListener.h | 46 + inc/IntInternetApp.h | 84 + inc/IntMainForm.h | 296 ++ inc/IntMainFrame.h | 45 + inc/IntMultipleWindowForm.h | 160 + inc/IntMultipleWindowPresentationModel.h | 226 ++ inc/IntNotificationPanel.h | 81 + inc/IntPresentationModelBase.h | 164 + inc/IntRadioCustomItem.h | 114 + inc/IntReaderFontSizeForm.h | 89 + inc/IntSceneRegister.h | 95 + inc/IntSettingClearPrivateDataForm.h | 212 ++ inc/IntSettingForm.h | 196 ++ inc/IntSettingPresentationModel.h | 466 +++ inc/IntSettingToggleCustomItem.h | 103 + inc/IntSharePopup.h | 169 + inc/IntSharePopup.h.bak | 158 + inc/IntTypes.h | 66 + manifest.xml | 157 + packaging/apps.Internet.spec | 61 + res/.workflow | Bin 0 -> 260 bytes res/ara-AE.xml | 134 + res/aze-AZ.xml | 134 + res/bul-BG.xml | 134 + res/cat-ES.xml | 134 + res/ces-CZ.xml | 134 + res/dan-DK.xml | 134 + res/deu-DE.xml | 134 + res/ell-GR.xml | 134 + res/eng-GB.xml | 135 + res/eng-PH.xml | 134 + res/eng-US.xml | 134 + res/est-EE.xml | 134 + res/eus-ES.xml | 134 + res/fin-FI.xml | 134 + res/fra-CA.xml | 134 + res/fra-FR.xml | 134 + res/gle-IE.xml | 134 + res/glg-ES.xml | 134 + res/hin-IN.xml | 134 + res/hrv-HR.xml | 134 + res/hun-HU.xml | 134 + res/hye-AM.xml | 134 + res/isl-IS.xml | 134 + res/ita-IT.xml | 134 + res/jpn-JP.xml | 134 + res/kat-GE.xml | 134 + res/kaz-KZ.xml | 134 + res/kor-KR.xml | 134 + res/lav-LV.xml | 134 + res/lit-LT.xml | 134 + res/mkd-MK.xml | 134 + res/nld-NL.xml | 134 + res/nob-NO.xml | 134 + res/pol-PL.xml | 134 + res/por-BR.xml | 134 + res/por-PT.xml | 134 + res/ron-RO.xml | 134 + res/rus-RU.xml | 134 + res/screen-density-xhigh/00_button_off.png | Bin 0 -> 4295 bytes res/screen-density-xhigh/00_button_on.png | Bin 0 -> 4608 bytes res/screen-density-xhigh/00_button_radio.png | Bin 0 -> 4817 bytes .../00_button_radio_selected.png | Bin 0 -> 3835 bytes .../00_button_sweep_delete.9.png | Bin 0 -> 980 bytes .../00_button_sweep_delete_press.9.png | Bin 0 -> 762 bytes .../00_circle_button_Expand_closed.png | Bin 0 -> 7318 bytes .../00_circle_button_Expand_open.png | Bin 0 -> 7148 bytes .../00_list_expand_closed_press.png | Bin 0 -> 3098 bytes .../00_list_expand_opened_press.png | Bin 0 -> 3032 bytes res/screen-density-xhigh/1.png | Bin 0 -> 690 bytes res/screen-density-xhigh/2.png | Bin 0 -> 1020 bytes res/screen-density-xhigh/3.png | Bin 0 -> 1075 bytes res/screen-density-xhigh/4.png | Bin 0 -> 955 bytes res/screen-density-xhigh/5.png | Bin 0 -> 1017 bytes res/screen-density-xhigh/6.png | Bin 0 -> 1061 bytes res/screen-density-xhigh/7.png | Bin 0 -> 940 bytes res/screen-density-xhigh/8.png | Bin 0 -> 1067 bytes res/screen-density-xhigh/9.png | Bin 0 -> 1053 bytes res/screen-density-xhigh/EditBackground.png | Bin 0 -> 181 bytes .../I01_Nocontents_Bookmarks.png | Bin 0 -> 8539 bytes .../I01_PlugIn_icon_Article_reader_temp.png | Bin 0 -> 3754 bytes .../I01_controlbar_icon_Play_disabled.png | Bin 0 -> 497 bytes .../I01_controlbar_icon_Play_temp.png | Bin 0 -> 504 bytes .../I01_controlbar_icon_Play_temp_press.png | Bin 0 -> 505 bytes .../I01_controlbar_icon_backward_disabled.png | Bin 0 -> 491 bytes .../I01_controlbar_icon_backward_temp.png | Bin 0 -> 499 bytes .../I01_controlbar_icon_backward_temp_press.png | Bin 0 -> 499 bytes .../I01_controlbar_icon_bookmark.png | Bin 0 -> 3427 bytes .../I01_controlbar_icon_compose.png | Bin 0 -> 790 bytes .../I01_controlbar_icon_compose_diabled.png | Bin 0 -> 712 bytes .../I01_controlbar_icon_create.png | Bin 0 -> 481 bytes .../I01_controlbar_icon_create_disable.png | Bin 0 -> 476 bytes .../I01_controlbar_icon_create_folder.png | Bin 0 -> 633 bytes .../I01_controlbar_icon_create_folder_diabled.png | Bin 0 -> 560 bytes .../I01_controlbar_icon_delete.png | Bin 0 -> 593 bytes .../I01_controlbar_icon_delete_disable.png | Bin 0 -> 518 bytes .../I01_controlbar_icon_more.png | Bin 0 -> 3097 bytes .../I01_controlbar_icon_multiview.png | Bin 0 -> 857 bytes res/screen-density-xhigh/I01_field_btn_Clear.png | Bin 0 -> 3495 bytes .../I01_field_btn_Clear_temp.png | Bin 0 -> 3370 bytes res/screen-density-xhigh/I01_fit_screen.png | Bin 0 -> 3740 bytes res/screen-density-xhigh/I01_icon_Back.png | Bin 0 -> 2798 bytes res/screen-density-xhigh/I01_icon_Back_press.png | Bin 0 -> 3047 bytes res/screen-density-xhigh/I01_icon_bookmark_bg.png | Bin 0 -> 6329 bytes .../I01_icon_bookmark_off_temp.png | Bin 0 -> 3944 bytes .../I01_icon_bookmark_on_temp.png | Bin 0 -> 4165 bytes .../I01_icon_default_favicon.png | Bin 0 -> 3408 bytes res/screen-density-xhigh/I01_icon_find word.png | Bin 0 -> 3561 bytes res/screen-density-xhigh/I01_icon_folder_open.png | Bin 0 -> 3500 bytes res/screen-density-xhigh/I01_icon_more.png | Bin 0 -> 1497 bytes res/screen-density-xhigh/I01_icon_more_press.png | Bin 0 -> 1570 bytes .../I01_icon_page_navigation.png | Bin 0 -> 3575 bytes .../I01_icon_page_navigation_01.png | Bin 0 -> 4608 bytes .../I01_icon_page_navigation_02.png | Bin 0 -> 4901 bytes .../I01_icon_page_navigation_03.png | Bin 0 -> 4928 bytes .../I01_icon_page_navigation_04.png | Bin 0 -> 4790 bytes .../I01_icon_page_navigation_05.png | Bin 0 -> 4917 bytes .../I01_icon_page_navigation_06.png | Bin 0 -> 4975 bytes .../I01_icon_page_navigation_07.png | Bin 0 -> 4781 bytes .../I01_icon_page_navigation_08.png | Bin 0 -> 4986 bytes .../I01_icon_page_navigation_09.png | Bin 0 -> 4966 bytes .../I01_icon_page_navigation_10.png | Bin 0 -> 4917 bytes .../I01_icon_page_navigation_bar.png | Bin 0 -> 3564 bytes res/screen-density-xhigh/I01_icon_plus.png | Bin 0 -> 3611 bytes res/screen-density-xhigh/I01_icon_plus_press.png | Bin 0 -> 3695 bytes res/screen-density-xhigh/I01_icon_private.png | Bin 0 -> 3081 bytes res/screen-density-xhigh/I01_icon_upper folder.png | Bin 0 -> 3197 bytes res/screen-density-xhigh/I01_popup_bg.9.png | Bin 0 -> 1005 bytes res/screen-density-xhigh/I01_popup_bottom_bg.9.png | Bin 0 -> 108 bytes res/screen-density-xhigh/I01_right_arrow.png | Bin 0 -> 5057 bytes res/screen-density-xhigh/I01_search_icon.png | Bin 0 -> 3392 bytes .../I01_search_icon_refresh.png | Bin 0 -> 3546 bytes .../I01_search_icon_refresh_temp.png | Bin 0 -> 3546 bytes .../I01_search_input_field_bg.9.png | Bin 0 -> 305 bytes .../I01_search_list_icon_favorite.png | Bin 0 -> 4850 bytes .../I01_search_list_icon_favorite_press.png | Bin 0 -> 4170 bytes .../I01_tab_icon_bookmarks.png | Bin 0 -> 621 bytes res/screen-density-xhigh/I01_tab_icon_history.png | Bin 0 -> 804 bytes res/screen-density-xhigh/I01_title_btn.9.png | Bin 0 -> 348 bytes .../I01_title_btn_icon_down.png | Bin 0 -> 3197 bytes .../I01_title_btn_icon_down_disabled.png | Bin 0 -> 3304 bytes res/screen-density-xhigh/I01_title_btn_icon_up.png | Bin 0 -> 3184 bytes .../I01_title_btn_icon_up_disabled.png | Bin 0 -> 3298 bytes res/screen-density-xhigh/I01_title_btn_press.9.png | Bin 0 -> 316 bytes .../I01_title_progress_bar.png | Bin 0 -> 238 bytes .../I01_title_progress_bar_bg.png | Bin 0 -> 183 bytes res/screen-density-xhigh/I01_toolbar_bg_01.png | Bin 0 -> 2852 bytes res/screen-density-xhigh/I01_toolbar_bg_02.png | Bin 0 -> 2821 bytes res/screen-density-xhigh/I01_toolbar_bg_h.png | Bin 0 -> 2801 bytes .../I01_toolbar_icon_windows_manager_01.png | Bin 0 -> 3977 bytes .../I01_toolbar_icon_windows_manager_01_press.png | Bin 0 -> 4005 bytes .../I01_toolbar_icon_windows_manager_02.png | Bin 0 -> 4542 bytes .../I01_toolbar_icon_windows_manager_02_press.png | Bin 0 -> 4734 bytes .../I01_toolbar_icon_windows_manager_03.png | Bin 0 -> 4807 bytes .../I01_toolbar_icon_windows_manager_03_press.png | Bin 0 -> 4983 bytes .../I01_toolbar_icon_windows_manager_04.png | Bin 0 -> 4261 bytes .../I01_toolbar_icon_windows_manager_04_press.png | Bin 0 -> 4409 bytes .../I01_toolbar_icon_windows_manager_05.png | Bin 0 -> 4665 bytes .../I01_toolbar_icon_windows_manager_05_press.png | Bin 0 -> 4824 bytes .../I01_toolbar_icon_windows_manager_06.png | Bin 0 -> 4785 bytes .../I01_toolbar_icon_windows_manager_06_press.png | Bin 0 -> 4953 bytes .../I01_toolbar_icon_windows_manager_07.png | Bin 0 -> 4203 bytes .../I01_toolbar_icon_windows_manager_07_press.png | Bin 0 -> 4346 bytes .../I01_toolbar_icon_windows_manager_08.png | Bin 0 -> 4863 bytes .../I01_toolbar_icon_windows_manager_08_press.png | Bin 0 -> 5042 bytes .../I01_toolbar_icon_windows_manager_09.png | Bin 0 -> 4788 bytes .../I01_toolbar_icon_windows_manager_09_press.png | Bin 0 -> 4946 bytes .../I01_toolbar_icon_windows_manager_empty.png | Bin 0 -> 3667 bytes .../I01_toolbar_input_field.9.png | Bin 0 -> 1918 bytes res/screen-density-xhigh/ListIcon.png | Bin 0 -> 3268 bytes res/screen-density-xhigh/ListLeftSide.png | Bin 0 -> 843 bytes res/screen-density-xhigh/Thumbs.db | Bin 0 -> 224366 bytes res/screen-density-xhigh/deleteIcon.png | Bin 0 -> 6454 bytes res/screen-density-xhigh/edit_item.png | Bin 0 -> 18574 bytes res/screen-density-xhigh/opennewwindow.png | Bin 0 -> 3831 bytes res/screen-density-xhigh/private_on.png | Bin 0 -> 684 bytes res/screen-size-normal/IDL_ADDRESSBAR.xml | 87 + res/screen-size-normal/IDL_ADD_BOOKMARK.xml | 77 + res/screen-size-normal/IDL_ARTICLE_READER.xml | 27 + res/screen-size-normal/IDL_BLANK_PANEL.xml | 12 + res/screen-size-normal/IDL_BOOKMARK_LIST.xml | 35 + res/screen-size-normal/IDL_BRIGHTNESS.xml | 34 + res/screen-size-normal/IDL_CONFIRMATION_POPUP.xml | 32 + .../IDL_CREATE_BOOKMARK_FOLDER.xml | 36 + res/screen-size-normal/IDL_EDIT_BOOKMARK_LIST.xml | 43 + res/screen-size-normal/IDL_EDIT_HISTORY_LIST.xml | 39 + res/screen-size-normal/IDL_EDIT_HOME_PAGE.xml | 35 + res/screen-size-normal/IDL_FIND_ON_PAGE.xml | 57 + res/screen-size-normal/IDL_FONT_SIZE.xml | 26 + res/screen-size-normal/IDL_FORM.xml | 59 + res/screen-size-normal/IDL_HISTORY_LIST.xml | 33 + res/screen-size-normal/IDL_MULTIPLE_WINDOW.xml | 26 + res/screen-size-normal/IDL_NOTIFICATION_PANEL.xml | 17 + res/screen-size-normal/IDL_READER.xml | 33 + res/screen-size-normal/IDL_SETTINGS.xml | 21 + .../IDL_SETTINGS_CLEAR_PRIVATE_DATA.xml | 26 + res/screen-size-normal/IDL_SETTING_FORM.xml | 26 + res/screen-size-normal/IDL_SHARE_POPUP.xml | 22 + res/slk-SK.xml | 134 + res/slv-SI.xml | 134 + res/spa-ES.xml | 134 + res/spa-MX.xml | 134 + res/srp-RS.xml | 134 + res/swe-SE.xml | 134 + res/tur-TR.xml | 134 + res/ukr-UA.xml | 134 + res/uzb-UZ.xml | 134 + res/zho-CN.xml | 134 + res/zho-HK.xml | 134 + res/zho-SG.xml | 134 + res/zho-TW.xml | 135 + shared/data/nofile.dummy | 0 shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 20874 bytes shared/trusted/nofile.dummy | 0 src/IntAddBookmarkForm.cpp | 1126 ++++++ src/IntAddressbar.cpp | 853 +++++ src/IntBookmarkData.cpp | 177 + src/IntBookmarkListForm.cpp | 1095 ++++++ src/IntBookmarkPresentationModel.cpp | 1031 ++++++ src/IntBrightnessForm.cpp | 290 ++ src/IntCommonLib.cpp | 197 ++ src/IntConfirmationPopup.cpp | 109 + src/IntCreateBookmarkFolderForm.cpp | 478 +++ src/IntDefaultCustomItem.cpp | 87 + src/IntDropDownCustomItem.cpp | 199 ++ src/IntEditBookmarkListForm.cpp | 836 +++++ src/IntEditHistoryListForm.cpp | 1159 +++++++ src/IntEditHomePageForm.cpp | 282 ++ src/IntFaviconManager.cpp | 332 ++ src/IntFontManager.cpp | 170 + src/IntFormFactory.cpp | 208 ++ src/IntHistory.cpp | 210 ++ src/IntHistoryListForm.cpp | 1836 ++++++++++ src/IntHistoryPresentationModel.cpp | 1023 ++++++ src/IntInternetApp.cpp | 312 ++ src/IntInternetEntry.cpp | 72 + src/IntMainForm.cpp | 3572 ++++++++++++++++++++ src/IntMainFrame.cpp | 57 + src/IntMultipleWindowForm.cpp | 611 ++++ src/IntMultipleWindowPresentationModel.cpp | 261 ++ src/IntNotificationPanel.cpp | 114 + src/IntPresentationModelBase.cpp | 595 ++++ src/IntRadioCustomItem.cpp | 120 + src/IntReaderFontSizeForm.cpp | 163 + src/IntSceneRegister.cpp | 127 + src/IntSettingClearPrivateDataForm.cpp | 338 ++ src/IntSettingForm.cpp | 996 ++++++ src/IntSettingPresentationModel.cpp | 681 ++++ src/IntSettingToggleCustomItem.cpp | 85 + src/IntSharePopup.cpp | 412 +++ 276 files changed, 35222 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE.APLv2.0 create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100644 data/reader.js create mode 100644 inc/IntAddBookmarkForm.h create mode 100644 inc/IntAddressbar.h create mode 100644 inc/IntBookmarkData.h create mode 100644 inc/IntBookmarkListForm.h create mode 100644 inc/IntBookmarkPresentationModel.h create mode 100644 inc/IntBrightnessForm.h create mode 100644 inc/IntCommonLib.h create mode 100644 inc/IntConfirmationPopup.h create mode 100644 inc/IntCreateBookmarkFolderForm.h create mode 100644 inc/IntDefaultCustomItem.h create mode 100644 inc/IntDropDownCustomItem.h create mode 100644 inc/IntEditBookmarkListForm.h create mode 100644 inc/IntEditHistoryListForm.h create mode 100644 inc/IntEditHomePageForm.h create mode 100644 inc/IntFaviconManager.h create mode 100644 inc/IntFontManager.h create mode 100644 inc/IntFormFactory.h create mode 100644 inc/IntHistoryData.h create mode 100644 inc/IntHistoryListForm.h create mode 100644 inc/IntHistoryPresentationModel.h create mode 100644 inc/IntIAddressbarEventListener.h create mode 100644 inc/IntISettingChangeListener.h create mode 100644 inc/IntInternetApp.h create mode 100644 inc/IntMainForm.h create mode 100644 inc/IntMainFrame.h create mode 100644 inc/IntMultipleWindowForm.h create mode 100644 inc/IntMultipleWindowPresentationModel.h create mode 100644 inc/IntNotificationPanel.h create mode 100644 inc/IntPresentationModelBase.h create mode 100644 inc/IntRadioCustomItem.h create mode 100644 inc/IntReaderFontSizeForm.h create mode 100644 inc/IntSceneRegister.h create mode 100644 inc/IntSettingClearPrivateDataForm.h create mode 100644 inc/IntSettingForm.h create mode 100644 inc/IntSettingPresentationModel.h create mode 100644 inc/IntSettingToggleCustomItem.h create mode 100644 inc/IntSharePopup.h create mode 100644 inc/IntSharePopup.h.bak create mode 100644 inc/IntTypes.h create mode 100644 manifest.xml create mode 100755 packaging/apps.Internet.spec create mode 100644 res/.workflow create mode 100644 res/ara-AE.xml create mode 100644 res/aze-AZ.xml create mode 100644 res/bul-BG.xml create mode 100644 res/cat-ES.xml create mode 100644 res/ces-CZ.xml create mode 100644 res/dan-DK.xml create mode 100644 res/deu-DE.xml create mode 100644 res/ell-GR.xml create mode 100644 res/eng-GB.xml create mode 100644 res/eng-PH.xml create mode 100644 res/eng-US.xml create mode 100644 res/est-EE.xml create mode 100644 res/eus-ES.xml create mode 100644 res/fin-FI.xml create mode 100644 res/fra-CA.xml create mode 100644 res/fra-FR.xml create mode 100644 res/gle-IE.xml create mode 100644 res/glg-ES.xml create mode 100644 res/hin-IN.xml create mode 100644 res/hrv-HR.xml create mode 100644 res/hun-HU.xml create mode 100644 res/hye-AM.xml create mode 100644 res/isl-IS.xml create mode 100644 res/ita-IT.xml create mode 100644 res/jpn-JP.xml create mode 100644 res/kat-GE.xml create mode 100644 res/kaz-KZ.xml create mode 100644 res/kor-KR.xml create mode 100644 res/lav-LV.xml create mode 100644 res/lit-LT.xml create mode 100644 res/mkd-MK.xml create mode 100644 res/nld-NL.xml create mode 100644 res/nob-NO.xml create mode 100644 res/pol-PL.xml create mode 100644 res/por-BR.xml create mode 100644 res/por-PT.xml create mode 100644 res/ron-RO.xml create mode 100644 res/rus-RU.xml create mode 100644 res/screen-density-xhigh/00_button_off.png create mode 100644 res/screen-density-xhigh/00_button_on.png create mode 100644 res/screen-density-xhigh/00_button_radio.png create mode 100644 res/screen-density-xhigh/00_button_radio_selected.png create mode 100644 res/screen-density-xhigh/00_button_sweep_delete.9.png create mode 100644 res/screen-density-xhigh/00_button_sweep_delete_press.9.png create mode 100644 res/screen-density-xhigh/00_circle_button_Expand_closed.png create mode 100644 res/screen-density-xhigh/00_circle_button_Expand_open.png create mode 100644 res/screen-density-xhigh/00_list_expand_closed_press.png create mode 100644 res/screen-density-xhigh/00_list_expand_opened_press.png create mode 100644 res/screen-density-xhigh/1.png create mode 100644 res/screen-density-xhigh/2.png create mode 100644 res/screen-density-xhigh/3.png create mode 100644 res/screen-density-xhigh/4.png create mode 100644 res/screen-density-xhigh/5.png create mode 100644 res/screen-density-xhigh/6.png create mode 100644 res/screen-density-xhigh/7.png create mode 100644 res/screen-density-xhigh/8.png create mode 100644 res/screen-density-xhigh/9.png create mode 100644 res/screen-density-xhigh/EditBackground.png create mode 100644 res/screen-density-xhigh/I01_Nocontents_Bookmarks.png create mode 100644 res/screen-density-xhigh/I01_PlugIn_icon_Article_reader_temp.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_Play_disabled.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_Play_temp.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_Play_temp_press.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_backward_disabled.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_backward_temp.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_backward_temp_press.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_bookmark.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_compose.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_compose_diabled.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_create.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_create_disable.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_create_folder.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_create_folder_diabled.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_delete.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_delete_disable.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_more.png create mode 100644 res/screen-density-xhigh/I01_controlbar_icon_multiview.png create mode 100644 res/screen-density-xhigh/I01_field_btn_Clear.png create mode 100644 res/screen-density-xhigh/I01_field_btn_Clear_temp.png create mode 100644 res/screen-density-xhigh/I01_fit_screen.png create mode 100644 res/screen-density-xhigh/I01_icon_Back.png create mode 100644 res/screen-density-xhigh/I01_icon_Back_press.png create mode 100644 res/screen-density-xhigh/I01_icon_bookmark_bg.png create mode 100644 res/screen-density-xhigh/I01_icon_bookmark_off_temp.png create mode 100644 res/screen-density-xhigh/I01_icon_bookmark_on_temp.png create mode 100644 res/screen-density-xhigh/I01_icon_default_favicon.png create mode 100644 res/screen-density-xhigh/I01_icon_find word.png create mode 100644 res/screen-density-xhigh/I01_icon_folder_open.png create mode 100644 res/screen-density-xhigh/I01_icon_more.png create mode 100644 res/screen-density-xhigh/I01_icon_more_press.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_01.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_02.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_03.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_04.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_05.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_06.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_07.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_08.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_09.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_10.png create mode 100644 res/screen-density-xhigh/I01_icon_page_navigation_bar.png create mode 100644 res/screen-density-xhigh/I01_icon_plus.png create mode 100644 res/screen-density-xhigh/I01_icon_plus_press.png create mode 100644 res/screen-density-xhigh/I01_icon_private.png create mode 100644 res/screen-density-xhigh/I01_icon_upper folder.png create mode 100644 res/screen-density-xhigh/I01_popup_bg.9.png create mode 100644 res/screen-density-xhigh/I01_popup_bottom_bg.9.png create mode 100644 res/screen-density-xhigh/I01_right_arrow.png create mode 100644 res/screen-density-xhigh/I01_search_icon.png create mode 100644 res/screen-density-xhigh/I01_search_icon_refresh.png create mode 100644 res/screen-density-xhigh/I01_search_icon_refresh_temp.png create mode 100644 res/screen-density-xhigh/I01_search_input_field_bg.9.png create mode 100644 res/screen-density-xhigh/I01_search_list_icon_favorite.png create mode 100644 res/screen-density-xhigh/I01_search_list_icon_favorite_press.png create mode 100644 res/screen-density-xhigh/I01_tab_icon_bookmarks.png create mode 100644 res/screen-density-xhigh/I01_tab_icon_history.png create mode 100644 res/screen-density-xhigh/I01_title_btn.9.png create mode 100644 res/screen-density-xhigh/I01_title_btn_icon_down.png create mode 100644 res/screen-density-xhigh/I01_title_btn_icon_down_disabled.png create mode 100644 res/screen-density-xhigh/I01_title_btn_icon_up.png create mode 100644 res/screen-density-xhigh/I01_title_btn_icon_up_disabled.png create mode 100644 res/screen-density-xhigh/I01_title_btn_press.9.png create mode 100644 res/screen-density-xhigh/I01_title_progress_bar.png create mode 100644 res/screen-density-xhigh/I01_title_progress_bar_bg.png create mode 100644 res/screen-density-xhigh/I01_toolbar_bg_01.png create mode 100644 res/screen-density-xhigh/I01_toolbar_bg_02.png create mode 100644 res/screen-density-xhigh/I01_toolbar_bg_h.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_01.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_01_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_02.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_02_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_03.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_03_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_04.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_04_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_05.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_05_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_06.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_06_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_08.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_08_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_09.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_09_press.png create mode 100644 res/screen-density-xhigh/I01_toolbar_icon_windows_manager_empty.png create mode 100644 res/screen-density-xhigh/I01_toolbar_input_field.9.png create mode 100644 res/screen-density-xhigh/ListIcon.png create mode 100644 res/screen-density-xhigh/ListLeftSide.png create mode 100644 res/screen-density-xhigh/Thumbs.db create mode 100644 res/screen-density-xhigh/deleteIcon.png create mode 100644 res/screen-density-xhigh/edit_item.png create mode 100644 res/screen-density-xhigh/opennewwindow.png create mode 100644 res/screen-density-xhigh/private_on.png create mode 100644 res/screen-size-normal/IDL_ADDRESSBAR.xml create mode 100644 res/screen-size-normal/IDL_ADD_BOOKMARK.xml create mode 100644 res/screen-size-normal/IDL_ARTICLE_READER.xml create mode 100644 res/screen-size-normal/IDL_BLANK_PANEL.xml create mode 100644 res/screen-size-normal/IDL_BOOKMARK_LIST.xml create mode 100644 res/screen-size-normal/IDL_BRIGHTNESS.xml create mode 100644 res/screen-size-normal/IDL_CONFIRMATION_POPUP.xml create mode 100644 res/screen-size-normal/IDL_CREATE_BOOKMARK_FOLDER.xml create mode 100644 res/screen-size-normal/IDL_EDIT_BOOKMARK_LIST.xml create mode 100644 res/screen-size-normal/IDL_EDIT_HISTORY_LIST.xml create mode 100644 res/screen-size-normal/IDL_EDIT_HOME_PAGE.xml create mode 100644 res/screen-size-normal/IDL_FIND_ON_PAGE.xml create mode 100644 res/screen-size-normal/IDL_FONT_SIZE.xml create mode 100644 res/screen-size-normal/IDL_FORM.xml create mode 100644 res/screen-size-normal/IDL_HISTORY_LIST.xml create mode 100644 res/screen-size-normal/IDL_MULTIPLE_WINDOW.xml create mode 100644 res/screen-size-normal/IDL_NOTIFICATION_PANEL.xml create mode 100644 res/screen-size-normal/IDL_READER.xml create mode 100644 res/screen-size-normal/IDL_SETTINGS.xml create mode 100644 res/screen-size-normal/IDL_SETTINGS_CLEAR_PRIVATE_DATA.xml create mode 100644 res/screen-size-normal/IDL_SETTING_FORM.xml create mode 100644 res/screen-size-normal/IDL_SHARE_POPUP.xml create mode 100644 res/slk-SK.xml create mode 100644 res/slv-SI.xml create mode 100644 res/spa-ES.xml create mode 100644 res/spa-MX.xml create mode 100644 res/srp-RS.xml create mode 100644 res/swe-SE.xml create mode 100644 res/tur-TR.xml create mode 100644 res/ukr-UA.xml create mode 100644 res/uzb-UZ.xml create mode 100644 res/zho-CN.xml create mode 100644 res/zho-HK.xml create mode 100644 res/zho-SG.xml create mode 100644 res/zho-TW.xml create mode 100644 shared/data/nofile.dummy create mode 100644 shared/res/screen-density-xhigh/mainmenu.png create mode 100644 shared/trusted/nofile.dummy create mode 100644 src/IntAddBookmarkForm.cpp create mode 100644 src/IntAddressbar.cpp create mode 100644 src/IntBookmarkData.cpp create mode 100644 src/IntBookmarkListForm.cpp create mode 100644 src/IntBookmarkPresentationModel.cpp create mode 100644 src/IntBrightnessForm.cpp create mode 100644 src/IntCommonLib.cpp create mode 100644 src/IntConfirmationPopup.cpp create mode 100644 src/IntCreateBookmarkFolderForm.cpp create mode 100644 src/IntDefaultCustomItem.cpp create mode 100644 src/IntDropDownCustomItem.cpp create mode 100644 src/IntEditBookmarkListForm.cpp create mode 100644 src/IntEditHistoryListForm.cpp create mode 100644 src/IntEditHomePageForm.cpp create mode 100644 src/IntFaviconManager.cpp create mode 100644 src/IntFontManager.cpp create mode 100644 src/IntFormFactory.cpp create mode 100644 src/IntHistory.cpp create mode 100644 src/IntHistoryListForm.cpp create mode 100644 src/IntHistoryPresentationModel.cpp create mode 100644 src/IntInternetApp.cpp create mode 100644 src/IntInternetEntry.cpp create mode 100644 src/IntMainForm.cpp create mode 100644 src/IntMainFrame.cpp create mode 100644 src/IntMultipleWindowForm.cpp create mode 100644 src/IntMultipleWindowPresentationModel.cpp create mode 100644 src/IntNotificationPanel.cpp create mode 100644 src/IntPresentationModelBase.cpp create mode 100644 src/IntRadioCustomItem.cpp create mode 100644 src/IntReaderFontSizeForm.cpp create mode 100644 src/IntSceneRegister.cpp create mode 100644 src/IntSettingClearPrivateDataForm.cpp create mode 100644 src/IntSettingForm.cpp create mode 100644 src/IntSettingPresentationModel.cpp create mode 100644 src/IntSettingToggleCustomItem.cpp create mode 100644 src/IntSharePopup.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9f75437 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +# Target name and AppID +## TODO : set application name and ID +SET(this_target Internet) +SET(APPID kmcele1k0n) + +# include directory +INCLUDE_DIRECTORIES( + /usr/include/osp + inc + ) + +# Source files +FILE(GLOB ${this_target}_SOURCE_FILES src/*.cpp) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE") + +# Create executable +SET(CMAKE_EXECUTABLE_SUFFIX ".exe") +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +# Set link libraries and link options +## TODO : add more link libraries and options +TARGET_LINK_LIBRARIES(${this_target} -L/usr/lib/osp osp-appfw osp-uifw osp-media osp-web osp-image osp-net pthread) +TARGET_LINK_LIBRARIES(${this_target} -Xlinker --allow-shlib-undefined -pthread -pie) + +# Copy info, data, res, and icons directories +INSTALL(TARGETS ${this_target} DESTINATION ../usr/apps/${APPID}/bin) + +# Copy resource +INSTALL(FILES ${CMAKE_SOURCE_DIR}/manifest.xml DESTINATION ../usr/apps/${APPID}/info) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ../usr/apps/${APPID}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/shared DESTINATION ../usr/apps/${APPID}) diff --git a/LICENSE.APLv2.0 b/LICENSE.APLv2.0 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.APLv2.0 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..9f3fe14 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.0, May, 2012 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Compatibility Definition Document +and passes the Compatibility Test Suite as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. + +You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text +from the Work, provided that such additional attribution notices +cannot be construed as modifying the License. You may add Your own +copyright statement to Your modifications and may provide additional or +different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works +as a whole, provided Your use, reproduction, and distribution of +the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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://floralicense.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. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..1151c22 --- /dev/null +++ b/NOTICE @@ -0,0 +1,9 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE.APLv2.0 file for Apache License, Version 2 terms and conditions. + +Several source codes may have its original copyright owner and/or +be licensed under other than Apache License, Version 2, say, Flora License, Version 1. +Please, see copyright and license comments section in the header of each file, +and the LICENSE.Flora file for Flora License, Version 1 terms and conditions. + diff --git a/data/reader.js b/data/reader.js new file mode 100644 index 0000000..6345f03 --- /dev/null +++ b/data/reader.js @@ -0,0 +1,937 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// 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. +// + + +try { +var test; +var sample= null; +totalPageNum = 1; +var readability = { +} +var page = null; + parsedPages= {}; + pageETags = {}; + +function findBaseUrl() { + var noUrlParams = window.location.pathname.split("?")[0], + urlSlashes = noUrlParams.split("/").reverse(), + cleanedSegments = [], + possibleType = ""; + + for (var i = 0, slashLen = urlSlashes.length; i < slashLen; i+=1) { + var segment = urlSlashes[i]; + + if (segment.indexOf(".") !== -1) { + possibleType = segment.split(".")[1]; + + if(!possibleType.match(/[^a-zA-Z]/)) { + segment = segment.split(".")[0]; + } + } + + if(segment.indexOf(',00') !== -1) { + segment = segment.replace(',00', ''); + } + + if (segment.match(/((_|-)?p[a-z]*|(_|-))[0-9]{1,2}$/i) && ((i === 1) || (i === 0))) { + segment = segment.replace(/((_|-)?p[a-z]*|(_|-))[0-9]{1,2}$/i, ""); + } + + + var del = false; + + if (i < 2 && segment.match(/^\d{1,2}$/)) { + del = true; + } + + if(i === 0 && segment.toLowerCase() === "index") { + del = true; + } + + if(i < 2 && segment.length < 3 && !urlSlashes[0].match(/[a-z]/i)) { + del = true; + } + + if (!del) { + cleanedSegments.push(segment); + } + } + + return window.location.protocol + "//" + window.location.host + cleanedSegments.reverse().join("/"); + } + + +function findNextPageLink(elem) { + var possiblePages = {}, + allLinks = elem.getElementsByTagName('a'), + articleBaseUrl = findBaseUrl(); + + for(var i = 0, il = allLinks.length; i < il; i+=1) { + var link = allLinks[i], + linkHref = allLinks[i].href.replace(/#.*$/, '').replace(/\/$/, ''); + + if(linkHref === "" || linkHref === articleBaseUrl || linkHref === window.location.href || linkHref in parsedPages) { + continue; + } + + if(window.location.host !== linkHref.split(/\/+/g)[1]) { + continue; + } + + var linkText = getInnerText(link); + + if(linkText.match(regexps.extraneous)) { + continue; + } + + var linkHrefLeftover = linkHref.replace(articleBaseUrl, ''); + if(!linkHrefLeftover.match(/\d/)) { + continue; + } + + if(!(linkHref in possiblePages)) { + possiblePages[linkHref] = {"score": 0, "linkText": linkText, "href": linkHref}; + } else { + possiblePages[linkHref].linkText += ' | ' + linkText; + } + + var linkObj = possiblePages[linkHref]; + + if(linkHref.indexOf(articleBaseUrl) !== 0) { + linkObj.score -= 25; + } + + var linkData = linkText + ' ' + link.className + ' ' + link.id + link.innerHTML; + if(linkData.match(regexps.nextLink)) { + linkObj.score += 50; + } + if(linkData.match(/pag(e|ing|inat)/i)) { + linkObj.score += 25; + } + if(linkData.match(/(first|last)/i)) { + if(!linkObj.linkText.match(regexps.nextLink)) { + linkObj.score -= 65; + } + } + if(linkData.match(regexps.negative) || linkData.match(regexps.extraneous)) { + linkObj.score -= 50; + } + if(linkData.match(regexps.prevLink)) { + linkObj.score -= 200; + } + + var parentNode = link.parentNode, + positiveNodeMatch = false, + negativeNodeMatch = false; + while(parentNode) { + var parentNodeClassAndId = parentNode.className + ' ' + parentNode.id; + if(!positiveNodeMatch && parentNodeClassAndId && parentNodeClassAndId.match(/pag(e|ing|inat)/i)) { + positiveNodeMatch = true; + linkObj.score += 15; + } + if(!negativeNodeMatch && parentNodeClassAndId && parentNodeClassAndId.match(regexps.negative)) { + if(!parentNodeClassAndId.match(regexps.positive)) { + linkObj.score -= 25; + negativeNodeMatch = true; + } + } + + parentNode = parentNode.parentNode; + } + + if (linkHref.match(/p(a|g|ag)?(e|ing|ination)?(=|\/)[0-9]{1,2}/i) || linkHref.match(/(page|paging)/i)) { + linkObj.score += 25; + } + + if (linkHref.match(regexps.extraneous)) { + linkObj.score -= 15; + } + + var linkTextAsNumber = parseInt(linkText, 10); + if(linkTextAsNumber) { + if (linkTextAsNumber === 1) { + linkObj.score -= 10; + } + else { + linkObj.score += Math.max(0, 10 - linkTextAsNumber); + } + } + } + + var topPage = null; + for(var page in possiblePages) { + if(possiblePages.hasOwnProperty(page)) { + if(possiblePages[page].score > 100 && (!topPage || topPage.score < possiblePages[page].score)) { + topPage = possiblePages[page]; + } + } + } + + if(topPage) { + var nextHref = topPage.href.replace(/\/$/,''); + + parsedPages[nextHref] = true; + return nextHref; + console.log("Reader :: reader.js :: INFO - Second Page link = "+nextHref); + } + else { + console.log("Reader :: reader.js :: INFO - Second Page link = null"); + return null; + } + } + + function xhr() { + if (typeof XMLHttpRequest !== 'undefined' && (window.location.protocol !== 'file:' || !window.ActiveXObject)) { + return new XMLHttpRequest(); + } + else { + try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(sixerr) { } + try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(threrr) { } + try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(err) { } + } + + return false; + } + + function successfulRequest(request) { + return (request.status >= 200 && request.status < 300) || request.status === 304 || (request.status === 0 && request.responseText); + } + + function ajax(url, options) { + var request = xhr(); + + function respondToReadyState(readyState) { + if (request.readyState === 4) { + if (successfulRequest(request)) { + if (options.success) { options.success(request); } + } + else { + if (options.error) { options.error(request); } + } + } + } + + if (typeof options === 'undefined') { options = {}; } + + request.onreadystatechange = respondToReadyState; + request.open('get', url, true); + request.setRequestHeader('Accept', 'text/html'); + + try { + request.send(options.postBody); + } + catch (e) { + if (options.error) { options.error(); } + } + + return request; + } + + curPageNum = 1; + maxPages = 30; + function appendNextPage(nextPageLink) { + + curPageNum+=1; + + var articlePage = document.createElement("DIV"); + articlePage.id = 'readability-page-' + curPageNum; + articlePage.className = 'SISO_page'; + articlePage.innerHTML = '

Page '+curPageNum+'

'; + + + if(curPageNum > maxPages) { + var nextPageMarkup = "
View Next Page
"; + + articlePage.innerHTML = articlePage.innerHTML + nextPageMarkup; + return; + } + (function(pageUrl, thisPage) { + ajax(pageUrl, { + success: function(r) { + + var eTag = r.getResponseHeader('ETag'); + if(eTag) { + if(eTag in pageETags) { + dbg("Exact duplicate page found via ETag. Aborting."); + articlePage.style.display = 'none'; + return; + } else { + pageETags[eTag] = 1; + } + } + + var page = document.createElement("DIV"); + + var responseHtml = r.responseText.replace(/\n/g,'\uffff').replace(/.*?<\/script>/gi, ''); + responseHtml = responseHtml.replace(/\n/g,'\uffff').replace(/.*?<\/script>/gi, ''); + responseHtml = responseHtml.replace(/\uffff/g,'\n').replace(/<(\/?)noscript/gi, '<$1div'); + responseHtml = responseHtml.replace(regexps.replaceBrs, '

'); + responseHtml = responseHtml.replace(regexps.replaceFonts, '<$1span>'); + + page.innerHTML = responseHtml; + + flags = 0x1 | 0x2 | 0x4; + + var nextPageLink = findNextPageLink(page), + content = grabArticle(page); + + if(!content) { + return; + } + + thisPage.innerHTML += content; + document.getElementById("reader_content_div").appendChild(thisPage); + + if(nextPageLink) { + appendNextPage(nextPageLink); + } + } + }); + }(nextPageLink, articlePage)); + } + + regexps = { + unlikelyCandidates: /combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter/i, + okMaybeItsACandidate: /and|article|body|column|main|shadow/i, + positive: /article|body|content|entry|hentry|main|page|pagination|post|text|blog|story|date/i, + negative: /combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|script|tool|widget|scbox|reply|div_dispalyslide|galleryad|disqus_thread|cnn_strylftcntnt|topRightNarrow|fs-stylelist-thumbnails|replText|ttalk_layer|disqus_post_message|disqus_post_title|cnn_strycntntrgt|wpadvert|sharedaddy sd-like-enabled sd-sharing-enabled|fs-slideshow-wrapper|fs-stylelist-launch|reply_box|contentHeader|jive-paginator lw-label/i, + extraneous: /print|archive|comment|discuss|e[\-]?mail|share|reply|all|login|sign|single/i, + divToPElements: /<(a|blockquote|dl|div|img|ol|p|pre|table|ul|article)/i, + replaceBrs: /(]*>[ \n\r\t]*){2,}/gi, + replaceFonts: /<(\/?)font[^>]*>/gi, + trim: /^\s+|\s+$/g, + normalize: /\s{2,}/g, + killBreaks: /((\s| ?)*){1,}/g, + videos: /http:\/\/(www\.)?(youtube|vimeo)\.com/i, + skipFootnoteLink: /^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i, + nextLink: /(next|right|weiter|continue|>([^\|]|$)|\u00BB([^\|]|$))/i, + prevLink: /(prev|earl|old|<|«)/i, + retainDiv: /whois_record/i + } + + function cleanHeaders(e) { + for (var headerIndex = 1; headerIndex < 3; headerIndex+=1) { + var headers = e.getElementsByTagName('h' + headerIndex); + for (var i=headers.length-1; i >=0; i-=1) { + if (getClassWeight(headers[i]) < 0 || getLinkDensity(headers[i]) > 0.33) { + headers[i].parentNode.removeChild(headers[i]); + } + } + } + } + + function clean(e, tag) { + var targetList = e.getElementsByTagName( tag ); + var isEmbed = (tag === 'object' || tag === 'embed'); + + for (var y=targetList.length-1; y >= 0; y-=1) { + if(isEmbed) { + var attributeValues = ""; + for (var i=0, il=targetList[y].attributes.length; i < il; i+=1) { + attributeValues += targetList[y].attributes[i].value + '|'; + } + + if (attributeValues.search(regexps.videos) !== -1) { + continue; + } + + if (targetList[y].innerHTML.search(regexps.videos) !== -1) { + continue; + } + } + + targetList[y].parentNode.removeChild(targetList[y]); + } + } + function cleanHTML5(e, tag) { + var targetList = e.getElementsByTagName( tag ); + for (var y=targetList.length-1; y >= 0; y-=1) { + targetList[y].parentNode.removeChild(targetList[y]); + } + } + function cleanSelect(e, tag) { + var targetList = e.getElementsByTagName( tag ); + for (var y=targetList.length-1; y >= 0; y-=1) { + targetList[y].style.display = 'none'; + } + } + function getCharCount(e,s) { + s = s || ","; + return getInnerText(e).split(s).length-1; + } + function getClassWeight(e) { + + var weight = 0; + + if (typeof(e.className) === 'string' && e.className !== '') + { + if(e.className.search(regexps.negative) !== -1) { + weight -= 25; } + + if(e.className.search(regexps.positive) !== -1) { + weight += 25; } + } + + if (typeof(e.id) === 'string' && e.id !== '') + { + if(e.id.search(regexps.negative) !== -1) { + weight -= 25; } + + if(e.id.search(regexps.positive) !== -1) { + weight += 25; } + } + + return weight; + } +function ChineseJapneseKorean(innerCharacter) { + if (!innerCharacter || innerCharacter.length == 0) return false; + var innerCharacterCode = innerCharacter.charCodeAt(0); + if (innerCharacterCode > 11904 && innerCharacterCode < 12031) return true; //CJK Radicals Supplement + if (innerCharacterCode > 12352 && innerCharacterCode < 12543) return true; //Hiragana + if (innerCharacterCode > 12736 && innerCharacterCode < 19903) return true; + if (innerCharacterCode > 19968 && innerCharacterCode < 40959) return true; //CJK Unified Ideographs + if (innerCharacterCode > 44032 && innerCharacterCode < 55215) return true; //Hangul Syllables + if (innerCharacterCode > 63744 && innerCharacterCode < 64255) return true; //CJK Compatibility Ideographs + if (innerCharacterCode > 65072 && innerCharacterCode < 65103) return true; //CJK Compatibility Forms + if (innerCharacterCode > 131072 && innerCharacterCode < 173791) return true; + if (innerCharacterCode > 194560 && innerCharacterCode < 195103) return true; + return false; +} + function cleanConditionally(e, tag) { + + + var tagsList = e.getElementsByTagName(tag); + var curTagsLength = tagsList.length; + + for (var i=curTagsLength-1; i >= 0; i-=1) { + var toRemove = false; + var weight = getClassWeight(tagsList[i]); + var contentScore = (typeof tagsList[i].readability !== 'undefined') ? tagsList[i].readability.contentScore : 0; + + if(weight+contentScore < 0) + { + if(tag === "div" || tag === "article") { + var readerDivClass5 = document.getElementsByClassName("view_cnt"); + var readerDivClass6 = document.getElementById("description"); + + if(readerDivClass5.length > 0) { + toRemove = false; + } + if(readerDivClass6!==null && readerDivClass6.innerHTML.length > 0) { + toRemove = false; + } + + } else { + tagsList[i].parentNode.removeChild(tagsList[i]); + } + } + else if ( getCharCount(tagsList[i],',') < 10) { + var p = tagsList[i].getElementsByTagName("p").length; + var img = tagsList[i].getElementsByTagName("img").length; + var li = tagsList[i].getElementsByTagName("li").length-100; + var input = tagsList[i].getElementsByTagName("input").length; + + var embedCount = 0; + var embeds = tagsList[i].getElementsByTagName("embed"); + for(var ei=0,il=embeds.length; ei < il; ei+=1) { + if (embeds[ei].src.search(regexps.videos) === -1) { + embedCount+=1; + } + } + + var linkDensity = getLinkDensity(tagsList[i]); + var contentLength = getInnerText(tagsList[i]).length; + var finalWord = null; + var checkCJK = null; + var checkCJKText = null; + var checkWordOfTag = function(){ + checkCJKText = getInnerText(tagsList[i]); + for(var h = 0;h < contentLength; h +=1){ + if(ChineseJapneseKorean(checkCJKText[h]) === true) { + finalWord = checkCJKText[h]; + checkCJK = true; + break; + } + } + return finalWord; + } + if ( img > p ) { + toRemove = true; + } else if(li > p && tag !== "ul" && tag !== "ol") { + toRemove = true; + } else if( input > Math.floor(p/3) ) { + toRemove = true; + } else if(contentLength < 25 && (img > 2 || img === 0) ) { + toRemove = true; + } else if(weight < 25 && linkDensity > 0.2) { + toRemove = true; + } else if(weight >= 25 && linkDensity > 0.5) { + toRemove = true; + } else if((embedCount === 1 && contentLength < 75) || embedCount > 1) { + toRemove = true; + } + if((checkWordOfTag() !== 'undefined') && checkCJK && toRemove){ + if(weight < 25 && linkDensity > 0.3){ + toRemove = true; + }else { + toRemove = false; + } + } + + var images = tagsList[i].getElementsByTagName("img"); + for(var im=0,il=images.length; im < il; im+=1) { + if ((images[im].height >= 150) && (images[im].width >= 200)) { + toRemove = false; + break; + } + } + if(tag === "div" || tag === "article") { + var readerDivClass = document.getElementsByClassName("whois_record"); + if(readerDivClass.length > 0) { + toRemove = false; + } + var readerDivClass1 = document.getElementsByClassName("sixteen columns hreview hentry hnews full"); + if(readerDivClass1.length > 0) { + toRemove = false; + } + var readerDivClass2 = document.getElementsByClassName("list"); + if(readerDivClass2.length > 0) { + toRemove = false; + } + var readerDivClass3 = document.getElementsByClassName("articleContent"); + if(readerDivClass3.length > 0) { + toRemove = false; + } + var readerDivClass4 = document.getElementsByClassName("content"); + if(readerDivClass4.length > 0) { + toRemove = false; + } + var readerDivClass5 = document.getElementsByClassName("view_cnt"); + if(readerDivClass5.length > 0) { + toRemove = false; + } + var readerDivClass6 = document.getElementById("description"); + if(readerDivClass6!==null && readerDivClass6.innerHTML.length > 0) { + toRemove = false; + } + } + + if(toRemove) { + tagsList[i].parentNode.removeChild(tagsList[i]); + } + } + } + } + function killBreaks(e) { + try { + e.innerHTML = e.innerHTML.replace(regexps.killBreaks,'
'); + } + catch (eBreaks) { + } + } + function cleanStyles(e) { + e = e || document; + var cur = e.firstChild; + + if(!e) { + return; } + + if(typeof e.removeAttribute === 'function' && e.className !== 'readability-styled') { + e.removeAttribute('style'); } + + while ( cur !== null ) { + if ( cur.nodeType === 1 ) { + if(cur.className !== "readability-styled") { + cur.removeAttribute("style"); + } + cleanStyles( cur ); + } + cur = cur.nextSibling; + } + } + +function cleanLinkHrefs(e) { + var links = e.getElementsByTagName("a"); + for(var i=0, il=links.length; i= 0; i-=1) { + var imgCount = articleParagraphs[i].getElementsByTagName('img').length; + var embedCount = articleParagraphs[i].getElementsByTagName('embed').length; + var objectCount = articleParagraphs[i].getElementsByTagName('object').length; + + if(imgCount === 0 && embedCount === 0 && objectCount === 0 && getInnerText(articleParagraphs[i], false) === '') { + articleParagraphs[i].parentNode.removeChild(articleParagraphs[i]); + } + } + + try { + articleContent.innerHTML = articleContent.innerHTML.replace(/]*>\s*

topCandidate.readability.contentScore) { + topCandidate = candidates[c]; } + } + + if (topCandidate === null || topCandidate.tagName === "BODY") + { + topCandidate = document.createElement("DIV"); + topCandidate.innerHTML = page.innerHTML; + page.innerHTML = ""; + page.appendChild(topCandidate); + initializeNode(topCandidate); + } + + var articleContent = document.createElement("DIV"); + articleContent.id = "readability-content"; + var siblingScoreThreshold = Math.max(10, topCandidate.readability.contentScore * 0.2); + var siblingNodes = topCandidate.parentNode.childNodes; + + + for(var s=0, sl=siblingNodes.length; s < sl; s+=1) { + var siblingNode = siblingNodes[s]; + var append = false; + + if(!siblingNode) { + continue; + } + + + if(siblingNode === topCandidate) + { + append = true; + } + + var contentBonus = 0; + if(siblingNode.className === topCandidate.className && topCandidate.className !== "") { + contentBonus += topCandidate.readability.contentScore * 0.2; + } + + if(typeof siblingNode.readability !== 'undefined' && (siblingNode.readability.contentScore+contentBonus) >= siblingScoreThreshold) + { + append = true; + } + + if(siblingNode.nodeName === "P") { + var linkDensity = getLinkDensity(siblingNode); + var nodeContent = getInnerText(siblingNode); + var nodeLength = nodeContent.length; + + if(nodeLength > 80 && linkDensity < 0.25) + { + append = true; + } + else if(nodeLength < 80 && linkDensity === 0 && nodeContent.search(/\.( |$)/) !== -1) + { + append = true; + } + } + + if(append) { + var nodeToAppend = null; + if(siblingNode.nodeName !== "DIV" && siblingNode.nodeName !== "P") { + nodeToAppend = document.createElement("DIV"); + try { + nodeToAppend.id = siblingNode.id; + nodeToAppend.innerHTML = siblingNode.innerHTML; + } + catch(er) { + nodeToAppend = siblingNode; + s-=1; + sl-=1; + } + } else { + nodeToAppend = siblingNode; + } + + if(nodeToAppend.className.search(regexps.retainDiv) !== -1) { + } + articleContent.appendChild(nodeToAppend.cloneNode(true)); + } + } + + + prepArticle(articleContent); + for (var pt=0; pt < nodesToScore.length; pt+=1) { + var parentNode = nodesToScore[pt].parentNode; + var grandParentNode = parentNode ? parentNode.parentNode : null; + delete parentNode.readability; + if (grandParentNode) { + delete grandParentNode.readability; + } + } + + if( articleContent.innerHTML == '' ) + { + return " " ; + } + + return articleContent.innerHTML; + } + +function getArticleTitle() { + var curTitle = "", + origTitle = ""; + + try { + curTitle = origTitle = document.title; + if(typeof curTitle !== "string") { + curTitle = origTitle = getInnerText(document.getElementsByTagName('title')[0]); + } + } + catch(e) {} + + if(curTitle.match(/ [\|\-] /)) + { + curTitle = origTitle.replace(/(.*)[\|\-] .*/gi,'$1'); + + if(curTitle.split(' ').length < 3) { + curTitle = origTitle.replace(/[^\|\-]*[\|\-](.*)/gi,'$1'); + } + } + else if(curTitle.indexOf(': ') !== -1) + { + curTitle = origTitle.replace(/.*:(.*)/gi, '$1'); + + if(curTitle.split(' ').length < 3) { + curTitle = origTitle.replace(/[^:]*[:](.*)/gi,'$1'); + } + } + else if(curTitle.length > 150 || curTitle.length < 15) + { + var hOnes = document.getElementsByTagName('h1'); + if(hOnes.length === 1) + { + curTitle = getInnerText(hOnes[0]); + } + } + + curTitle = curTitle.replace( regexps.trim, "" ); + + if(curTitle.split(' ').length <= 4) { + curTitle = origTitle; + } + return curTitle; +} + +function initReader() { + var article_block = grabArticle(); + var article_title = getArticleTitle() + if (article_block && article_block.length > 1000) { + var title = '

'+article_title+'

' + var meta = '\n'; + return meta + title + article_block; + } else { + return "undefined"; + } +} + +initReader(); +} +catch(e) { +console.log("Reader Error - Reader.js"); +} + diff --git a/inc/IntAddBookmarkForm.h b/inc/IntAddBookmarkForm.h new file mode 100644 index 0000000..77238ac --- /dev/null +++ b/inc/IntAddBookmarkForm.h @@ -0,0 +1,130 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntAddBookmarkForm.h + *@brief: This header file contains the declarations of the AddBookmarkForm class. + * + */ + +#ifndef _INT_ADD_BOOKMARK_FORM_H_ +#define _INT_ADD_BOOKMARK_FORM_H_ + +#include +#include +#include "IntBookmarkData.h" +#include "IntMultipleWindowPresentationModel.h" + +class AddBookmarkForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + { + public: + /** + * @brief The Default Constructor + */ + AddBookmarkForm(void); + + /** + * @brief The Default Destructor + */ + virtual ~AddBookmarkForm(void); + + /** + * @brief Add Radio Buttons to the list panel. + */ + void AddRadioButtonsToListPanel(void); + + /** + * @brief Shows alert message. + */ + void CreateMessage(Tizen::Base::String& str); + + /** + * @brief Initializes this instance of AddBookmarkForm. + */ + bool Initialize(void); + + // Initializes the controls of the UI for AddBookmarkForm. + virtual result OnInitializing(void); + + virtual result OnTerminating(void); + + // IListViewItemEventListener + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + + //IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual int GetItemCount(void); + + //IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IKeypadEventListener + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + + //IOrientationEventListener + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + // ITextEventListener + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + + //ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + static const int IDA_CREATE_BOOKMARK_FOLDER; + static const int IDA_BUTTON_DONE; + static const int IDA_BUTTON_CANCEL; + static const int IDA_LIST_LEFT_SIDE_MARGIN; + static const int IDA_LIST_LEFT_SIDE_MARGIN_DROPDOWN; + private: + int __folderCount; // Number of bookmark folders + Tizen::Base::String __folderName; // Selected folder name + int __listHeight; + int __oldFolderCount; // Folder count when view is deactivated. + BookmarkData* __pBookmark; + Tizen::Ui::Controls::EditField* __pEditFieldTitle; // Title Edit-field + Tizen::Ui::Controls::EditField* __pEditFieldUrl; // URL Editfield + Tizen::Ui::Controls::ListView* __pList; // contains only one item + Tizen::Ui::Controls::Panel* __pListPanel; // Contains the list of Bookmark folders inluding default Bookmark and Create Bookmark Folder Button + Tizen::Ui::Scenes::SceneId __previousScene; // previous scene id + Tizen::Ui::Controls::Label* __pLabel1; + Tizen::Ui::Controls::ScrollPanel* __pScrollPanel; // The Main panel which is a scroll panel + WindowInfo* __pWindowInfo; // Contains window information of current scene + int __selectedIndex; // The index of check-button which is selected + bool __showFolderList; + Tizen::Base::String __titleOnViewDeactivated; + Tizen::Base::String __view; + Tizen::Base::String __urlOnViewDeactivated; + }; + +#endif /* _INT_ADD_BOOKMARK_FORM_H_ */ diff --git a/inc/IntAddressbar.h b/inc/IntAddressbar.h new file mode 100644 index 0000000..a401aaf --- /dev/null +++ b/inc/IntAddressbar.h @@ -0,0 +1,190 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntAddressbar + *@brief: This class defines common behaviour of Addressbar control. + * + */ + +#ifndef _INT_ADDRESSBAR_H_ +#define _INT_ADDRESSBAR_H_ + +#include +#include +#include +#include "IntIAddressbarEventListener.h" + +enum AddressBarMode +{ + ADDRESSBAR_MODE_INVALID = -1, + ADDRESSBAR_MODE_READER = 0, + ADDRESSBAR_MODE_LOADING, + ADDRESSBAR_MODE_LOADING_COMPLETE, + ADDRESSBAR_MODE_EDIT, +}; + +class Addressbar +: public Tizen::Ui::Controls::Panel + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IKeypadEventListener + { + public: + /** + * @brief This is the default constructor for this class. + */ + Addressbar(void); + + /** + * @brief This is the default destructor for this class. + */ + virtual ~Addressbar(void); + + // IActionEventListener + void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IKeypadActionEventListener + void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction); + void OnKeypadClosed(Tizen::Ui::Control& source); + void OnKeypadOpened(Tizen::Ui::Control& source); + void OnKeypadWillOpen(Tizen::Ui::Control& source); + + /** + * @brief Initializes this instance of Addressbar with the specified parameters. + */ + result Initialize(const Tizen::Graphics::Rectangle& rect); + + /** + * @brief Gets the current addressbar Mode. + */ + AddressBarMode GetAddressbarMode(void); + + /** + * brief To remove the Http from the Url editfield + */ + Tizen::Graphics::Bitmap* GetLockedImageN(void); + + /** + * @brief Gets the current progress value Addressbar control in percentage + */ + int GetProgress(void); + + /** + * @brief Gets the currently displayed Url for the Addressbar control. + */ + Tizen::Base::String GetUrl(void); + + /** + * @brief Event when orientationChanged + */ + void OrientationChanged(void); + + /** + * brief To remove the Http from the Url editfield + */ + Tizen::Base::String RemoveHttpTextFromDisplayURL(void); + + /** + * @brief Save the text of address bar + */ + void SaveAddressbarEditText(); + + /** + * @brief Sets the specified Url for the Addressbar control. + * + */ + void SetUrl(const Tizen::Base::String& url); + + /** + * @brief Sets the event listener for the Addressbar control. + * + */ + void SetAddressbarEventListener(IAddressbarEventListener* pListener); + + /** + * @brief Sets the current addressbar Mode. + */ + void SetAddressbarMode(AddressBarMode addMode); + + /** + * brief Sets the backward Button enable or disable as per the input parameter isEnabled. + */ + void SetBackButtonEnabled(bool isEnabled); + + /** + * @brief Sets the favicon bitmap. + */ + void SetFaviconBitmap(const Tizen::Graphics::Bitmap& favicon); + + /** + * @brief Sets the Forward Button enable or disable as per the input parameter isEnabled. + */ + void SetForwardButtonEnabled(bool isEnabled); + + /** + * @brief Updates the favicon bitmap/image depending on browsing mode. + */ + void UpdateFaviconBitmap(bool isPrivateOn); + + /** + * @brief Updates the progressbar Value. + */ + void UpdateProgress(const int percentage); + + private: + /** + * @brief Updates the progressbar Value. + */ + void UpdateProgressBitmap(void); + + //Action IDs + static const int IDA_REFRESH_BTN_CLICKED; + static const int IDA_READER_BTN_CLICKED; + static const int IDA_STOP_BTN_CLICKED; + static const int IDA_GO_BACK; + static const int IDA_GO_FORWARD; + static const int IDA_CANCEL; + static const int IDA_CLEAR_URL; + + private: + AddressBarMode __currentAddMode; + Tizen::Base::String __displayUrl; + Tizen::Base::String __editTextUrl; + + bool __isLoadingData; + bool __isLoadingCompleted; + int __progressPercentage; + + Tizen::Ui::Controls::Label* __pAddressbarBg; + Tizen::Ui::Controls::Panel* __pBgPanel; + Tizen::Ui::Controls::Button* __pCancelBtn; + Tizen::Ui::Controls::Button* __pClearBtn; + Tizen::Graphics::Bitmap* __pFavIcon; + Tizen::Ui::Controls::Label* __pFaviconLabel; + Tizen::Ui::Controls::Button* __pGoBackBtn; + Tizen::Ui::Controls::Button* __pGoForwardBtn; + Tizen::Ui::Controls::Label* __pLabelPrivateOn; + IAddressbarEventListener* __pListener; + Tizen::Ui::Controls::Label* __pPrivateIconLabel; + Tizen::Ui::Controls::Label* __pProgressbarLabel; + Tizen::Ui::Controls::Button* __pReaderBtn; + Tizen::Ui::Controls::Button* __pRefreshBtn; + Tizen::Ui::Controls::Button* __pStopBtn; + Tizen::Ui::Controls::Label* __pSearchLabel; + Tizen::Ui::Controls::EditField* __pUrlField; + }; + +#endif /* _INT_ADDRESSBAR_H_ */ diff --git a/inc/IntBookmarkData.h b/inc/IntBookmarkData.h new file mode 100644 index 0000000..54dff3a --- /dev/null +++ b/inc/IntBookmarkData.h @@ -0,0 +1,220 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +/** + * @file IntBookmark.h + * @brief This header file contains the declarations of the BookmarkData class. + * + * + */ +#ifndef _INT_BOOKMARK_DATA_H_ +#define _INT_BOOKMARK_DATA_H_ + + +#include + +/** + * @enum BookmarkType + * + * BookmarkType enum is used to define type of bookmark + * + */ +typedef enum BookmarkType +{ + BOOKMARK_TYPE_URL = 0, + BOOKMARK_TYPE_FOLDER +}type; + +/** + * @class Bookmark + * @brief This is a model class which contains all the properties of Bookmark class + * and the methods to get and set the values for those properties + */ +class BookmarkData + : public Tizen::Base::Object +{ +public: + /** + * @brief Default constructor + */ + BookmarkData(void); + + /** + *@brief Initialises the instance the class Bookmark with the specified parameter + */ + BookmarkData(const BookmarkData& bm); + + /** + *@brief Default destructor + */ + ~BookmarkData(void); + + /** + *@brief "=" operator overloading + */ + BookmarkData& operator =(const BookmarkData& pBookmark); + + /** + * This function gets the BookmarkId + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetBookmarkId(void); + + /** + * This function gets the BookmarkTitle + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetBookmarkTitle(void); + + /** + * This function gets the BookmarkType whether FOLDER or URL + * + * @return enum type + * @param No parameter + */ + type GetBookmarkType(void); + + /** + * This function gets the created time for the bookmark + * + * @return DateTime + * @param No parameter + */ + Tizen::Base::DateTime GetCreatedTime(void); + + /** + * This function gets the FaviconId + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetFaviconId(void); + + /** + * This function gets the path of the favicon of URL + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetIconPath(void); + + /** + * This function gets the modified time for the bookmark + * + * @return DateTime + * @param No parameter + */ + Tizen::Base::DateTime GetModifiedTime(void); + + /** + * This function gets the parentId + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetParentId(void); + + /** + * This function gets the URL + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetUrl(void); + + + /** + * This function sets the BookmarkId for the bookmark object + * + * @return No return type + * @param strBookmarkId The ID for the bookmark object + */ + void SetBookmarkId(const Tizen::Base::String& strBookmarkId); + + /** + * This function sets the BookmarkTitle for the bookmark object + * + * @return No return type + * @param strTitle The Title for the bookmark object + */ + void SetBookmarkTitle(Tizen::Base::String& strTitle); + + /** + * This function sets the createdTime for the bookmark object + * + * @return No return type + * @param strCreatedTime The createdTime for the bookmark + */ + void SetCreatedTime(const Tizen::Base::DateTime& strCreatedTime); + + /** + * This function sets the faviconid + * + * @return No return type + * @param strFaviconId The ID for the favicon object + */ + void SetFaviconId(const Tizen::Base::String& strFaviconId); + + /** + * This function sets the path for the favicon of the bookmark object + * + * @return No return type + * @param strFilePath The path for the favicon icon of bookmark + */ + void SetIconPath(const Tizen::Base::String& strFilePath); + + /** + * This function sets the ModifiedTime for the bookmark object + * + * @return No return type + * @param strModifiedTime The ModifiedTime for the bookmark + */ + void SetModifiedTime(const Tizen::Base::DateTime& strModifiedTime); + + /** + * This function sets the ParentId for the bookmark object + * + * @return No return type + * @param strParentID The parentId for the bookmark object + */ + void SetParentId(const Tizen::Base::String& strParentID); + + /** + * This function sets the URL for the bookmark object + * + * @return No return type + * @param strTitle The URL for the bookmark object + */ + void SetUrl(const Tizen::Base::String& strUrl); + +private: + Tizen::Base::String __bookmarkId; + type __bookmarkType; + Tizen::Base::String __bookmarkTitle; + Tizen::Base::String __bookmarkUrl; + Tizen::Base::DateTime __createdTime; + Tizen::Base::String __faviconId; + Tizen::Base::String __iconPath; + Tizen::Base::DateTime __modifiedTime; + Tizen::Base::String __parentId; +}; + +#endif //_INT_BOOKMARK_DATA_H_ diff --git a/inc/IntBookmarkListForm.h b/inc/IntBookmarkListForm.h new file mode 100644 index 0000000..7346854 --- /dev/null +++ b/inc/IntBookmarkListForm.h @@ -0,0 +1,147 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: BookmarkListForm + *@brief: This class defines BookmarkListForm + * + */ + +#ifndef _INT_BOOKMARK_LIST_FORM_H_ +#define _INT_BOOKMARK_LIST_FORM_H_ + +#include +#include +#include "IntConfirmationPopup.h" +#include "IntSharePopup.h" + +class BookmarkListForm +: public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::Controls::ISearchBarEventListener + + { + public: + + /** + * @brief The Default Constructor + * + */ + BookmarkListForm(void); + + /** + * @brief The Default Destructor + * + */ + virtual ~BookmarkListForm(void); + + /** + * @brief Initializes this instance of BookmarkListForm. + * + */ + bool Initialize(void); + + // IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + /** + * Initializes the controls of the UI for BookmarkListForm. + * + */ + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + // IOrientationEventListener + void OnOrientationChanged (const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + // ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + protected: + + // IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual int GetItemCount(void); + + // IFastScrollListener + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + + // IListViewItemEventListener + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + + //IKeypadEventListener + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction); + + //ISearchBarEventListener + virtual void OnSearchBarModeChanged(Tizen::Ui::Controls::SearchBar& source, Tizen::Ui::Controls::SearchBarMode mode); + + private: + static const int IDA_TABBAR_ITEM_1; + static const int IDA_TABBAR_ITEM_2; + static const int IDA_FOOTER_ITEM1; + static const int IDA_FOOTER_ITEM2; + static const int IDA_FOOTER_ITEM_ADDBOOKMARK; + static const int IDA_FORMAT_FOLDER; + static const int IDA_FORMAT_SITE; + static const int IDA_CONTEXT_ITEM_FOLDER_EDIT; + static const int IDA_CONTEXT_ITEM_FOLDER_DELETE; + static const int IDA_CONTEXT_ITEM_EDIT; + static const int IDA_CONTEXT_ITEM_SHARE; + static const int IDA_CONTEXT_ITEM_DELETE; + static const int IDA_FORMAT_ICON; + static const int IDA_FORMAT_URL; + + static const int IDA_CONFIRMATION_NO; + static const int IDA_CONFIRMATION_YES; + bool __noBookmarks; + Tizen::Base::String __parentID; + Tizen::Base::Collection::ArrayList* __pData; + ConfirmationPopup* __pConfirmationPopup; + Tizen::Ui::Controls::Footer* __pFooter; + Tizen::Ui::Controls::ListContextItem* __pItemContextFolder; + Tizen::Ui::Controls::ListContextItem* __pItemContextSite; + Tizen::Ui::Controls::ListView* __pListview; + SharePopup* __pPopUp; + + Tizen::Ui::Scenes::SceneId __previousSceneId; + Tizen::Ui::Controls::SearchBar* __pSearchBar; + Tizen::Ui::Controls::ListView* __pSearchListView; // The GroupedListView which contains the Search Bookmark lists + bool __searchBookmark; + Tizen::Base::String __searchText; + int __selectedindex; + Tizen::Base::String __selectedTitle; + }; + +#endif //_INT_BOOKMARK_LIST_FORM_H_ diff --git a/inc/IntBookmarkPresentationModel.h b/inc/IntBookmarkPresentationModel.h new file mode 100644 index 0000000..1da03cc --- /dev/null +++ b/inc/IntBookmarkPresentationModel.h @@ -0,0 +1,297 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntBookmarkPresentationModel.h + *@brief: This is the header file for BookmarkPresentationModel class + */ + +#ifndef _INT_BOOKMARK_PRESENTATION_MODEL_H +#define _INT_BOOKMARK_PRESENTATION_MODEL_H + +#include +#include +#include + +#include "IntBookmarkData.h" +#include "IntPresentationModelBase.h" +#include "IntTypes.h" + +/** + * @class BookmarkPresentationModel + * @brief This class declares functions which will manage database + */ +class BookmarkPresentationModel +:public PresentationModelBase + { +public: + /** + * @brief The method used to get the already created instance of the FaviconManager + */ + static BookmarkPresentationModel* GetInstance(void); + /** + * This function deletes the bookmark from the bookmark table + * + * @return An error code + * @param bookmarkId The bookmarkId + * @exception E_SUCCESS The bookmark is successfully deleted + * @exception E_FAILURE The bookmark deletion is unsuccessful + */ + result DeleteBookmark(int bookmarkId); + + /** + * This function deletes the bookmark from the bookmark table + * + * @return An error code + * @param url URL of the bookmark + * @exception E_SUCCESS The bookmark is successfully deleted + * @exception E_FAILURE The bookmark deletion is unsuccessful + */ + result DeleteBookmark(const Tizen::Base::String& url); + + /** + * This function deletes the bookmark from the bookmark table + * + * @return An error code + * @param folderId The folderID + * @exception E_SUCCESS The bookmark is successfully deleted + * @exception E_FAILURE The bookmark deletion is unsuccessful + */ + result DeleteBookmarkByFolderId(int folderId); + + /** + * This function deletes the folder from the folder table + * + * @return An error code + * @param bookmarkId The folderId + * @exception E_SUCCESS The folder is successfully deleted + * @exception E_FAILURE The folder deletion is unsuccessful + */ + result DeleteFolder(int folderId); + + + /** + * This function checks whether the Bookmark with given URl already exists or not + * + * @return An error code + * @param URl + * @exception E_SUCCESS The method is successful + * @exception E_FAILURE The method is not successful as the list is not being created + * @remarks To check whether the Bookmark with given URl already exists or not + */ + result DoesBookmarkExist(const Tizen::Base::String& Url, bool &exist, const Tizen::Base::String& parentId = L"-1", bool checkParentId = false); + /** + * This function selects the bookmarks from the table + * + * @return An error code + * @param parentID parentId for bookmark : Folder or URL + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param bookmarkList The arraylist where the selected bookmarks will be saved + */ + result GetBookmark(const Tizen::Base::String& parentID, const int startIndex, const int limit, Tizen::Base::Collection::ArrayList& bookmarkList); + + + /** + * This function returns the no of bookmarks + * + * @return An error code + * @param parentID Folder or URL + */ + result GetBookmarkCount(const Tizen::Base::String& parentID, int& count); + + /** + * This function selects the bookmark folders from the table + * + * @return An error code + * @param parentID parentId for bookmark : Folder or URL + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param bookmarkList The arraylist where the selected bookmarks will be saved + */ + result GetFolder(const Tizen::Base::String& parentID, int startIndex,int limit, Tizen::Base::Collection::ArrayList& bookmarkList); + + + /** + * This function returns the no of bookmark folders + * + * @return An error code + * @param parentID Folder or URL + */ + result GetFolderBookmarkCount(const Tizen::Base::String& parentID, int& Count); + + /** + * This function selects the bookmark folders from the table + * + * @return An error code + * @param parentID parentId for bookmark : Folder or URL + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param bookmarkList The arraylist where the selected bookmarks will be saved + */ + result GetFoldersBookmarks(const Tizen::Base::String& parentID, const int startIndex, const int limit, Tizen::Base::Collection::ArrayList& bookmarkList); + + /** + * This function returns the no of bookmark folders. + * + * @return An error code + * @param parentID Folder or URL + */ + result GetFolderCount(const Tizen::Base::String& parentID, int& count); + + /** + * This function selects the searched bookmarks from the table + * + * @return An error code + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param BookmarkList The arraylist where the selected searched bookmarks will be saved + */ + result GetSearchBookmark(int startIndex,int limit, Tizen::Base::Collection::ArrayList& BookmarkList, Tizen::Base::String& text); + + + /** + * This function returns the no of searched Bookmarks + * + * @return An error code + * @param count The no of matching bookmarks will be returned in count. + */ + result GetSearchBookmarkCount(int& count, Tizen::Base::String& text); + + /** + * This function selects the searched folders from the table + * + * @return An error code + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param FolderList The arraylist where the selected searched folders will be saved + */ + result GetSearchFolder(int startIndex,int limit, Tizen::Base::Collection::ArrayList& FolderList, Tizen::Base::String& text); + + /** + * This function returns the no of searched Bookmarks and Folders + * + * @return An error code + * @param count The no of matching bookmarks and folders will be returned in count. + */ + result GetSearchFolderBookmarkCount(int& count, Tizen::Base::String& text); + + /** + * This function returns the no of searched Folders + * + * @return An error code + * @param count The no of matching Folders will be returned in count. + */ + result GetSearchFolderCount(int& count, Tizen::Base::String& text); + + /** + * This function selects the searched bookmark folders from the table + * + * @return An error code + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param BookmarkList The arraylist where the selected searched bookmarks will be saved + */ + result GetSearchFoldersBookmarks(int startIndex,int limit, Tizen::Base::Collection::ArrayList& BookmarkList, Tizen::Base::String& text); + + /** + * This function adds the folder to the folder table + * + * @return An error code + * @param bookmark The folder + * @exception E_SUCCESS The folder is inserted successfully to the table + * @exception E_FAILURE The folder is not inserted successfully + */ + result SaveFolder(BookmarkData& bookmark); + + /** + * This function adds the bookmarks to the bookmark table + * + * @return An error code + * @param bookmark The bookmark + * @exception E_SUCCESS The bookmark is inserted successfully to the table + * @exception E_FAILURE The bookmark is not inserted successfully + */ + result SaveBookmark(BookmarkData& bookmark); + +private: + /** + * @brief The Default Constructor + */ + BookmarkPresentationModel(void); + + /** + * @brief The Default Destructor + */ + ~BookmarkPresentationModel(void); + + /** + * copy constructor + */ + BookmarkPresentationModel(const BookmarkPresentationModel& settingModelObj); + + /** + * assignment operator + */ + + BookmarkPresentationModel& operator=(const BookmarkPresentationModel& settingModelObj); + + /** + *@brief Initialize storage service + */ + result Construct(void); + + /** + * @brief The method used to create the instance of the SettingsManager class + */ + static void CreateInstance(void); + + /** + * @brief The method used to remove the already created instance of the SettingsManager + */ + static void DestroyInstance(void); + + /** + * This function creates the list of BookMark + * + * @return An error code + * @param nBookmarkCount The no of BookMark present + * @param bookmarkList An ArrayList where the BookMark will be stored + * @exception E_SUCCESS The method is successful + * @exception E_FAILURE The method is not successful as the list is not being created + * @remarks To work properly , the bookmark count and and existing list should be passed + */ + result CreateBookmarkList(int nBookmarkCount, Tizen::Base::Collection::ArrayList& bookmarkList); + /** + * This function creates the list of BookMark folders + * + * @return An error code + * @param bookmarkCount The no of BookMark folders present + * @param bookmarkList An ArrayList where the BookMark will be stored + * @exception E_SUCCESS The method is successful + * @exception E_FAILURE The method is not successful as the list is not being created + * @remarks To work properly , the bookmark count and and existing list should be passed + */ + + result CreateFolderList(int bookmarkCount, Tizen::Base::Collection::ArrayList& bookmarkList); + +private: + static BookmarkPresentationModel* __pBookmarkPresentationModel; + + }; + +#endif //_INT_BOOKMARK_PRESENTATION_MODEL_H diff --git a/inc/IntBrightnessForm.h b/inc/IntBrightnessForm.h new file mode 100644 index 0000000..093888c --- /dev/null +++ b/inc/IntBrightnessForm.h @@ -0,0 +1,101 @@ + +// Copyright 2012 Samsung Electronics Co., Ltd. +// +// 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. +// +//!Internet IntBrightness class +/*@file: IntBrightness.h + *@brief: This class defines IntBrightness used to change the brightness + * + */ + +#ifndef _INT_BRIGHTNESS_FORM_H_ +#define _INT_BRIGHTNESS_FORM_H_ + +#include +#include +#include + + +class BrightnessForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::Controls::ISliderEventListener + +{ +public: + /** + * @brief The Default Constructor + * + * @return + */ + BrightnessForm(void); + + /** + * @brief The Default Destructor + * + * @return + */ + virtual ~BrightnessForm(void); + + /** + * @brief Initializes this Brightness Form. + * + * @return An error code + * @param[in] void + * @exception true The method is successful. + * @exception false An error occurred. + */ + bool Initialize(void); + + /** + * @brief Initializes the controls of the UI for Brightness. + * + * @return An error code + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result OnInitializing(void); + +protected: + + //IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //IOrientationEventListener + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + //ISceenEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + //ISliderEventListener + virtual void OnSliderBarMoved(Tizen::Ui::Controls::Slider& source, int value); + +private: + bool __manualBrightness; + Tizen::Ui::Controls::Slider* __pBrightnessSlider; + Tizen::Ui::Controls::Label* __pLabel; +}; + +#endif /* _INT_BRIGHTNESS_FORM_H_ */ diff --git a/inc/IntCommonLib.h b/inc/IntCommonLib.h new file mode 100644 index 0000000..e36bbda --- /dev/null +++ b/inc/IntCommonLib.h @@ -0,0 +1,106 @@ +// + +// Copyright (c) 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://floralicense.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. +// +//!Internet +/*@file: IntCommonLib.h + *@brief: To define the common method of Internet application + */ + +#ifndef _INT_COMMON_LIB_H_ +#define _INT_COMMON_LIB_H_ + +#include + +/** +* @struct CommonBitmapTable +* +* Defines the table to store a bitmap +* +*/ +struct CommonBitmapTable +{ + Tizen::Graphics::Bitmap* ptr; + int refcount; + Tizen::Base::String filename; + int width; + int height; +}; + +/** +* @enum CommonBitmapId +* +* Defines a ID for a Bitmap path +* +*/ +enum CommonBitmapId +{ + +}; + +/** + * @class CommonUtil + * @brief This file declares common methods to be used + */ +class CommonUtil +{ +public: + + /** + * Returns a pointer to a bitmap value using ID + * + * @return Pointer to a bitmap value + * @param[in] CommonBitmapId The ID of the Bitmap + * @remarks To work properly, the existing CommonBitmapId has to be passed. + */ + static Tizen::Graphics::Bitmap* GetBitmap(uint id); + + /** + * Returns a pointer to a bitmap value using bitmap path, bitmap width and bitmap height + * + * @return Pointer to a bitmap value + * @param[in] strPath The path of the existing bitmap stored in res folder + * @param[in] width The width of the existing bitmap stored in res folder + * @param[in] height The height of the existing bitmap stored in res folder + * @remarks To work properly, the existing strPath, its width and height has to be passed. + */ + static Tizen::Graphics::Bitmap* GetBitmapN(const Tizen::Base::String& strPath, const int width, const int height); + + /** + * Gets a bitmap using ID assigned to it. + * + * @return Bitmap + * @param[in] Path + * @param[in] width + * @param[in] height + * @remarks Releases all the bitmaps stored + */ + static Tizen::Graphics::Bitmap* GetNinepatchedBitmapN(const Tizen::Base::String& strPath, const int width, const int height); + + /** + * Returns the string value using ID + * + * @return String + * @param[in] resourceId The ID of the resource string + * @remarks To work properly, the existing resourceId has to be passed. + */ + static Tizen::Base::String GetString(const Tizen::Base::String& resourceId); + + +private: + static CommonBitmapTable __commonBitmapTable[]; +}; + +#endif //_INT_COMMON_LIB_H_ diff --git a/inc/IntConfirmationPopup.h b/inc/IntConfirmationPopup.h new file mode 100644 index 0000000..514ba9a --- /dev/null +++ b/inc/IntConfirmationPopup.h @@ -0,0 +1,58 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntConfirmationPopup.h + *@brief: This header file contains the declarations of the ConfirmationPopup + * + */ + +#ifndef CONFIRMATIONPOPUP_H_ +#define CONFIRMATIONPOPUP_H_ + +#include +#include + +class ConfirmationPopup + : public Tizen::Ui::Controls::Popup + { +public: + ConfirmationPopup(void); + + virtual ~ConfirmationPopup(void); + + bool Initialize(void); + + void AddActionListener(Tizen::Ui::IActionEventListener& listener); + + Tizen::Base::String GetMessage(void); + + virtual result OnTerminating(void); + + void RemoveActionListener(Tizen::Ui::IActionEventListener& listener); + + void setMessage(Tizen::Base::String& str); + +private: + + Tizen::Base::String __message; + Tizen::Ui::Controls::Button* __pNoButton; + Tizen::Ui::Controls::Label* __pPopupText; + Tizen::Ui::Controls::Button* __pYesButton; +}; + +#endif /* CONFIRMATIONPOPUP_H_ */ diff --git a/inc/IntCreateBookmarkFolderForm.h b/inc/IntCreateBookmarkFolderForm.h new file mode 100644 index 0000000..48db1b6 --- /dev/null +++ b/inc/IntCreateBookmarkFolderForm.h @@ -0,0 +1,97 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntCreateBookMarkFolderForm + *@brief: This class creates Bookmark folder + * + */ + + +#ifndef _INT_CREATE_BOOKMARK_FOLDER_FORM_H_ +#define _INT_CREATE_BOOKMARK_FOLDER_FORM_H_ + +#include +#include +#include "IntBookmarkData.h" + +class CreateBookmarkFolderForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::ITextEventListener +{ + +public: + /** + * @brief The Default Constructor + * + */ + + CreateBookmarkFolderForm(void); + + /** + * @brief The Default Destructor + */ + + virtual ~CreateBookmarkFolderForm(void); + + /** + * @brief Shows alert message + * + */ + void CreateMessage(Tizen::Base::String& str); + + /** + * @brief Initializes this instance of %CreateBookmarkFolderForm. + */ + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + // IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IKeypadListener + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + + //ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + // ITextEventListener + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + +protected: + static const int IDA_BUTTON_DONE; + static const int IDA_BUTTON_CANCEL; +private: + int __modalMsgBoxResult; + BookmarkData* __pBookmark; + Tizen::Ui::Controls::EditField* __pFolderTitle; // Folder Title Editfield + Tizen::Ui::Controls::MessageBox* __pMsgBox; // Message Box to display alert if folder with same name already exists + Tizen::Ui::Scenes::SceneId __previousScene; + bool __ret; +}; + +#endif /* _INT_CREATE_BOOKMARK_FOLDER_FORM_H_ */ diff --git a/inc/IntDefaultCustomItem.h b/inc/IntDefaultCustomItem.h new file mode 100644 index 0000000..24c98d0 --- /dev/null +++ b/inc/IntDefaultCustomItem.h @@ -0,0 +1,79 @@ +// + +// Copyright (c) 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://floralicense.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. +// +//!Internet +/*@file: DefaultCustomItem + *@brief: This class defines common behaviour of custom Item. + * + */ + +#ifndef _INT_DEFAULT_CUSTOM_ITEM_H_ +#define _INT_DEFAULT_CUSTOM_ITEM_H_ + + + +#include +#include +#include + + +class DefaultCustomItem + : public Tizen::Ui::Controls::CustomItem +{ + +public: + /** + * @brief The Default Constructor + */ + DefaultCustomItem(void); + + /** + * @brief The Default Destructor + */ + virtual ~DefaultCustomItem(void); + + /** + * @brief Initializes this instance of %DropDownCustomItem. + */ + result Construct(int width, int height); + + + //getter and setter methods for Text + + /** + * @brief The method used to get the text of CustomItem + */ + Tizen::Base::String GetText(void); + + /** + * @brief Add all the required elements and create the Custom Item. + */ + result Make(void); + + /** + * @brief The method used to set the text of CustomItem + */ + void SetText(Tizen::Base::String& text); +protected: + static const int IDA_FORMAT_STRING; + +private: + int __height; ///Height of the SettingToggleCustomItem Instance + Tizen::Base::String __text; ///The Text for the Toggle Button + int __width; ///Width of the SettingToggleCustomItem Instance +}; + +#endif /* _INT_DEFAULT_CUSTOM_ITEM_H_ */ diff --git a/inc/IntDropDownCustomItem.h b/inc/IntDropDownCustomItem.h new file mode 100644 index 0000000..c7851db --- /dev/null +++ b/inc/IntDropDownCustomItem.h @@ -0,0 +1,111 @@ +// + +// Copyright (c) 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://floralicense.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. +// +//!Internet +/*@file: DropDownCustomItem + *@brief: This class defines common behaviour of Drop down custom Item. + * + */ + +#ifndef _INT_DROPDOWN_CUSTOM_ITEM_H_ +#define _INT_DROPDOWN_CUSTOM_ITEM_H_ + + +#include +#include + +enum DropDownItemState +{ + DROP_DOWN_ITEM_STATE_OPENED = 0, + DROP_DOWN__ITEM_STATE_CLOSED +}; + +class DropDownCustomItem + : public Tizen::Ui::Controls::CustomItem +{ + +public: + /** + * Initializes this instance of DropDownCustomItem. + */ + result Construct(int width); + + + /** + * @brief The Default constructor + */ + DropDownCustomItem(void); + + + /** + * @brief The Default Destructor + */ + virtual ~DropDownCustomItem(void); + + //getter and setter methods for Main Text + + /** + * @brief The method used to get the Title text of CustomItem + */ + DropDownItemState GetCurState(void); + + /** + * @brief The method used to get the Title text of CustomItem + */ + Tizen::Base::String GetMainText(void); + + /** + * @brief The method used to get the Sub text of CustomItem + */ + Tizen::Base::String GetSubText(void); + + /** + * @brief Add all the required elements and create the Custom Item. + * + */ + result Make(void); + + /** + * @brief The method used to set the Title text of CustomItem + */ + void SetCurState(DropDownItemState); + + /** + * @brief The method used to set the Title text of CustomItem + */ + void SetMainText(const Tizen::Base::String& text); + + /** + * @brief The method used to set the Sub text of CustomItem + */ + void SetSubText(const Tizen::Base::String& text); + +protected: + static const int IDA_FORMAT_BITMAP; + static const int IDA_FORMAT_MAIN_STRING; + static const int IDA_FORMAT_SUB_STRING; + static const int IDA_FORMAT_DROPPER; + +private: + DropDownItemState __currentState; + int __height; ///Height of the SettingToggleCustomItem Instance + int __width; ///Width of the SettingToggleCustomItem Instance + + Tizen::Base::String __mainText; ///The MainText for the Toggle Button + Tizen::Base::String __subText; ///The SubText for the Toggle Button +}; + +#endif /* _INT_DROPDOWN_CUSTOM_ITEM_H_ */ diff --git a/inc/IntEditBookmarkListForm.h b/inc/IntEditBookmarkListForm.h new file mode 100644 index 0000000..e2e493e --- /dev/null +++ b/inc/IntEditBookmarkListForm.h @@ -0,0 +1,116 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: EditBookmarkListForm + *@brief: This class defines EditBookmarkListForm used to edit the bookmark + * + */ + +#ifndef _INT_EDIT_BOOKMARK_LIST_FORM_H_ +#define _INT_EDIT_BOOKMARK_LIST_FORM_H_ + +#include +#include +#include "IntConfirmationPopup.h" + +class EditBookmarkListForm + : public Tizen::Ui::Controls::Form + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + { +public: + EditBookmarkListForm(void); + + /** + * @brief The Default Destructor + */ + virtual ~EditBookmarkListForm(void); + + /** + * @brief Initializes this instance of EditBookmarkListForm. + * + */ + bool Initialize(void); + + public: + virtual result OnInitializing(void); + + // IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual int GetItemCount(void); + + // IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IFastScrollListener + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + + // IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + // IOrientationEventListener + virtual void OnOrientationChanged (const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + // IListViewItemEventListener + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewItemReordered(Tizen::Ui::Controls::ListView& listView, int indexFrom, int indexTo); + + //ITimerEventListener + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + //ISceenEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + +protected: + static const int IDA_BUTTON_CHECKED; + static const int IDA_TABBAR_ITEM_1; + static const int IDA_TABBAR_ITEM_2; + static const int IDA_DELETEITEM_CLICKED; + static const int IDA_SHAREITEM_CLICKED; + static const int IDA_CANCELITEM_CLICKED; + static const int IDA_FORMAT_FOLDER; + static const int IDA_FORMAT_SITE; + static const int IDA_FORMAT_ICON; + static const int IDA_FORMAT_BITMAP; + static const int IDA_BUTTON_UNCHECKED; + static const int IDA_FORMAT_URL; + +private: + Tizen::Base::String __parentID; + Tizen::Ui::Controls::CheckButton* __pCheckButton; + ConfirmationPopup* __pConfirmationPopup; + Tizen::Base::Collection::ArrayList* __pData; + Tizen::Base::Runtime::Timer* __pTimer; + Tizen::Ui::Controls::Label* __pInfoLabel; + Tizen::Ui::Controls::Panel* __pInfoPanel; + Tizen::Ui::Controls::ListView* __pListview; + int __selectedItemCount; + }; + +#endif /* _INT_EDIT_BOOKMARK_LIST_FORM_H_ */ diff --git a/inc/IntEditHistoryListForm.h b/inc/IntEditHistoryListForm.h new file mode 100644 index 0000000..a7ee023 --- /dev/null +++ b/inc/IntEditHistoryListForm.h @@ -0,0 +1,149 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntEditHistoryListForm + *@brief: This class defines EditHistoryListForm used to edit the history scene + * + */ + +#ifndef _INT_EDIT_HISTORY_LIST_FORM_H_ +#define _INT_EDIT_HISTORY_LIST_FORM_H_ + +#include +#include + + +class EditHistoryListForm + : public Tizen::Ui::Controls::Form + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemProvider + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + { + public: + + /** + * @brief The Default constructor + */ + EditHistoryListForm(void); + + /** + * @brief The Default Destructor + */ + virtual ~EditHistoryListForm(void); + + /** + * @brief To Create Group Items. + * + */ + void CreateGroupItems(void); + + /** + * @brief Initializes this instance of EditHistoryListForm. + * + */ + bool Initialize(void); + + /** + * @brief converts the integer value of month to string value for that corresponding month. + * + */ + Tizen::Base::String GetMonth(int month); + + public: + + // IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //IGroupedListViewItemProvider + Tizen::Ui::Controls::GroupItem* CreateGroupItem(int groupIndex, int itemWidth); + Tizen::Ui::Controls::ListItemBase* CreateItem(int groupIndex, int itemIndex, int itemWidth); + bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::GroupItem* pItem, int itemWidth); + bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + int GetGroupCount(void); + int GetItemCount(int groupIndex); + + /** + * Initializes the controls of the UI for EditHistoryListForm. + */ + virtual result OnInitializing(void); + + virtual result OnTerminating(void); + + + //ITimerEventListener + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + //IGroupedListViewItemEventListener + void OnGroupedListViewContextItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + void OnGroupedListViewItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListItemStatus status); + void OnGroupedListViewItemSwept(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, Tizen::Ui::Controls::SweepDirection direction); + + //ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + //IOrientationEventListener + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + protected: + static const int IDA_TABBAR_ITEM_1; + static const int IDA_TABBAR_ITEM_2; + static const int IDA_BUTTON_NEXT_FORM; + static const int IDA_FORMAT_ICON; + static const int IDA_FORMAT_TITLE; + static const int IDA_FORMAT_URL; + static const int IDA_SELECT_ALL_CHECKED; + static const int IDA_SELECT_ALL_UNCHECKED; + static const int IDA_DELETE_HISTORY; + static const int IDA_CANCEL; + + private: + bool __isNoHistoryPresent; + Tizen::Base::Collection::ArrayList* __pGroupData; + Tizen::Base::Runtime::Timer* __pTimer; + Tizen::Ui::Controls::GroupedListView* __pListView; // The GroupedListView which contains the history lists + + Tizen::Ui::Controls::CheckButton* __pSelectAllCheck; + Tizen::Ui::Controls::Label* __pSelectedLabel; + int __selectedCount; + + class GroupItemClass + :public Tizen::Base::Object + { + public: + GroupItemClass() { __pData = NULL ; } + ~GroupItemClass(){ if(__pData!=null) __pData->RemoveAll(true); delete __pData; __pData = null;} + GroupItemClass(const GroupItemClass& groupItem){__pData = groupItem.__pData; } + GroupItemClass& operator =(const GroupItemClass& groupItem){if (this != &groupItem) __pData = groupItem.__pData; return *this;} + public: + Tizen::Base::DateTime __endTime; + Tizen::Base::Collection::ArrayList* __pData; + Tizen::Base::DateTime __startTime; + Tizen::Base::String __titleText; + + }; + }; + +#endif /* _INT_EDIT_HISTORY_LIST_FORM_H_ */ diff --git a/inc/IntEditHomePageForm.h b/inc/IntEditHomePageForm.h new file mode 100644 index 0000000..1a8d8b7 --- /dev/null +++ b/inc/IntEditHomePageForm.h @@ -0,0 +1,114 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet EditHomePageScene class +/*@file: EditHomePageScene.h + *@brief: Allow user to set any page as Home page. + * + */ + +#ifndef _INT_EDIT_HOME_PAGE_FORM_H_ +#define _INT_EDIT_HOME_PAGE_FORM_H_ + +#include +#include +#include +#include +#include + +class EditHomePageForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::ITextEventListener +{ +public: + /** + *@brief Default constructor + */ + EditHomePageForm(void); + + /** + * Default destructor + */ + virtual ~EditHomePageForm(void); + + /** + * @brief Shows alert message. + */ + void CreateMessage(Tizen::Base::String& str); + + /** + *@brief Constructing and Initializing EditHomePageScene + */ + bool Initialize(void); + +public: + /** + *brief Used to create instances and set styles for the form content. + */ + virtual result OnInitializing(void); + + /** + *brief Called on terminate of a form + */ + virtual result OnTerminating(void); + + // IActionEventListener + /** + *brief Called when an action event occurs. + */ + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + + // IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + // ISceneEventListener + + /** + *brief Called after setting as current scene. + */ + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + + /** + *brief Called when the current scene is deactivated. + */ + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + // ITextEventListener + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + + // IOrientationEventListener + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + +protected: + static const int IDA_BUTTON_DONE; + static const int IDA_BUTTON_CANCEL; + +private: + int __modalMsgBoxResult; + Tizen::Ui::Controls::MessageBox* __pMsgBox; // Message Box to display alert if folder with same name already exists + Tizen::Ui::Controls::EditField* __pUrlEditField; +}; + + + +#endif /* _INT_EDIT_HOME_PAGE_FORM_H_ */ diff --git a/inc/IntFaviconManager.h b/inc/IntFaviconManager.h new file mode 100644 index 0000000..03694fc --- /dev/null +++ b/inc/IntFaviconManager.h @@ -0,0 +1,137 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntFaviconManager.h + *@brief: This is the header file for FaviconManager class + */ + + +#ifndef _FAVICON_MANAGER_H +#define _FAVICON_MANAGER_H + +#include +#include +#include +#include +#include +#include + +#include "IntTypes.h" +#include "IntPresentationModelBase.h" + +/** + * @class FaviconManager + * @brief This class declares functions which will manage Favicon + */ +class FaviconManager +:public PresentationModelBase + { + +public: + /** + * @brief The method used to get the already created instance of the FaviconManager + */ + static FaviconManager* GetInstance(void); + + /** + * This function selects the favicons from the table + * + * @return A Bitmap Pointer + * @param no parameters + */ + Tizen::Graphics::Bitmap* GetDefaultFaviconN(void); + + /** + * This function selects the favicons from the table + * + * @return A Bitmap Pointer + * @param ID the Favicon ID + */ + Tizen::Graphics::Bitmap* GetFaviconN(Tizen::Base::String& ID); + + /** + * This function adds the favicons to the Favicon table + * + * @return String Type + * @param bitmap The bitmap for favicon + * @param URL The URL for the corresponding favicon + */ + Tizen::Base::String SaveFavicon(Tizen::Graphics::Bitmap& bitmap, Tizen::Base::String& URL); + + +private: + /** + * @brief The Default Constructor + */ + FaviconManager(void); + + /** + * @brief The Default Destructor + */ + ~FaviconManager(void); + + /** + * copy constructor + */ + FaviconManager(const FaviconManager& settingModelObj); + + /** + * assignment operator + */ + + FaviconManager& operator=(const FaviconManager& settingModelObj); + + /** + *@brief Initialize storage service + */ + result Construct(void); + + /** + * @brief The method used to create the instance of the SettingsManager class + */ + static void CreateInstance(void); + + /** + * @brief The method used to remove the already created instance of the SettingsManager + */ + static void DestroyInstance(void); + + /** + * This function generates the filename + * + * @return Filename + * @param none + */ + Tizen::Base::String GenerateFileName(void); + + /** + * This function generates the filename + * + * @return void + * @param bitmap The bitmap + * filePath The path where bitmap is supposed to be saved + */ + void SaveBitmapToFile(Tizen::Graphics::Bitmap& bitmap, Tizen::Base::String& filePath); + + +private: + static Tizen::Graphics::Bitmap* __pDefaultBitmap; + static FaviconManager* __pFaviconManagerInstance; + }; + +#endif // _FAVICON_MANAGER_H diff --git a/inc/IntFontManager.h b/inc/IntFontManager.h new file mode 100644 index 0000000..a4ac136 --- /dev/null +++ b/inc/IntFontManager.h @@ -0,0 +1,115 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: FontManager.h + *@brief: This header file contains the declarations of the %FontManager class. + */ + +#ifndef _INT_FONT_MANAGER_H_ +#define _INT_FONT_MANAGER_H_ + +#include +#include + + +/** +* @enum FontId +* +* Defines a ID for a different font size +* +*/ +enum FontId +{ + FONT_INVALID = -1, + + FONT_GT34 = 0, + FONT_GT32, + FONT_GT30, + FONT_GT26, + FONT_GT20, + FONT_GT14, + + FONT_GP40, + FONT_GP38, + FONT_GP36, + FONT_GP34, + FONT_GP30, + FONT_GP26, + FONT_GP24, + FONT_GP18, + + FONT_GS30, + FONT_GS34, + + MAX_FONT +}; + +/** +* @struct FontTable +* +* Defines a table for text fontName, fontStyle and fontSize +* +*/ +struct FontTable +{ + Tizen::Graphics::Font* pInstance; + Tizen::Base::String fontName; + int fontStyle; + int fontSize; +}; + +/** + * @class FontManager + * @brief This class declares functions which can change text font properties + */ +class FontManager +{ +public: + /** + * Gets the font using fontValue + * + * @return * This header file contains the declarations of the %FontManager class. + * + * pointer to a font value + * @param[in] fontValue The ID of the font + * @remarks To work properly, the existing fontValue has to be passed. + */ + static Tizen::Graphics::Font* GetFont(FontId fontValue); + + /** + * Release all the created fonts + * + * @return no return value + * @param[in] no input parameters + */ + static void ReleaseFonts(void); + +private: + /** + * Creates a font using fontValue + * + * @return no return value + * @param[in] fontValue The ID of the font + * @remarks To work properly, the existing fontValue has to be passed. + */ + static void CreateFont(FontId fontValue); + +}; + + +#endif //_INT_FONT_MANAGER_H_ diff --git a/inc/IntFormFactory.h b/inc/IntFormFactory.h new file mode 100644 index 0000000..b6867e0 --- /dev/null +++ b/inc/IntFormFactory.h @@ -0,0 +1,77 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntFormFactory.h + *@brief: FormFactory class helps in creating appropriate forms with a specified form ID. + * It Should be derived from Tizen::Ui::Scenes::IFormFactory class + */ + + +#ifndef _INT_SCENE_FACTORY_H_ +#define _INT_SCENE_FACTORY_H_ + +#include + +/// Use 'extern' to eliminate duplicate data allocation. +extern const wchar_t* IDL_FORM_MAIN_VIEW_SCENE; +extern const wchar_t* IDL_FORM_HISTORY_LIST_SCENE; +extern const wchar_t* IDL_FORM_FIND_WORD_SCENE; +extern const wchar_t* IDL_FORM_EDIT_HISTORY_LIST_SCENE; +extern const wchar_t* IDL_FORM_SETTINGS_CLEAR_PRIVATE_DATA_SCENE; +extern const wchar_t* IDL_FORM_MULTIPLE_WINDOW_SCENE; +extern const wchar_t* IDL_FORM_MULTIPLE_WINDOW_GRID_SCENE; +extern const wchar_t* IDL_FORM_SETTINGS_SCENE; +extern const wchar_t* IDL_FORM_ADD_BOOKMARK_SCENE; +extern const wchar_t* IDL_FORM_BOOKMARK_LIST_SCENE; +extern const wchar_t* IDL_FORM_ARTICLE_READER_SCENE; +extern const wchar_t* IDL_FORM_EDIT_BOOKMARK_LIST_SCENE; +extern const wchar_t* IDL_FORM_CREATE_BOOKMARK_FOLDER_SCENE; +extern const wchar_t* IDL_FORM_FONT_SIZE_SCENE; +extern const wchar_t* IDL_FORM_EDIT_HOME_PAGE_SCENE; +extern const wchar_t* IDL_FORM_BRIGHTNESS_SCENE; + +/** + * @class FormFactory + * @brief FormFactory class helps in creating appropriate forms with a specified form ID. + * It Should be derived from Tizen::Ui::Scenes::IFormFactory class + */ +class FormFactory + : public Tizen::Ui::Scenes::IFormFactory +{ +public: + /** + * Default constructor + */ + FormFactory(void); + /** + * Default destructor + */ + virtual ~FormFactory(void); + + /** + * Called with a form ID and scene ID when an instance of Form control is required. + * + * @return Pointer to a form + * @param[in] formId The ID of the form + * @param[in] sceneId The ID of the scene + * @remarks To work properly, the existing formId and sceneId has to be passed. + */ + virtual Tizen::Ui::Controls::Form* CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _INT_SCENE_FACTORY_H_ diff --git a/inc/IntHistoryData.h b/inc/IntHistoryData.h new file mode 100644 index 0000000..32f3e28 --- /dev/null +++ b/inc/IntHistoryData.h @@ -0,0 +1,232 @@ +// + +// Copyright (c) 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://floralicense.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. +// + + +/** + * Internet + * @file IntHistory.h + * @brief This is a model class which contains all the properties of History class + * and the methods to get and set the values for those properties + * + * This header file contains the declarations of the History class. + */ +#ifndef _INT_HISTORY_DATA_H_ +#define _INT_HISTORY_DATA_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class History + : public Tizen::Base::Object +{ +public: + /** + * Default constructor + */ + History(void); + + /** + * Initialises the instance the class History with the specified parameter + */ + History(const History& hs); + + /** + * Default destructor + */ + ~History(void); + + /** + * "=" operator overloading + */ + History& operator =(const History& pHistory); + + /** + * This function is used to get the bookmark id + * + * @return bookmarkID + * @param No parameter + */ + Tizen::Base::String GetBookmarkId(void) const; + + /** + * This function gets the FaviconId + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetFaviconId(void) const; + + /** + * This function gets the HistoryId + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetHistoryId(void) const; + + /** + * This function gets the path of the favicon of URL + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetHistoryIconPath(void) const; + + /** + * This function gets the HistoryTitle + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetHistoryTitle(void) const; + /** + * This function gets the URL + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetHistoryUrl(void) const; + + /* + * This function is used to get thumbnail + * + * @return thumbnail + * @param No parameter + */ + Tizen::Graphics::Bitmap* GetThumbnail(void) const; + + Tizen::Base::String GetThumbnailPath(void) const; + + /** + * This function is used to get visited count + * + * @return visited count + * @param No parameter + */ + int GetVisitedCount(void) const; + + /** + * This function gets the visited time for the History + * + * @return DateTime + * @param No parameter + */ + Tizen::Base::DateTime GetVisitedTime(void) const; + + /** + * This function sets history to bookmark or removes the history from bookmarks + * + * @return No return type + * @param isBookmark true to add to bookmark, false to remove from bookmark + */ + void SetBookmarkId(const Tizen::Base::String& bookmarkId); + + /** + * This function sets the faviconid + * + * @return No return type + * @param strFaviconId The ID for the favicon object + */ + void SetFaviconId(const Tizen::Base::String& strFaviconId); + + /** + * This function sets the HistoryId for the History object + * + * @return No return type + * @param strHistoryId The ID for the History object + */ + void SetHistoryId(const Tizen::Base::String& strHistoryId); + + /** + * This function sets the HistoryTitle for the History object + * + * @return No return type + * @param strTitle The Title for the History object + */ + void SetHistoryTitle(Tizen::Base::String& strHistoryTitle); + + /** + * This function sets the URL for the History object + * + * @return No return type + * @param strTitle The URL for the History object + */ + void SetHistoryUrl(const Tizen::Base::String& strHistoryUrl); + + /** + * This function sets the path for the favicon of the History object + * + * @return No return type + * @param strFilePath The path for the favicon icon of History + */ + void SetIconPath(const Tizen::Base::String& strFilePath); + + /** + * This function sets thumbnail of a URL + * + * @return No return type + * @param thumbnail to set thumbnail of URL + */ + void SetThumbnail(Tizen::Graphics::Bitmap* thumbnail); + + /** + * This function sets thumbnail path of a URL + * + * @return No return type + * @param thumbnailPath to set thumbnail path of URL + */ + void SetThumbnailPath(Tizen::Base::String& thumbnailPath); + + /** + * This function sets the createdTime for the History object + * + * @return No return type + * @param strCreatedTime The createdTime for the bookmark + */ + void SetVisitedTime(const Tizen::Base::DateTime& strVisitedTime); + + + /** + * This function sets visited count of a URL + * + * @return No return type + * @param visitedCount to set visited count of URL + */ + void SetVisitedCount(int& visitedCount); + +private: + Tizen::Base::String __bookmarkId; + Tizen::Base::String __faviconId; + Tizen::Base::String __historyId; + Tizen::Base::String __historyTitle; + Tizen::Base::String __historyUrl; + Tizen::Base::String __iconPath; + Tizen::Base::String __thumbnailPath; + Tizen::Graphics::Bitmap* __pThumbnail; + int __visitedCount; + Tizen::Base::DateTime __visitedTime; +}; + +#endif //_INT_HISTORY_DATA_H_ diff --git a/inc/IntHistoryListForm.h b/inc/IntHistoryListForm.h new file mode 100644 index 0000000..6be792c --- /dev/null +++ b/inc/IntHistoryListForm.h @@ -0,0 +1,215 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet HistoryListForm class +/*@file: HistoryListForm.h + *@brief: This class defines HistoryListForm used define history + * + */ + +#ifndef _INT_HISTORY_LIST_FORM_H_ +#define _INT_HISTORY_LIST_FORM_H_ + +#include +#include + +/** + * @class HistoryListForm + * @brief This class declares functions which displays history of browsed items, also one can search for items + */ +class HistoryListForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemProvider + , public Tizen::Ui::Controls::IGroupedListViewItemEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Controls::ISearchBarEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + /** + * @brief The Default Constructor + */ + HistoryListForm(void); + /** + * @brief The Default Destructor + */ + virtual ~HistoryListForm(void); + + /** + * @brief Initializes this HistoryListForm. + */ + bool Initialize(void); + + /** + * @brief creates group items and store them in arraylist for later use. + */ + void CreateGroupItems(void); + + /** + * @brief converts the integer value of month to string value for that corresponding month. + */ + Tizen::Base::String GetMonth(int month); + + // IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //IGroupedListViewItemEventListener + void OnGroupedListViewContextItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + void OnGroupedListViewItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListItemStatus status); + void OnGroupedListViewItemSwept(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, Tizen::Ui::Controls::SweepDirection direction); + + /** + * brief Initializes the controls of the UI for HistoryListForm. + */ + virtual result OnInitializing(void); + + virtual result OnTerminating(void); + + //IOrientationEventListener + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + //IGroupedListViewItemProvider + Tizen::Ui::Controls::GroupItem* CreateGroupItem(int groupIndex, int itemWidth); + Tizen::Ui::Controls::ListItemBase* CreateItem(int groupIndex, int itemIndex, int itemWidth); + bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::GroupItem* pItem, int itemWidth); + bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + int GetGroupCount(void); + int GetItemCount(int groupIndex); + + //IKeypadEventListener + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction); + + //ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + //ISearchBarEventListener + virtual void OnSearchBarModeChanged(Tizen::Ui::Controls::SearchBar& source, Tizen::Ui::Controls::SearchBarMode mode); + + +protected: + static const int IDA_TABBAR_ITEM_1; + static const int IDA_TABBAR_ITEM_2; + static const int IDA_EDIT_HISTORY_LIST_FORM; + static const int IDA_FORMAT_ICON; + static const int IDA_FORMAT_TITLE; + static const int IDA_FORMAT_URL; + static const int IDA_FORMAT_BOOKMARK; + +private: + bool __isNoHistoryPresent; + Tizen::Base::Collection::ArrayList* __pGroupData; + Tizen::Ui::Controls::GroupedListView* __pGroupedListView; // The GroupedListView which contains the history lists + Tizen::Ui::Controls::SearchBar* __pSearchBar; + Tizen::Base::Collection::ArrayList* __pSearchedData; + Tizen::Ui::Controls::GroupedListView* __pSearchListView; // The GroupedListView which contains the Search history lists + bool __searchHistory; +}; + +/** + * @class GroupItemClass + * @brief This class helps in storing group item data + */ +class GroupItemClass + :public Tizen::Base::Object +{ +private: + Tizen::Base::DateTime __startTime; + Tizen::Base::DateTime __endTime; + Tizen::Base::String __titleText; + Tizen::Base::Collection::ArrayList* __pData; + +public: + GroupItemClass(void); + ~GroupItemClass(void); + GroupItemClass(const GroupItemClass& groupItem); + GroupItemClass& operator =(const GroupItemClass& groupItem); + /** + * This function gets the GetEndTime of History + * + * @return A DateTime + * @param No parameter + */ + Tizen::Base::DateTime GetEndTime(void); + + /** + * This function gets the GetHistoryData of History + * + * @return A Pointer to ArrayList + * @param No parameter + */ + Tizen::Base::Collection::ArrayList* GetHistoryData(void); + + /** + * This function gets the GetStartTime of History + * + * @return A DateTime + * @param No parameter + */ + Tizen::Base::DateTime GetStartTime(void); + + /** + * This function gets the GetTitleText of History + * + * @return A String + * @param No parameter + */ + Tizen::Base::String GetTitleText(void); + + /** + * This function sets the StartTime for the History object + * + * @return No return type + * @param startTime The StartTime for the History + */ + void SetStartTime(Tizen::Base::DateTime& startTime); + + /** + * This function sets the endTime for the History object + * + * @return No return type + * @param endTime The endTime for the History + */ + void SetEndTime(Tizen::Base::DateTime& endTime); + + /** + * This function sets the titleText for the History object + * + * @return No return type + * @param titleText The titleText for the History + */ + void SetTitleText(Tizen::Base::String& titleText); + + /** + * This function sets the data for the History object + * + * @return No return type + * @param pData The data for the History + */ + void SetHistoryData(Tizen::Base::Collection::ArrayList* pData); + +}; +#endif /* _INT_HISTORY_LIST_FORM_H_ */ diff --git a/inc/IntHistoryPresentationModel.h b/inc/IntHistoryPresentationModel.h new file mode 100644 index 0000000..d0732d7 --- /dev/null +++ b/inc/IntHistoryPresentationModel.h @@ -0,0 +1,248 @@ +// + +// Copyright (c) 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://floralicense.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. +// + + +//!Internet +/*@file: IntHistoryPresentationModel.h + *@brief: This is the header file for HistoryPresentationModel class + */ + + +#ifndef _INT_HISTORY_PRESENTATION_MODEL_H +#define _INT_HISTORY_PRESENTATION_MODEL_H + +#include +#include +#include + + +#include "IntHistoryData.h" +#include "IntPresentationModelBase.h" +#include "IntTypes.h" + +enum { + HISTORY_ID = 0, + HISTORY_TITLE, + HISTORY_URL, + HISTORY_VISITED_TIME, + HISTORY_ICON_PATH, + HISTORY_FAVICONID, + HISTORY_THUMBNAIL, + HISTORY_BOOKMARK_ID, + HISTORY_VISITED_COUNT +}; + +/** + * @class HistoryPresentationModel + * @brief This class declares functions which will manage Browser History + */ +class HistoryPresentationModel + :public PresentationModelBase +{ +public: + /** + * @brief The method used to get the already created instance of the HistoryPresentationModel + */ + static HistoryPresentationModel* GetInstance(void); + + /** + * This function deletes all the histories. + * + * @return An error code + * @param No parameter + */ + result ClearHistory(void); + + /** + * This function creates the list of History + * + * @return An error code + * @param nHistoryCount The no of History present + * @param historyList An ArrayList where the History will be stored + * @param maxCount is used for maximum most visited site else its value is default to -1 + * @exception E_SUCCESS The method is successful + * @exception E_FAILURE The method is not successful as the list is not being created + * @remarks To work properly , the history count and and existing list should be passed + */ + result CreateHistoryList(int nHistoryCount, Tizen::Base::Collection::ArrayList& historyList, int maxCount = -1); + + /** + * This function deletes particular history of history ID from the history table + * + * @return An error code + * @param historyId The historyId + * @exception E_SUCCESS The history is successfully deleted + * @exception E_FAILURE The history deletion is unsuccessful + */ + result DeleteHistory(int historyId); + + /** + * This function deletes particular history of history URL. + * + * @return An error code + * @param No parameter + */ + result DeleteHistory(Tizen::Base::String& historyUrl); + + /** + * This function deletes Multiple histories from the history table + * + * @return An error code + * @param pHistoryIdList The Arraylist of ids of history to be deleted + * @exception E_SUCCESS The history is successfully deleted + * @exception E_FAILURE The history deletion is unsuccessful + */ + result DeleteMultipleHistory(Tizen::Base::Collection::ArrayList* pHistoryIdList); + + /** + * This function adds the history to the history table + * + * @return An error code + * @param history The history + * @exception E_SUCCESS The history is inserted successfully to the table + * @exception E_FAILURE The history is not inserted successfully + */ + result SaveHistory(History& history); + + /** + * This function selects the history from the table + * + * @return An error code + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param historyList The arraylist where the selected history will be saved + */ + result GetHistory( int startIndex, int limit, Tizen::Base::Collection::ArrayList& historyList); + + /** + * This function returns the no of history + * + * @return An error code + * @param count The no of History present will be saved in count. + */ + result GetHistoryCount(int& count); + + /** + * This function returns the history count from the table on the basis of the time range + * + * @return An error code + * @param startTime the startTime + * @param endTime the end time + */ + result GetHistoryCountWithTimeRange(Tizen::Base::DateTime& startTime, Tizen::Base::DateTime& endTime, int& count); + + /** + * This function selects the history from the table within given time range + * + * @return An error code + * @param startTime start value of time + * @param endTime end value of time + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param historyList The arraylist where the selected history will be saved + */ + result GetHistoryWithTimeRange(Tizen::Base::DateTime& startTime, Tizen::Base::DateTime& endTime,int startIndex,int limit, Tizen::Base::Collection::ArrayList& pHistoryList); + + /** + * This function used to get most visited site in a arraylist + * + * @return An error code + * @param historyList The arraylist where the most visited sites will be saved. + */ + result GetMostVisitedSites(Tizen::Base::Collection::ArrayList& historyList); + + /** + * This function returns the no of searched text history + * + * @return An error code + * @param count The no of History present will be saved in count. + * @param text text entered for search + */ + result GetSearchHistoryCount(int& count, Tizen::Base::String& text); + + /** + * This function selects the searched history from the table + * + * @return An error code + * @param startIndex the OFFSET value + * @param limit The LIMIT till which the select statement will be executed + * @param text text entered for search + * @param historyList The arraylist where the selected history will be saved + */ + result GetSearchHistory(int startIndex,int limit, Tizen::Base::Collection::ArrayList& historyList, Tizen::Base::String& text); + + /** + * This function used to given URL count + * + * @return An error code + * @param url URL to get its count + * @param count count of a URL + */ + result GetUrlCount(const Tizen::Base::String& url, int& count); + +private: + + /** + * @brief The Default Constructor + */ + HistoryPresentationModel(void); + + /** + * @brief The Default Destructor + */ + ~HistoryPresentationModel(void); + + /** + * copy constructor + */ + HistoryPresentationModel(const HistoryPresentationModel& settingModelObj); + + /** + * assignment operator + */ + + HistoryPresentationModel& operator=(const HistoryPresentationModel& settingModelObj); + + /** + *@brief Initialize storage service + */ + result Construct(void); + + /** + * @brief The method used to create the instance of the SettingsManager class + */ + static void CreateInstance(void); + + /** + * @brief The method used to remove the already created instance of the SettingsManager + */ + static void DestroyInstance(void); + + /** + * This function is used to generate file name + * + * @return filename name of a file + * @param No parameter + */ + Tizen::Base::String GenerateFileName(void); + + Tizen::Base::String GetStringFromDate(Tizen::Base::DateTime& date); + + static HistoryPresentationModel* __pHistoryPresentationModel; +}; + +#endif //_INT_HISTORY_PRESENTATION_MODEL_H diff --git a/inc/IntIAddressbarEventListener.h b/inc/IntIAddressbarEventListener.h new file mode 100644 index 0000000..03e9178 --- /dev/null +++ b/inc/IntIAddressbarEventListener.h @@ -0,0 +1,56 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet IntIAddressbarEventListener class +/*@file: IntIAddressbarEventListener.h + *@brief: The %IntIAddressbarEventListener interface is the listener interface for receiving the Addressbar events such as + * the event for clicking refresh,stop loading etc. + * + */ + +#ifndef _INT_IADDRESSBAR_EVENT_LISTENER_H_ +#define _INT_IADDRESSBAR_EVENT_LISTENER_H_ + +class Addressbar; + +/** + * @interface IAddressbarEventListener + * @brief This interface implements the listener for Addressbar Events. + * + * The %IAddressbarEventListener interface is the listener interface for receiving the Addressbar events such as + * the event for clicking refresh,stoThis class defines HistoryListScene used define historyp loading etc. + * + */ +class IAddressbarEventListener +{ +public: + virtual ~IAddressbarEventListener(void) {}; + virtual void OnAddressBarKeypadClosed(const Addressbar&) = 0; + virtual void OnAddressBarKeypadOpened(const Addressbar&) = 0; + virtual void OnAddressBarKeypadWillOpen(const Addressbar&) = 0; + virtual void OnAddressBarModeChanged(const Addressbar&) = 0; + virtual void OnAddressCancelledClicked(const Addressbar&) = 0; + virtual void OnBackClicked(const Addressbar&) = 0; + virtual void OnForwardClicked(const Addressbar&) = 0; + virtual void OnReaderClicked(const Addressbar&) = 0; + virtual void OnRefreshClicked(const Addressbar&) = 0; + virtual void OnStopClicked(Addressbar&) = 0; + virtual void OnUrlSubmitted(Addressbar&) = 0; +}; + + +#endif /* _INT_IADDRESSBAR_EVENT_LISTENER_H_ */ diff --git a/inc/IntISettingChangeListener.h b/inc/IntISettingChangeListener.h new file mode 100644 index 0000000..2403bdd --- /dev/null +++ b/inc/IntISettingChangeListener.h @@ -0,0 +1,46 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet ISettingsChangeEventListener class +/*@file: IntISettingsChangeEventListener.h + *@brief: The %IntISettingsChangeEventListener + * + */ + +#ifndef _INT_SETTINGS_CHANGE_LISTENER_H_ +#define _INT_SETTINGS_CHANGE_LISTENER_H_ + +/** + * @interface IntISettingsChangeListener + * @brief This interface implements the listener for Addressbar Events. + * + * The %IntIAddressbarEventListener interface is the listener interface for receiving the Addressbar events such as + * the event for clicking refresh,stoThis class defines HistoryListScene used define historyp loading etc. + * + */ +class ISettingChangeEventListener + : public Tizen::Base::Object +{ +public: + virtual ~ISettingChangeEventListener(void) {}; + virtual void OnClearCache(void) = 0; + virtual void OnClearCookie(void) = 0; + virtual void OnSettingsChange(int settingvalue) = 0; + virtual void OnSettingsReset(void) = 0; +}; + +#endif /* _INT_SETTINGS_CHANGE_LISTENER_H_ */ diff --git a/inc/IntInternetApp.h b/inc/IntInternetApp.h new file mode 100644 index 0000000..ab71cc9 --- /dev/null +++ b/inc/IntInternetApp.h @@ -0,0 +1,84 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: Internet.h + *@brief: provides basic features necessary to define an UiApp. + */ + +#ifndef _INT_INTERNET_APP_H_ +#define _INT_INTERNET_APP_H_ + +#include +#include +#include +#include + +#include "IntMultipleWindowPresentationModel.h" + +class InternetApp + : public Tizen::App::UiApp + , public Tizen::App::IAppControlProviderEventListener + , public Tizen::System::IScreenEventListener +{ +public: + /** + * UiApp must have a factory method that creates an instance of itself. + */ + static Tizen::App::UiApp* CreateInstance(void); + void ShowPopup(Tizen::Base::String& pTitle, Tizen::Base::String& pText); + +public: + /** + *@brief Default constructor + */ + InternetApp(void); + /** + *@brief Default destructor + */ + virtual ~InternetApp(void); + +public: + + bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + + bool OnAppInitialized(void); + + bool OnAppWillTerminate(void); + + bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + + void OnBackground(void); + + void OnBatteryLevelChanged(Tizen::System::BatteryLevel batteryLevel); + + void OnForeground(void); + + void OnLowMemory(void); + + void OnScreenOff(void); + + void OnScreenOn(void); + + //IAppControlProviderEventListener + void OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String &operationId, const Tizen::Base::String *pDataType, const Tizen::Base::String *pUriScheme, const Tizen::Base::Collection::IMap *pArgs); +private: + MultipleWindowPresentationModel* __pMultiWindowManager; + WindowInfo* __pNewWindowInfo;//the new window object to be created either by the normal launch of application or as an appcontrol launch +}; + +#endif // _INT_INTERNET_APP_H_ diff --git a/inc/IntMainForm.h b/inc/IntMainForm.h new file mode 100644 index 0000000..ebeee1e --- /dev/null +++ b/inc/IntMainForm.h @@ -0,0 +1,296 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet MainForm class +/*@file: MainForm.h + *@brief: The %MainForm provides the common functionalities for the Main View of the Browser including the addressbar, + * loading,handling events etc. + */ + +#ifndef _INT_MAIN_FORM_H_ +#define _INT_MAIN_FORM_H_ + +#include +#include +#include + +#include "IntAddressbar.h" +#include "IntHistoryData.h" +#include "IntHistoryPresentationModel.h" +#include "IntIAddressbarEventListener.h" +#include "IntISettingChangeListener.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSharePopup.h" + +class MainForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::IActionEventListener + , public IAddressbarEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Web::Controls::ILoadingListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public ISettingChangeEventListener + , public Tizen::Web::Controls::IWebKeypadEventListener + , public Tizen::Web::Controls::IWebUiEventListener + , public Tizen::Web::Controls::ITextSearchListener +{ +public: + /** + *@brief Default constructor + */ + MainForm(void); + + /** + *@brief Default destructor + */ + virtual ~MainForm(void); + + /** + * @brief The method initializes the screen variables and controls to be used by the user. + * + */ + bool Initialize(void); + + /** + * @brief Initializes this instance of %MainForm. + * + */ + result InitWebControl(); + + /** + * @brief Initializes this instance of Reader Panel. + */ + result CreateReaderPanel(void); + + Tizen::Base::String GetImagePath(void); + + void LoadUrl(Tizen::Base::String& url); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //IAddressbarEventListener + void OnAddressCancelledClicked(const Addressbar&); + + void OnAddressBarKeypadClosed(const Addressbar&); + + void OnAddressBarKeypadOpened(const Addressbar&); + + void OnAddressBarKeypadWillOpen(const Addressbar&); + + void OnAddressBarModeChanged(const Addressbar&); + + void OnBackClicked(const Addressbar&); + + void OnForwardClicked(const Addressbar&); + + void OnReaderClicked(const Addressbar&); + + void OnRefreshClicked(const Addressbar&){} + + void OnSearchClicked(const Addressbar&){} + + void OnStopClicked(Addressbar&); + + void OnUrlSubmitted(Addressbar&); + + //ILoadingeventListener + virtual void OnEstimatedProgress(int progress); + + virtual bool OnHttpAuthenticationRequestedN(const Tizen::Base::String& host, const Tizen::Base::String& realm, const Tizen::Web::Controls::AuthenticationChallenge& authentication); + + virtual void OnHttpAuthenticationCanceled(void); + + virtual result OnInitializing(void); + + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + + virtual void OnKeypadOpened(Tizen::Ui::Control& source){} + + virtual void OnKeypadClosed(Tizen::Ui::Control& source);; + + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction){} + + void OnLoadingErrorOccurred(Tizen::Web::Controls::LoadingErrorType error, const Tizen::Base::String& reason); + + virtual void OnLoadingStarted(void); + + virtual void OnLoadingCanceled(void); + + virtual void OnLoadingCompleted(void); + + bool OnLoadingRequested(const Tizen::Base::String& url, Tizen::Web::Controls::WebNavigationType type); + + virtual void OnPageTitleReceived(const Tizen::Base::String& title); + + virtual Tizen::Web::Controls::DecisionPolicy OnWebDataReceived(const Tizen::Base::String& mime, const Tizen::Net::Http::HttpHeader& httpHeader); + + //IOrientationEventListener + virtual void OnOrientationChanged (const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + //ISceenEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual result OnTerminating(void); + + void SetImageLoadEnabled(void); + + void SetJavascriptEnabled(void); + + // IListViewItemEventListener + /** + *Called when the state of an element in the ListContextItem is changed. + */ + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + + /** + *Called when the state of an element in the ListViewItem in the ListView or GroupedListView is changed. + */ + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + + /** + *Called when the ListItem is swept. + */ + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + + /** + *Called when the item or the element is long pressed. + */ + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback){}; + + + //IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase * CreateItem (int index, int itemWidth); + virtual bool DeleteItem (int index, Tizen::Ui::Controls::ListItemBase *pItem, int itemWidth); + virtual int GetItemCount (void); + + //IWebUiEventListener + virtual void OnWebPageBlockSelected(Tizen::Web::Controls::Web& source, Tizen::Graphics::Point& startPoint, Tizen::Graphics::Point& endPoint); + virtual void OnWebPageShowRequested(Tizen::Web::Controls::Web& source); + virtual Tizen::Web::Controls::Web* OnWebWindowCreateRequested(void); + virtual void OnWebWindowCloseRequested(Tizen::Web::Controls::Web& source) {AppLog("acdaqsc");} + + //IWebKeypadEventListener + virtual void OnWebKeypadClosed(Tizen::Web::Controls::Web& source); + virtual void OnWebKeypadOpened(Tizen::Web::Controls::Web& source); + virtual void OnWebKeypadWillOpen(Tizen::Web::Controls::Web& source); + + //ITouchEventListener + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual void OnTextFound(int totalCount, int currentOrdinal); + + //ISettingsChangeListener + void OnClearCache(void); + void OnClearCookie(void); + void OnSettingsChange(int settingvalue); + void OnSettingsReset(void); + + virtual void OnTextValueChangeCanceled (const Tizen::Ui::Control &source){} + virtual void OnTextValueChanged (const Tizen::Ui::Control &source); + + void UpdateImageContent(Tizen::Base::ByteBuffer* aBuffer, Tizen::Base::String imageName); +private: + double findDistance(int x1,int y1,int x2, int y2); + void FindNextWord(bool next = true); + result InitAddressbar(void); + result InitFooter(void); + result InitContextMenu(Tizen::Graphics::Point& p); + result InitFindWordPanel(void); + result InitImageContextMenu(Tizen::Graphics::Point p); + result InitSelectTextContextMenu(Tizen::Graphics::Point p, bool pasteOption, bool onlyPasteOption); + result InitMostVisitedSitesPanel(Tizen::Ui::OrientationStatus orientationStatus); + result InitMostVisitedSitesView(Tizen::Ui::OrientationStatus orientationStatus); + void MoveUiControls(void); + void UpdateFavicon(void); + void RelayoutControls(bool showAddressbar); + void ShowFindWordPanel(bool show = true, bool isTouchPressed = false); + void ShowMostVisitedSitesPanel(void); + void StartWordSearch(); + +private: + + static const int IDA_FORMAT_BITMAP; + static const int IDA_FORMAT_DELETE_BITMAP; + static const int IDA_FORMAT_TITLE_STRING; + static const int IDA_FORMAT_URL_STRING; + static const int IDA_CONTEXT_ITEM_DELETE; + + Tizen::Graphics::Point __adressPanelPosition; + AddressBarMode __curAddressBarMode; + Tizen::Base::String __currentSearchStr; + Tizen::Base::String __currentSelectedStr; + int __distanceMoved; + int __webControlHeight; + float __previousZoomLevel; + int __maxOccurrances; + int __currentWordIndex; + bool __isLoaded; + bool __inputEventToBeSupressed; + Addressbar* __pAddressbar; + Tizen::Ui::Controls::Label* __pArticleReaderLabel; + Tizen::Ui::Controls::Panel* __pArticleReaderPanel; + Tizen::Ui::Controls::Panel* __pBlankPanel; + Tizen::Ui::Controls::Label * __pFindWordBgLabel; + Tizen::Ui::Controls::Button* __pFindWordClear; + Tizen::Ui::Controls::Label* __pFindWordCountLabel; + Tizen::Ui::Controls::Panel* __pFindWordControl; + Tizen::Ui::Controls::EditField* __pFindWordEditField; + Tizen::Ui::Controls::Button* __pFindWordNext; + Tizen::Ui::Controls::Button* __pFindWordPrev; + Tizen::Ui::Controls::Panel* __pFindWordPanel; + Tizen::Ui::Controls::Panel* __pFooterPanel; + Tizen::Web::Controls::HitElementResult* __pHitElementResult; + Tizen::Ui::Controls::ContextMenu* __pImageMenu; + Tizen::Ui::Controls::ContextMenu* __pMenu; + Tizen::Ui::Controls::Button* __pMoreButton; + Tizen::Ui::Controls::Button* __pMultiWindowButton; + Tizen::Ui::Controls::Button* __pNewWindowButton; + SharePopup* __pPopUp; + AddressBarMode __prevAddressBarMode; + Tizen::Ui::Controls::Button* __pReaderCloseBtn; + Tizen::Base::String* __pReaderData; + Tizen::Media::Image* __pSaveImage; + Tizen::Web::Controls::Web* __pWebReader; + Tizen::Web::Controls::Web* __pWebViewer; + WindowInfo* __pWindowInfo; + Tizen::Ui::Controls::ListView* __pMostVisitedListView; + + Tizen::Graphics::Point __touchPoint1; + Tizen::Graphics::Point __touchPoint2; + Tizen::Graphics::Point __webControlPosition; + + Tizen::Ui::Controls::ListContextItem* __pItemContext; + Tizen::Base::Collection::ArrayList* __pMostVisitedSites; +}; + +#endif //_INT_MAIN_FORM_H_ diff --git a/inc/IntMainFrame.h b/inc/IntMainFrame.h new file mode 100644 index 0000000..f5ee7d3 --- /dev/null +++ b/inc/IntMainFrame.h @@ -0,0 +1,45 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet InternetFrame class +/*@file: InternetFrame.h + *@brief: Internet Frame + */ + +#ifndef _INT_INTERNET_FRAME_H_ +#define _INT_INTERNET_FRAME_H_ + +#include +#include + +class MainFrame + : public Tizen::Ui::Controls::Frame +{ +public: + /** + *@brief Default constructor + */ + MainFrame(void); + /** + *@brief Default destructor + */ + virtual ~MainFrame(void); + virtual result OnInitializing(void); + virtual result OnTerminating(void); +}; + +#endif //_INT_INTERNET_FRAME_H_ diff --git a/inc/IntMultipleWindowForm.h b/inc/IntMultipleWindowForm.h new file mode 100644 index 0000000..fd0d47b --- /dev/null +++ b/inc/IntMultipleWindowForm.h @@ -0,0 +1,160 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntMultipleWindowForm.h + *@brief: The IntMultipleWindowForm provides multiple instance of mainscenes and displays them in a Listview + * + */ + +#ifndef _INT_MULTIPLE_WINDOW_FORM_H_ +#define _INT_MULTIPLE_WINDOW_FORM_H_ + +#include +#include +#include +#include +#include + +class MultipleWindowForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + +{ +public: + /** + *@brief Default constructor + */ + MultipleWindowForm(void); + + /** + *@brief Default destructor + */ + virtual ~MultipleWindowForm(void); + + /** + *@brief Constructing and Initializing MultipleWindowForm + */ + bool Initialize(void); + +public: + /** + *Used to create instances and set styles for the form content. + */ + virtual result OnInitializing(void); + + /** + *Called on terminate of a form + */ + virtual result OnTerminating(void); + + // ISceneEventListener + + /** + *Called after setting as current scene. + */ + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + + /** + *Called when the current scene is deactivated. + */ + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + // IFormBackEventListener + /** + *Called when the current Form control needs to be closed to revert back to the previous Form control. + */ + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + // IActionEventListener + /** + *Called when an action event occurs. + */ + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IListViewItemEventListener + /** + *Called when the state of an element in the ListContextItem is changed. + */ + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + + /** + *Called when the state of an element in the ListViewItem in the ListView or GroupedListView is changed. + */ + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + + /** + *Called when the ListItem is swept. + */ + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + + /** + *Called when the item or the element is long pressed. + */ + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + + //IListViewItemProvider + /** + *Called when items need to be loaded. + */ + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + + /** + *Called when items need to be loaded. + */ + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + /** + *Called when the IconListView is about to be drawn and requests the listener to set the number of total items. + */ + virtual int GetItemCount(void); + + //IOrientationEventListener + /** + *Called when an orientation event occurs. + */ + void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + +private: + static const int IDA_FORMAT_BITMAP = 500; + static const int IDA_FORMAT_DELETE_BITMAP = 501; + static const int IDA_FORMAT_TITLE_STRING = 502; + static const int IDA_FORMAT_URL_STRING = 503; + static const int IDA_BUTTON_NEW = 504; + static const int IDA_BUTTON_BACK = 505; + static const int IDA_BUTTON_CLOSEALL = 506; + static const int IDA_FORMAT_CUSTOM = 507; + + static const int IDA_CONFIRMATION_NO = 1000; + static const int IDA_CONFIRMATION_YES = 1001; + + // __pList Pointer to ListView + Tizen::Ui::Controls::ListView* __pList; + // __pListIconImage Pointer to Bitmap contains list icon image + Tizen::Graphics::Bitmap* __pListIconImage; + // __pListDeleteImage Pointer to Bitmap contains list delete image + Tizen::Graphics::Bitmap* __pListDeleteImage; + ConfirmationPopup* __pConfirmationPopup; + +}; + +#endif /* _INT_MULTIPLE_WINDOW_FORM_H_ */ diff --git a/inc/IntMultipleWindowPresentationModel.h b/inc/IntMultipleWindowPresentationModel.h new file mode 100644 index 0000000..1aefccd --- /dev/null +++ b/inc/IntMultipleWindowPresentationModel.h @@ -0,0 +1,226 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntMultipleWindowPresentationModel.h + *@brief: MultipleWindowPresentationModel is used to maintain browser window information + * + */ +#ifndef _INT_MULTIPLE_WINDOW_PRESENTATION_MODEL_H_ +#define _INT_MULTIPLE_WINDOW_PRESENTATION_MODEL_H_ + +#include +#include +#include +#include + +#include "IntFaviconManager.h" +#include "IntFormFactory.h" +#include "IntSceneRegister.h" + +enum Key +{ + SELECTED_SCENE_ID +}; +class MainForm; + +class WindowInfo +: public Tizen::Base::Object + { + public: + /** + * WindowInfo default constructor + */ + WindowInfo(); + + /** + * WindowInfo default destructor + */ + ~WindowInfo(); + + public: + Tizen::Base::String faviconUrl; + Tizen::Base::String faviconFilePath; + Tizen::Base::String formID; + int ID; + bool isAppcontrolTriggered; + bool isJavascriptInitiated; + Tizen::Base::String pageTitle; + Tizen::Base::String pageUrl; + Tizen::Web::Controls::Web* pCurrentWeb; + Tizen::Graphics::Bitmap* pFavicon; + static Tizen::Graphics::Bitmap* pFormCanvasBitmap; + Tizen::Graphics::Bitmap* pWebCanvasBitmap; + Tizen::Base::String sceneID; + private: + static int __windowId; + }; + +class MultipleWindowPresentationModel +{ +public: + + /** + * This method add the windowInfo object in ArrayList + * + * @return An error code + * @param[in] WindowInfo The windowInfo object to be added. + * @exception E_SUCCESS The method is successful. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @remarks This method performs a shallow copy. It adds just the pointer; not the element itself. + */ + result AddWindoInfo(WindowInfo* pWindowInfo); + + /** + *@name CreateNewMainViewScene + *@brief Create new instance of MainScene form + *@param[in] no input parameter + *@retval no return value + */ + WindowInfo* CreateNewMainViewScene(const Tizen::Base::String& Url = L"", bool isAppControlTriggered = false); + + /** + * To get active Window URL and title + * + * @return An error code + * @param title + * @param url + * @exception E_SUCCESS The method is successful. + */ + WindowInfo* GetActiveWindowInfo(void); + + /** + * This method returns the ArrayList object + * + * @return ArrayList* + * @param[in] void + * @remarks Return the ArrayList object + */ + Tizen::Base::Collection::ArrayList* GetAllWindowArrayList(void); + + /** + * To get current sceneID of Main Form + * + * @return An error code + * @param currentSceneID The Current Scene ID + * @exception E_SUCCESS The method is successful. + */ + void GetCurrentSceneId(Tizen::Base::String& currentSceneId); + + /** + * @brief The method used to get the already created instance of the MultipleWindowPresentationModel + */ + static MultipleWindowPresentationModel* GetInstance(void); + + /** + * Object is returned corresponding to its key value + * + * @return An error code + * @param[in] key The key of the object needed + * @param[in] Object A pointer to a pointer to an objec_t + * @exception E_SUCCESS The method is successful. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @remarks To work properly, existing key has to be passed + */ + result GetValue(Key key, Tizen::Base::Object**); + + /** + * To set current sceneID of Main Form + * + * @return An error code + * @param currentSceneID The Current Scene ID + * @exception E_SUCCESS The method is successful. + */ + void SetCurrentSceneID(const Tizen::Base::String& currentSceneID); + + /** + * Object is set corresponding to its key value + * + * @return An error code + * @param[in] key The key of the object to be set + * @param[in] Object A pointer to an object + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG A specified input parameter is invalid, or + * the comparer has failed to compare the keys. + * @exception E_OBJ_NOT_FOUND The specified @c key is not found in the map. + * @remarks To work properly, existing key and object has to be passed + */ + result SetValue(Key key, Tizen::Base::Object*); + + /** + * Uninitialize MultiWindowManager + * + * @return no return value + * @param[in] no input parameters + */ + void UnInitialize(void); +private: + + /** + * Default constructor, It is declared as private to make this class a singleton class + */ + MultipleWindowPresentationModel(void); + + /** + * Default destructor + */ + virtual ~MultipleWindowPresentationModel(void); + + /** + * copy constructor + */ + MultipleWindowPresentationModel(const MultipleWindowPresentationModel& multipleWindowModelObj); + + /** + * assignment operator + */ + + MultipleWindowPresentationModel& operator=(const MultipleWindowPresentationModel& multipleWindowModelObj); + + /** + * Initializing MultiWindowManager + * + * @return An error code + * @param[in] no input parameters + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG A specified input parameter is invalid, or + * the @c capacity or the @c loadFactor is negative. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + */ + + result Construct(void); + + /** + * @brief The method used to create the instance of the MultipleWindowPresentationModel class + */ + static void CreateInstance(void); + + /** + * @brief The method used to remove the already created instance of the MultipleWindowPresentationModel + */ + static void DestroyInstance(void); + + +private: + static Tizen::Base::String __currentSceneId; + static Tizen::Base::Collection::HashMapT< Key, Tizen::Base::Object* > __keyAndValues; + static Tizen::Base::Collection::ArrayList* __pAllWindowList; + static WindowInfo* __pCurWindowInfo; + static MultipleWindowPresentationModel* __pMultiWindowManager; +}; + +#endif // _INT_MULTIPLE_WINDOW_PRESENTATION_MODEL_H_ diff --git a/inc/IntNotificationPanel.h b/inc/IntNotificationPanel.h new file mode 100644 index 0000000..b5431a9 --- /dev/null +++ b/inc/IntNotificationPanel.h @@ -0,0 +1,81 @@ +// + +// Copyright (c) 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://floralicense.org/license/basic features necessary to define an UiApp. +// +// 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. +// + +// !Internet +/*@file: IntNotification.h + *@brief: This header file contains the declarations of the Notification + * + */ + +#ifndef _INT_NOTIFICATION_H_ +#define _INT_NOTIFICATION_H_ + +#include +#include +#include +#include "IntTypes.h" + +class NotificationPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Base::Runtime::ITimerEventListener + { + public: + /** + * @brief The Default Constructor + */ + NotificationPanel(Tizen::Ui::Controls::Form& aForm); + + /** + * @brief The Default Destructor + */ + ~NotificationPanel(void); + + // ITimerEventListener + void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + /** + * This function gets the Sets the __position (FooterPanelheight) + * + * @return No return type. + * @param int position. + */ + void SetPositionDiff(int pos); + + /** + * This function displays the Notification + * + * @return No return type. + * @param none. + */ + void ShowNotification(void); + + /** + * This function gets the Sets the text of the Notification + * + * @return No return type. + * @param message The Notification Message. + */ + void SetText(Tizen::Base::String& message); + + private: + Tizen::Ui::Controls::Form& __form; + Tizen::Ui::Controls::Label* __pLabel; + int __position; + Tizen::Base::Runtime::Timer* __pTimer; + }; + +#endif /* _INT_NOTIFICATION_H_ */ diff --git a/inc/IntPresentationModelBase.h b/inc/IntPresentationModelBase.h new file mode 100644 index 0000000..5b4f12e --- /dev/null +++ b/inc/IntPresentationModelBase.h @@ -0,0 +1,164 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntPresentationModelBase.h + *@brief: This is the header file for PresentationModelBase class + */ + + +#ifndef _INT_PRESENTATION_MODEL_BASE_H_ +#define _INT_PRESENTATION_MODEL_BASE_H_ + +#include +#include +#include + +#include "IntTypes.h" + +/** + * @class PresentationModelBase + * @brief This class declares functions which will manage database + */ +class PresentationModelBase +{ +public: + /** + * Default constructor + */ + PresentationModelBase(void); + + /** + * Default destructor + */ + ~PresentationModelBase(void); + + /** + * Initialize storage service + */ + static result Initialize(void); + + /** + * Deinitialize storage service + */ + static result UnInitialize(void); + +public: + + /** + * This function deletes the database + * + * @return An error code + * @param No parameter + * @exception E_SUCCESS The database closed successfully + * @exception E_FAILURE The database is not closed successfully + */ + static result CloseDb(void); + + static result CommitDb(void); + + /** + * This function creates the table in database + * + * @return An error code + * @param tableType The name of the table + * @exception E_SUCCESS The table is created successfully in database + * @exception E_FAILURE The table creation in database is not successful + */ + static result CreateDBTables(BrowserDbTableTypes tableType); + + /** + * This function drops the existing tables from database + * + * @return An error code + * @param No parameter + * @exception E_SUCCESS The table is dropped successfully from database + * @exception E_FAILURE The table drop is unsuccessful + */ + static result DropDBTables(void); + + static result DbIsNextRowPresent(bool& nextRowpresent); + + /** + * This function drops the existing tables from database + * + * @return An error code + * @param No parameter + * @exception E_SUCCESS The table is dropped successfully from database + * @exception E_FAILURE The table drop is unsuccessful + */ + static result ExecuteQuery(const Tizen::Base::String& pszFormatQuery, int& nRowCount); + + static result GetColumn(int nIndex, Tizen::Base::String& strVal); + + static result GetColumn(int nIndex, int& nIntVal); + + static result GetColumn(int nIndex, double& dblVal); + + static result GetColumn(int nIndex, Tizen::Base::DateTime& dtVal); + + static bool GetCurrentDateTime(Tizen::Base::DateTime& dt); + + /** + * This function gives the last inserted row id + * + * @return An error code + * @param tableName The name of the table + * @param rowId The rowId in which last inserted rowId will be saved. + * @exception E_SUCCESS The method is successful + * @exception E_FAILURE The method is not successful + * @remarks To work properly , the table name should be passed properly + */ + static result GetLastInsertedId(Tizen::Base::String& tableName, int& rowId); + + /** + * This function calls the CreateDBTables function for all the tables + * + * @return An error code + * @param No parameter + */ + static result InitializeDBTables(void); + + static result IsNullColumn(int nIndex, bool& isColumNull); + + /** + * This function creates the database and constructs it. + * + * @return An error code + * @param No parameter + * @exception E_SUCCESS The database created successfully + * @exception E_FAILURE The database creation is failed + */ + static result OpenDb(void); + + static result RollbackDb(void); + +public: + static Tizen::Base::String DB_FILE_PATH; + static const int MAX_DB_QUERY_SIZE; + static const int QUERY_TYPE_LENGTH; + +private: + static bool __isBeginTransaction; + + static Tizen::Io::Database* __pDataBase; + static Tizen::Io::DbEnumerator* __pDbEnum; + static Tizen::Io::DbStatement* __pDbStatement; + +}; + + #endif //_INT_PRESENTATION_MODEL_BASE_H_ diff --git a/inc/IntRadioCustomItem.h b/inc/IntRadioCustomItem.h new file mode 100644 index 0000000..74f48f8 --- /dev/null +++ b/inc/IntRadioCustomItem.h @@ -0,0 +1,114 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet RadioCustomItem class +/*@file: IntRadioCustomItem.h + *@brief: The %IntRadioCustomItem defines radio custom item. + * + */ + +#ifndef _INT_RADIO_CUSTOM_ITEM_H_ +#define _INT_RADIO_CUSTOM_ITEM_H_ + +#include +#include +#include "IntTypes.h" + +class RadioCustomItem + : public Tizen::Ui::Controls::CustomItem +{ +public: + /** + * @brief The Default Constructor + */ + RadioCustomItem(void); + + /** + * @brief The Default Destructor + */ + virtual ~RadioCustomItem(void); + + /** + * @brief Initializes this instance of %DropDownCustomItem. + * + * @return An error code + * @param[in] width The width of the Custom Item + * @param[in] height The height of the Custom Item + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result Construct(int width, int height); + + //getter and setter methods for Text + + /** + * @brief The method used to get the text of CustomItem + * @return An error code + */ + Tizen::Base::String GetText(void); + + /** + * @brief The method used to get selection state of the Radio Button + * @return True if selected or false if unselected + */ + bool GetSelected(void); + + + /** + * @brief Add all the required elements and create the Custom Item. + * + * @return An error code + * @param[in] void An instance of the Rectangle class @n + * This instance represents the x and y coordinates of the top-left corner of the created window along with + * the width and height of the window. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result Make(void); + + /** + * @brief The method used to set the text of CustomItem + * @return An error code + */ + void SetText(Tizen::Base::String& text); + + /** + * @brief The method used to set the selection state of the Radio Button + * @return void + */ + void SetSelected(bool selectedValue); + +protected: + static const int IDA_FORMAT_STRING; + static const int IDA_FORMAT_RADIO_BUTTON; + +private: + bool __isSelected; + int __height; ///Height of the SettingToggleCustomItem Instance + Tizen::Base::String __text; ///The Text for the Toggle Button + int __width; ///Width of the SettingToggleCustomItem Instance +}; + +#endif /* _INT_RADIO_CUSTOM_ITEM_H_ */ diff --git a/inc/IntReaderFontSizeForm.h b/inc/IntReaderFontSizeForm.h new file mode 100644 index 0000000..dc63274 --- /dev/null +++ b/inc/IntReaderFontSizeForm.h @@ -0,0 +1,89 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet IntFontSize class +/*@file: IntFontSize.h + *@brief: This class defines IntFontSize used to change the font size + * + */ + +#ifndef _INT_READER_FONT_SIZE_FORM_H_ +#define _INT_READER_FONT_SIZE_FORM_H_ + +#include +#include + +class ReaderFontSizeForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::Controls::ISliderEventListener +{ +public: + /** + * @brief The Default Constructor + */ + ReaderFontSizeForm(void); + + /** + * @brief The Default Destructor + */ + virtual ~ReaderFontSizeForm(void); + + /** + * @brief Initializes this IntFontSize Form. + * @return An error code + * @param[in] void + * @exception true The method is successful. + * @exception false An error occurred. + */ + bool Initialize(void); + + /** + * @brief Initializes the controls of the UI for IntFontSize. + * + * @return An error code + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result OnInitializing(void); + +protected: + //IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IFormBackEventListener + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //ISceenEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + //ISliderEventListener + virtual void OnSliderBarMoved(Tizen::Ui::Controls::Slider& source, int value); + +private: + Tizen::Ui::Controls::Slider* __pFontSlider; + Tizen::Base::Integer* __pFontValue; +}; + +#endif /* _INT_READER_FONT_SIZE_FORM_H_ */ diff --git a/inc/IntSceneRegister.h b/inc/IntSceneRegister.h new file mode 100644 index 0000000..f9176ba --- /dev/null +++ b/inc/IntSceneRegister.h @@ -0,0 +1,95 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntSceneRegister.h + *@brief: This header file contains the declarations of the %SceneRegister class. + * + */ + +#ifndef _INT_SCENE_REGISTER_H_ +#define _INT_SCENE_REGISTER_H_ + +/// Use 'extern' to eliminate duplicate data allocation. +extern const wchar_t* IDSCN_MAIN_VIEW; +extern const wchar_t* IDSCN_BOOKMARK_VIEW; +extern const wchar_t* IDSCN_HISTORY_LIST; +extern const wchar_t* IDSCN_FIND_WORD; +extern const wchar_t* IDSCN_EDIT_HISTORY_LIST; +extern const wchar_t* IDSCN_SETTINGS_CLEAR_PRIVATE_DATA; +extern const wchar_t* IDSCN_MULTIPLE_WINDOW; +extern const wchar_t* IDSCN_MULTIPLE_WINDOW_GRID; +extern const wchar_t* IDSCN_SETTINGS; +extern const wchar_t* IDSCN_ADD_BOOKMARK; +extern const wchar_t* IDSCN_ARTICLE_READER; +extern const wchar_t* IDSCN_EDIT_BOOKMARK_LIST; +extern const wchar_t* IDSCN_CREATE_BOOKMARK_FOLDER; +extern const wchar_t* IDSCN_FONT_SIZE; +extern const wchar_t* IDSCN_EDIT_HOMEPAGE_VIEW; +extern const wchar_t* IDSCN_BRIGHTNESS; + +class SceneRegister +{ +public: + /** + * Registers all the scenes using Register~SceneRegisterScene() method of the SceneManager class + * + */ + static void RegisterAllScenes(void); + + /** + * Registers New main view scene for multi window + * + * @return no return value + * @param[in] sceneID The sceneID of new view. + * @param[in] formID The formID of new View. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OBJ_ALREADY_EXIST The specified @c sceneId already exists. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_INVALID_STATE This instance has not been constructed as yet. + * @remarks Register the new main view in scenemanager. + */ + static result RegisterNewMainView(const Tizen::Base::String& sceneID, const Tizen::Base::String& FormID); + + /** + * Unregister and destroy the scene + * + * @return An error code + * @param[in] sceneID The sceneID of new view. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OBJ_ALREADY_EXIST The specified @c sceneId already exists. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_INVALID_STATE This instance has not been constructed as yet. + * @remarks Unregister and destroy the scene + */ + static result DestroyAndUnRegisterScene(const Tizen::Base::String& sceneID); + +private: + /** + * Default constructor + */ + SceneRegister(void); + + /** + * Default destructor + */ + ~SceneRegister(void); +}; + +#endif // _INT_SCENE_REGISTER_H_ diff --git a/inc/IntSettingClearPrivateDataForm.h b/inc/IntSettingClearPrivateDataForm.h new file mode 100644 index 0000000..eaa1b73 --- /dev/null +++ b/inc/IntSettingClearPrivateDataForm.h @@ -0,0 +1,212 @@ + +// Copyright 2012 Samsung Electronics Co., Ltd. +// +// 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.SETTINGSCLEARPRIVATEDATAFORM_H_ +// +//!Internet SettingsClearPrivateDataForm class +/*@file: IntSettingsClearPrivateDataForm.h + *@brief: The SettingsClearPrivateDataForm used to create private data scene + * + */ + +#ifndef _INT_SETTINGS_CLEAR_PRIVATE_DATA_FORM_H_ +#define _INT_SETTINGS_CLEAR_PRIVATE_DATA_FORM_H_ + +#include +#include + +using namespace Tizen::Ui; + +class SettingsClearPrivateDataForm + : public Controls::Form + , public IActionEventListener + , public Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + /** + * Default constructor + */ + SettingsClearPrivateDataForm(void); + + /** + * Default destructor + */ + virtual ~SettingsClearPrivateDataForm(void); + + /** + *@name Initialize + *@brief Constructing and Initializing ClearPrivateDataScene + *@param[in] no input parameters + *@retval TRUE Initialize success + *@retval FALSE Initialize failure + * + */ + bool Initialize(void); + + /** + *@name OnInitializing + *@brief Used to create instances and set styles for the form content. + *@param[in] no input parameters + *@retval TRUE Initialize success + *@retval FALSE Initialize failure + */ + virtual result OnInitializing(void); + + /** + *@name OnTerminating + *@brief Called on terminate of a form + *@param[in] no input parameters + *@retval TRUE Terminate success + *@retval FALSE Terminate failure + */ + virtual result OnTerminating(void); + + //IListViewItemProvider + /** + *@name CreateItem + *@brief Called when items need to be loaded. + *@param[in] index The index of the list + *@param[in] itemWidth The width of the element + *@retval no return value + */ + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + + /** + *@name DeleteItem + *@brief Called when items need to be loaded. + *@param[in] index The index of the list + *@param[in] pItem The pointer to the item to be deleted + *@param[in] itemWidth The width of the element + *@retval no return value + */ + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + /** + *@name GetItemCount + *@brief Called when the IconListView is about to be drawn and requests the listener to set the number of total items. + *@param[in] no input parameter + *@retval no return value + */ + virtual int GetItemCount(void); + + // IActionEventListener + /** + *@name OnActionPerformed + *@brief Called when an action event occurs. + *@param[in] source The source of the event + *@param[in] actionId The information about the action event + *@retval no return value + */ + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IFormBackEventListener + /** + *@name OnSceneDeactivated + *@brief Called when the current Form control needs to be closed to revert back to the previous Form control. + *@param[in] source The source of the event + *@retval no return value + */ + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + // IListViewItemEventListener + /** + *@name OnListViewContextItemStateChanged + *@brief Called when the state of an element in the ListContextItem is changed. + *@param[in] listView The source of the event + *@param[in] index The index of the list + *@param[in] elementId The element ID + *@param[in] state The status of the element + *@retval no return value + */ + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + + /** + *@name OnListViewItemStateChanged + *@brief Called when the state of an element in the ListViewItem in the ListView or GroupedListView is changed. + *@param[in] listView The source of the event + *@param[in] index The index of the list + *@param[in] elementId The element ID + *@param[in] status The status of the element + *@retval no return value + */ + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + + /** + *@name OnListViewItemSwept + *@brief Called when the ListItem is swept. + *@param[in] listView The source of the event + *@param[in] index The index of the list + *@param[in] direction The sweep direction + *@retval no return value + */ + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + + /** + *@name OnListViewItemLongPressed + *@brief Called when the item or the element is long pressed. + *@param[in] listView The source of the event + *@param[in] index The index of the list + *@param[in] elementId The element ID + *@param[in] invokeListViewItemCallback Indicates whether to invoke ListView item callback after this method returns + *@retval no return value + */ + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + + //IOrientationEventListener + /** + *@name OnOrientationChanged + *@brief Called when an orientation event occurs. + *@param[in] source The source of the event + *@param[in] orientationStatus The information about the orientation event + *@remarks The orientation changed event is fired on %Control for which orientation mode change has been enabled by calling SetOrientation(). + *@retval no return value + */ + void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + // ISceneEventListener + /** + *@name OnSceneActivatedN + *@brief Called after setting as current scene. + *@param[in] previousSceneId The scene ID of the deactivated scene + *@param[in] currentSceneId The scene ID of the newly activated scene + *@param[in] IList A pointer to an argument list that is user-specified + *@retval no return value + */ + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + + /** + *@name OnSceneDeactivated + *@brief Called when the current scene is deactivated. + *@param[in] currentSceneId The scene ID of the scene being deactivated + *@param[in] nextSceneId The scene ID of the newly activated scene + *@param[in] IList A pointer to an argument list that is user-specified + *@retval no return value + */ + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + +protected: + static const int IDA_FORMAT_TITLE_STRING; + static const int IDA_BUTTON_DELETE; + static const int IDA_BUTTON_CANCEL; + +private: + int __clearItem; + // __pList Pointer to ListView + Tizen::Ui::Controls::ListView* __pList; +}; + +#endif /* _INT_SETTINGS_CLEAR_PRIVATE_DATA_FORM_H_ */ diff --git a/inc/IntSettingForm.h b/inc/IntSettingForm.h new file mode 100644 index 0000000..6d092cd --- /dev/null +++ b/inc/IntSettingForm.h @@ -0,0 +1,196 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet SettingForm class +/*@file: IntSettingForm.h + *@brief: The %IntSettingForm defines settings. + * + */ + +#ifndef _INT_SETTING_FORM_H_ +#define _INT_SETTING_FORM_H_ + +#include +#include + +#include "IntMultipleWindowPresentationModel.h" +#include "IntConfirmationPopup.h" + +class SettingForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemProvider + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + /** + * @brief The Default Constructor + */ + SettingForm(void); + + /** + * @brief The Default Destructor + */ + virtual ~SettingForm(void); + + /** + * @brief Initializes this SettingForm Form. + */ + bool Initialize(void); + + /** + * @brief Initializes the controls of the UI for SettingForm. + */ + result OnInitializing(void); + + //IActionEventListener + void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + //IGroupedListViewItemProvider + Tizen::Ui::Controls::GroupItem* CreateGroupItem(int groupIndex, int itemWidth); + + Tizen::Ui::Controls::ListItemBase* CreateItem(int groupIndex, int itemIndex, int itemWidth); + + bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::GroupItem* pItem, int itemWidth); + + bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + int GetGroupCount(void); + + int GetItemCount(int groupIndex); + + //IGroupedListViewItemEventListener + void OnGroupedListViewContextItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + + void OnGroupedListViewItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListItemStatus status); + + void OnGroupedListViewItemSwept(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, Tizen::Ui::Controls::SweepDirection direction); + + //IFormBackEventListener + void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + //IOrientationEventListener + void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + //ISceneEventListener + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + enum + { + SETTING_INVALID = -1, + SETTING_HOMEPAGE_TITLE = 0, + SETTING_CURRENT_PAGE, //1 + SETTING_BLANK_PAGE, //2 + SETTING_MOST_VISITED_SITE, //3 + //SETTING_EMPTY_PAGE, //1 + SETTING_FAVORITE_URL, //4 + SETTING_DEFAULT_VIEW_TITLE, //5 + SETTING_FIT_TO_WIDTH, //6 + SETTING_READABLE, //7 + SETTING_RUN_JAVASCRIPT, //8 + SETTING_DISPLAY_IMAGES, //9 + SETTING_BLOCK_POPUP, //10 + SETTING_CLEAR_CACHE, //11 + SETTING_CLEAR_HISTORY, //12 + SETTING_SHOW_SECURITY_WARNINGS, //13 + SETTING_ACCEPT_COOKIES, //14 + SETTING_CLEAR_COOKIE_DATA, //15 + SETTING_SEARCH_ENGINE_TITLE, //20 + SETTING_SEARCH_ENGINE_YAHOO, //21 + SETTING_SEARCH_ENGINE_NAVER, //22 + SETTING_SEARCH_ENGINE_GOOGLE, //23 + SETTING_RESET_TO_DEFAULT, //24 + SETTING_MAX //25 + + }; + + enum SettingListItemType + { + ITEM_TYPE_NORMAL = 0, + ITEM_TYPE_TOGGLE, + ITEM_TYPE_DROPDOWN, + ITEM_TYPE_RADIO, + }; + + class SettingItemInfo + { + public: + /** + * @brief The Default Constructor + */ + SettingItemInfo(void); + + /** + * @brief The Default Destructor + */ + virtual ~SettingItemInfo(void){}; + + public: + int childCount; //only for ITEM_TYPE_DROPDOWN type items + bool isOpen; //true for opened and false for closed + bool isSelected; //only for ITEM_TYPE_RADIO && ITEM_TYPE_TOGGLE type of items + SettingListItemType itemType; + Tizen::Base::String titleText; + Tizen::Base::String subText; + }; + + int groupCount; + int* pGroupItemCount; + SettingItemInfo settingInfo[SETTING_MAX]; +private: + /** + * @brief Initializes this instance of settings default values. + */ + void InitializeSettingValues(void); + + /** + * @brief Opens a popup to clear cache data. + */ + void ClearCache(void); + + /** + * @brief Opens a popup to clear all the cookies. + */ + void ClearCookie(void); + + /** + * @brief Opens a popup to clear the browser history + */ + void ClearHistory(void); + + /** + * @brief Opens a popup for resetting the default settings. + */ + void ResetToDefault(void); + +private: + Tizen::Base::String __currentURL; + int __fontValue; + ConfirmationPopup* __pConfirmationPopup; + Tizen::Ui::Controls::GroupedListView* __pList; + Tizen::Ui::Controls::Popup* __pResetPopup; + WindowInfo* __pWindowInfo; // Contains window information of current scene + bool __isCurrentPageDisable; + +}; + + +#endif /* _INT_SETTING_FORM_H_ */ diff --git a/inc/IntSettingPresentationModel.h b/inc/IntSettingPresentationModel.h new file mode 100644 index 0000000..e6b146b --- /dev/null +++ b/inc/IntSettingPresentationModel.h @@ -0,0 +1,466 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntSettingsManager.cpp + *@brief: Used to define SettingsManager + */ + +#ifndef _INT_SETTINGS_PRESENTATION_MODEL_H_ +#define _INT_SETTINGS_PRESENTATION_MODEL_H_ + +#include +#include +#include +#include +#include + +#include "IntISettingChangeListener.h" + + +enum SettingValues +{ + REGISTRY_SETTING_INVALID = -1, + REGISTRY_SETTING_HOMEPAGE = 0, + REGISTRY_SETTING_DEFAULT_VIEW, //1 + REGISTRY_SETTING_RUN_JAVASCRIPT, //2 + REGISTRY_SETTING_DISPLAY_IMAGES, //3 + REGISTRY_SETTING_HTML5_VIDEOS, //4 + REGISTRY_SETTING_WORD_WRAPPING, //5 + REGISTRY_SETTING_BLOCK_POPUP, //6 + REGISTRY_SETTING_ACCEPT_COOKIES, //7 + REGISTRY_SETTING_AUTOSAVE_ID_PASSWORD, //8 + REGISTRY_SETTING_SHOW_SECURITY_WARNINGS, //9 + REGISTRY_SETTING_SEARCH_ENGINE, //10 + REGISTRY_SETTING_CASE_SENSITIVE, //11 + REGISTRY_SETTING_RUN_READER, //12 + REGISTRY_SETTING_READER_FONT_SIZE, //13 + REGISTRY_SETTING_FAVORITE_URL_VALUE, //14 + REGISTRY_SETTING_REMEMBER_FORM_DATA, //15 + REGISTRY_SETTING_REMEMBER_PASSWORD, //16 + MAX_REGISTRY_SETTING //17 +}; + +class SettingPresentationModel +{ +public: + + + /** + * @brief The method initializes the registry and the SettingsManager values. + * + * @return An error code + * @param[in] void + * + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result Construct(void); + + /** + * @brief The method used to add a listener to get the setting change events + */ + void AddSettingsEventListener(const ISettingChangeEventListener& pListener); + + + + /** + * @name ClearCache + * @brief The method used to clear the cache of web browser + * @param[in] void + * @return String The Search URL + */ + void ClearCache(void); + + /** + * @name ClearCookie + * @brief The method used to clear the cache of web browser + * @param[in] void + * @return String The Search URL + */ + void ClearCookie(void); + + /** + * @brief The method used to get the default view + * @param[in] void + * @return String The default view value + * + */ + Tizen::Base::String GetDefaultView(void); + + /** + * @brief The method used to get the Favorite URL + * @param[in] void + * @return String The Favorite URL + */ + Tizen::Base::String GetFavoriteUrl(void); + + /** + * @brief The method used to get the already created instance of the SettingPresentationModel + */ + static SettingPresentationModel* GetInstance(void); + + /** + * @brief The method used to set the homepage value + * @param[in] void + * @return String The Homepage Value + */ + Tizen::Base::String GetHomepage(void); + + /** + * @brief The method used to get the value of reader font size + * @param[in] void + * @return int fontSize of reader + */ + int GetReaderFontSize(void); + + /** + * @brief The method used to get the Save Password string value. + * @param[in] void + * @return String The Save Password String + */ + Tizen::Base::String GetSavePassword(void); + + /** + * @brief The method used to get the Search Engine string value. + * @param[in] void + * @return String The Search Engine String + */ + Tizen::Base::String GetSearchEngine(void); + + /** + * @brief The method used to get the Search URL Based on the default search engine value. + * @param[in] void + * @return String The Search URL + */ + Tizen::Base::String GetSearchUrl(const Tizen::Base::String& searchText); + + bool GetPrivateOn(void); + + /** + * @brief The method used to get the Block popup as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsBlockPopUp(void); + + /** + * @brief The method used to get the Cookies Enabled as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsCookiesEnabled(void); + + /** + * @brief The method used to get the case sensitivity as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsCaseSensitiveEnabled(void); + + /** + * @brief The method used to get the Display Images value as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsDisplayImagesEnabled(void); + + /** + * @brief The method used to get the HTML5 Videos as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsHtml5VideosEnabled(void); + + /** + * @brief The method used to get the Remember password Enabled as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsRememberFormData(void); + + /** + * @brief The method used to get the Remember password Enabled as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsRememberPassword(void); + + /** + * @brief The method used to get the Javascript enabled value as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsRunJavascriptEnabled(void); + + /** + * @brief The method used to get the Run Reader as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsRunReaderEnabled(void); + + /** + * @brief The method used to get the Security Warnings as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsSecurityWarningsEnabled(void); + + /** + * @brief The method used to get the Word Wrap as true or false + * @param[in] void + * @return bool true to enable and false for disable + */ + bool IsWordWrapEnabled(void); + + /** + * @brief The method loads the data and the SettingsManager values from the registry. + * + * @return An error code + * @param[in] void + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result LoadRegistry(void); + + /** + * @brief The method used to remove the ISettingsChangeListener + */ + void RemoveSettingsEventListener(ISettingChangeEventListener& pListener); + + /** + * @brief The method resets the registry and the SettingsManager values to default. + * + * @return An error code + * @param[in] void + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result ResetRegistry(void); + + /** + * @brief The method used to set the Default values of settings + */ + void SetDefaultValues(void); + + /** + * @brief The method used to set the default view + * @param[in] String The default view value + * @return void + */ + void SetDefaultView(const Tizen::Base::String& viewLevel); + + /** + * @brief The method used to set the homepage value + * @param[in] String The Homepage Value + * @return void + */ + void SetHomepage(const Tizen::Base::String& homePage); + + /** + * @brief The method used to set the Javascript enabled value to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetRunJavascriptEnabled(bool runJsEnabled); + + /** + * @brief The method used to set the Display Images value to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetDisplayImagesEnabled(bool displayImages); + + /** + * @brief The method used to set the HTML5 Videos to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetHtml5VideosEnabled(bool html5Videos); + + /** + * @brief The method used to set the Word Wrap to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetWordWrapEnabled(bool wordWrap); + + /** + * @brief The method used to set the Block popup to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetBlockPopUp(bool blockPopUp); + + /** + * @brief The method used to set the Cookies Enabled to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetCookiesEnabled(bool cookiesEnabled); + + /** + * @brief The method used to set the Save Password string value. + * @param[in] String The Save Password String + * @return void + */ + void SetSavePassword(const Tizen::Base::String& savePassword); + + /** + * @brief The method used to set Remember form data to true or false + * @param[in] bool true to enable false for disable + * @return void + */ + void SetRememberFormData(bool rememberFormData); + + /** + * @brief The method used to set Remember password to true or false + * @param[in] bool true to enable false for disable + * @return void + */ + void SetRememberPassword(bool rememberPassword); + + /** + * @brief The method used to enabling the Security Warnings to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetSecurityWarningsEnabled(bool securityWarnings); + + /** + * @brief The method used to set the Default Search Engine. + * @param[in] String The Search Engine String + * @return void + */ + void SetSearchEngine(const Tizen::Base::String& searchEngine); + + + + void SetCaseSensitiveEnabled(bool caseSensitive); + + /** + * @brief The method used to enabling the Reader to true or false + * @param[in] bool true to enable and false for disable + * @return void + */ + void SetRunReaderEnabled(bool runReader); + + /** + * @brief The method used to set the value of reader font size + * @param[in] int fontSize of reader + * @return void + */ + void SetReaderFontSize(int fontSize); + + /** + * @name GetWebSettings + * @brief The method used to get web browser settings + * @param[in] void + * @return WebSetting The Settings of web browser + */ + Tizen::Web::Controls::WebSetting& GetWebSettings(void); + + /** + * @name SetFavoriteValue + * @brief The method used to set favourite URL for web browser + * @param[in] val favorite value to set + * @return An error code + * @exception E_INVALID_ARG The length of the specified string for a section or entry is smaller than or equal to @c 0, or the specified string is a @c null value or string with '\0' and '\n'. + * @exception E_KEY_NOT_FOUND The specified key is not used in the application preferences. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_KEY_ALREADY_EXIST The key has already been used in the application preferences. + * @exception E_SUCCESS The method is successful. + */ + result SetFavoriteValue(const Tizen::Base::String& val); + + void SetPrivateOn(bool isPrivateOn); + +private: + /** + * @brief The Default Constructor + */ + SettingPresentationModel(void); + + /** + * @brief The Default Destructor + */ + ~SettingPresentationModel(void); + + /** + * copy constructor + */ + SettingPresentationModel(const SettingPresentationModel& settingModelObj); + + /** + * @brief The method used to create the instance of the SettingsManager class + */ + static void CreateInstance(void); + + /** + * @brief The method used to remove the already created instance of the SettingsManager + */ + static void DestroyInstance(void); + /** + * assignment operator + */ + SettingPresentationModel& operator=(const SettingPresentationModel& settingModelObj); + + result SetValue(const int settingValueName, const Tizen::Base::String& val); + +private: + static SettingPresentationModel* __pSettingsPresentationModel; + + Tizen::Base::Collection::ArrayList __listenerList; + Tizen::Base::String __homePage; + Tizen::Base::String __defaultViewLevel; + Tizen::Base::String __favouriteURL; + bool __runJsEnabled; + bool __displayImages; + bool __html5Videos; + bool __wordWrap; + bool __blockPopUp; + bool __rememberFormData; + bool __rememberPassword; + bool __cookies; + Tizen::Base::String __savePassword; + bool __securityWarnings; + Tizen::Base::String __searchEngine; + bool __caseSensitive; + bool __runReader; + int __fontSize; + bool __isPrivateOn; + Tizen::Web::Controls::WebSetting __setting; + + // Tizen::Io::Registry* __pRegistry; + Tizen::Base::String __entry[MAX_REGISTRY_SETTING]; + Tizen::Base::String __values[MAX_REGISTRY_SETTING]; +}; + +#endif // _INT_SETTINGS_PRESENTATION_MODEL_H_ diff --git a/inc/IntSettingToggleCustomItem.h b/inc/IntSettingToggleCustomItem.h new file mode 100644 index 0000000..afd2535 --- /dev/null +++ b/inc/IntSettingToggleCustomItem.h @@ -0,0 +1,103 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet SettingToggleCustomItem class +/*@file: SettingToggleCustomItem.h + *@brief: The SettingToggleCustomItem used to toggle the item. + * + */ + +#ifndef _INT_SETTING_TOGGLE_CUSTOM_ITEM_H_ +#define _INT_SETTING_TOGGLE_CUSTOM_ITEM_H_ + +#include +#include +#include "IntTypes.h" + +class SettingToggleCustomItem + : public Tizen::Ui::Controls::CustomItem +{ + +public: + /** + * @brief The Default constructor + */ + SettingToggleCustomItem(void); + + /** + * @brief The Default destructor + */ + virtual ~SettingToggleCustomItem(void); + + /** + * @brief Initializes this instance of %DropDownCustomItem. + * + * @return An error code + * @param[in] void An instance of the Rectangle class @n + * This instance represents the x and y coordinates of the top-left corner of the created window along with + * the width and height of the window. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result Construct(int width, int height); + + //getter and setter methods for __text + + /** + * @brief The method used to get the text of CustomItem + * + * @return A String + */ + Tizen::Base::String GetText(void); + + /** + * @brief Add all the required elements and create the Custom Item. + * + * @return An error code + * @param[in] void An instance of the Rectangle class @n + * This instance represents the x and y coordinates of the top-left corner of the created window along with + * the width and height of the window. + * @exception E_SUCCESS The method is successful. + * @exception E_INVALID_STATE This instance has already been constructed. + * @exception E_INVALID_ARG A specified input parameter is invalid. + * @exception E_OUT_OF_MEMORY The memory is insufficient. + * @exception E_SYSTEM A system error has occurred. + * + */ + result Make(void); + + /** + * @brief The method used to set the text of CustomItem + */ + + void SetText(Tizen::Base::String& text); + + + +private: + int __height; ///Height of the SettingToggleCustomItem Instance + int __width; ///Width of the SettingToggleCustomItem Instance + + Tizen::Base::String __text; ///The Text for the Toggle Button + +}; + +#endif /* _INT_SETTING_TOGGLE_CUSTOM_ITEM_H_ */ diff --git a/inc/IntSharePopup.h b/inc/IntSharePopup.h new file mode 100644 index 0000000..bdca853 --- /dev/null +++ b/inc/IntSharePopup.h @@ -0,0 +1,169 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntSharePopUp.h + *@brief: This header file contains the declarations of the SharePopup + * + */ + +#ifndef INTSHAREPOPUP_H_ +#define INTSHAREPOPUP_H_ + +#include +#include +#include + +class ShareInfo : public Tizen::Base::Object +{ +public: + /** + * @brief The Default constructor + */ + ShareInfo(void); + + /** + * @brief The Default destructor + */ + ~ShareInfo(void); + + /** + * @brief The method used to get the Page title + * @param[in] void + * @return String The Page title + */ + Tizen::Base::String GetPageTitle(void); + + /** + * @brief The method used to get the Page URL + * @param[in] void + * @return String The Page URL + */ + Tizen::Base::String GetPageURL(void); + + /** + * @brief The method used to set the Page title + * @param[in] aPageTitle + */ + void SetPageTitle(Tizen::Base::String aPageTitle); + + /** + * @brief The method used to set the Page URL + * @param[in] aPageURL + */ + void SetPageUrl(Tizen::Base::String aPageURL); + + void SetImageAttached(bool imageAttached); + + bool GetImageAttached(); + + void SetImagePath(Tizen::Base::String aImagePath); + + Tizen::Base::String GetImagePath(void); +private: + Tizen::Base::String __pageTitle; + Tizen::Base::String __pageURL; + Tizen::Base::String __imagePath; + bool isImageAttached; +}; + +class SharePopup + : public Tizen::App::IAppControlEventListener + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::Popup + , public Tizen::Ui::IActionEventListener + { + public: + /** + * @brief The Default Constructor + */ + SharePopup(void); + + /** + * @brief The Default Destructor + */ + ~SharePopup(void); + + /** + * @brief Initializes this SettingForm Form. + * + * @return An error code + * @exception true The method is succeIOrientationEventListenerssful. + * @exception false An error Occured. + */ + bool Initialize(void); + + virtual result OnTerminating(void); + + /** + * This function adds the share info object in the array list + * + * @return An Error Code + * @param An Object of ShareInfo. + */ + result AddShareInfo(ShareInfo* pShareInfo); + + void RemoveAllShareInfo(); + + //IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IAppControlListener + void OnAppControlCompleted(const Tizen::Base::String& providerId, const Tizen::Base::String& operationId, const Tizen::Base::Collection::IList* pResultList); + + //IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual int GetItemCount(void); + + // IListViewItemEventListener + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + + /** + * This function displays the Notification + * + * @return No return type. + * @param none. + */ + void StartMessageAppControl(void); + + /** + * This function Starts the EmailApp Control + * + * @return No return type. + * @param none. + */ + void StartEmailAppControl(void); + + + protected: + static const int IDA_CANCEL_BUTTON; + static const int ID_FORMAT_MESSAGE_STRING; + static const int ID_FORMAT_EMAIL_STRING; + static const int ID_FORMAT_FACEBOOK_STRING; + static const int ID_FORMAT_TWITTER_STRING; + + private: + Tizen::Ui::Controls::ListView* __pList; + Tizen::Base::Collection::ArrayList* __pShareList; + }; + +#endif /* INTSHAREPOPUP_H_ */ diff --git a/inc/IntSharePopup.h.bak b/inc/IntSharePopup.h.bak new file mode 100644 index 0000000..bc7ebc0 --- /dev/null +++ b/inc/IntSharePopup.h.bak @@ -0,0 +1,158 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntSharePopUp.h + *@brief: This header file contains the declarations of the SharePopup + * + */ + +#ifndef INTSHAREPOPUP_H_ +#define INTSHAREPOPUP_H_ + +#include +#include +#include + +class ShareInfo : public Tizen::Base::Object +{ +public: + /** + * @brief The Default constructor + */ + ShareInfo(void); + + /** + * @brief The Default destructor + */ + ~ShareInfo(void); + + /** + * @brief The method used to get the Page title + * @param[in] void + * @return String The Page title + */ + Tizen::Base::String GetPageTitle(void); + + /** + * @brief The method used to get the Page URL + * @param[in] void + * @return String The Page URL + */ + Tizen::Base::String GetPageURL(void); + + /** + * @brief The method used to set the Page title + * @param[in] aPageTitle + */ + void SetPageTitle(Tizen::Base::String aPageTitle); + + /** + * @brief The method used to set the Page URL + * @param[in] aPageURL + */ + void SetPageUrl(Tizen::Base::String aPageURL); + +private: + Tizen::Base::String __pageTitle; + Tizen::Base::String __pageURL; +}; + +class SharePopup + : public Tizen::App::IAppControlEventListener + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::Popup + , public Tizen::Ui::IActionEventListener + { + public: + /** + * @brief The Default Constructor + */ + SharePopup(void); + + /** + * @brief The Default Destructor + */ + ~SharePopup(void); + + /** + * @brief Initializes this SettingForm Form. + * + * @return An error code + * @exception true The method is succeIOrientationEventListenerssful. + * @exception false An error Occured. + */ + bool Initialize(void); + + virtual result OnTerminating(void); + + /** + * This function adds the share info object in the array list + * + * @return An Error Code + * @param An Object of ShareInfo. + */ + result AddShareInfo(ShareInfo* pShareInfo); + + //IActionEventListener + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + // IAppControlListener + void OnAppControlCompleted(const Tizen::Base::String& providerId, const Tizen::Base::String& operationId, const Tizen::Base::Collection::IList* pResultList); + + //IListViewItemProvider + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual int GetItemCount(void); + + // IListViewItemEventListener + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback); + + /** + * This function displays the Notification + * + * @return No return type. + * @param none. + */ + void StartMessageAppControl(void); + + /** + * This function Starts the EmailApp Control + * + * @return No return type. + * @param none. + */ + void StartEmailAppControl(void); + + + protected: + static const int IDA_CANCEL_BUTTON; + static const int ID_FORMAT_MESSAGE_STRING; + static const int ID_FORMAT_EMAIL_STRING; + static const int ID_FORMAT_FACEBOOK_STRING; + static const int ID_FORMAT_TWITTER_STRING; + + private: + Tizen::Ui::Controls::ListView* __pList; + Tizen::Base::Collection::ArrayList* __pShareList; + }; + +#endif /* INTSHAREPOPUP_H_ */ diff --git a/inc/IntTypes.h b/inc/IntTypes.h new file mode 100644 index 0000000..403cc14 --- /dev/null +++ b/inc/IntTypes.h @@ -0,0 +1,66 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntTypes.h + *@brief: This is the header file for TableType + */ +#ifndef _INT_TYPES_H +#define _INT_TYPES_H + +#include + +static const int NB_DB_PRIMARY_KEY = -1; +static const int MAX_NB_DB_ID_LEN = 100; +static const int MAX_NB_DB_TITLE_LEN = 100000; +static const int MAX_NB_DB_CONTENT_LEN = 100000; + +static const int MAX_NOTE_TABLE_COLUMN = 10; +static const int MAX_NOTEBOOK_TABLE_COLUMN = 8; + +static const int IDA_BUTTON_NO = 1000; +static const int IDA_BUTTON_YES = 1001; + +static const unsigned int CUSTOM_COLOR_GREY = Tizen::Graphics::Color32<124,124,124>::Value; +static const unsigned int CUSTOM_COLOR_TRANSPARENT = Tizen::Graphics::Color32<0,0,0>::Value; +static const unsigned int CUSTOM_BACKGROUND_COLOR_LISTVIEW = Tizen::Graphics::Color32<236,240,242>::Value; +static const unsigned int CUSTOM_BACKGROUND_COLOR_LISTVIEW_PRESSED_HIGHLIGHTED = Tizen::Graphics::Color32<42, 137, 194>::Value; +static const unsigned int CUSTOM_COLOR_LISTVIEW_TEXT = Tizen::Graphics::Color32<249,249,249>::Value; +static const unsigned int CUSTOM_COLOR_BROWN = Tizen::Graphics::Color32<32, 32, 32>::Value; +static const unsigned int CUSTOM_COLOR_INFO_LABEL = Tizen::Graphics::Color32<68, 68, 68>::Value; +static const unsigned int CUSTOM_BACKGROUND_COLOR_PREVIEW_PANEL = Tizen::Graphics::Color32<81,81,81>::Value; +static const unsigned int CUSTOM_BACKGROUND_COLOR_PREVIEW_PANEL_INACTIVE = Tizen::Graphics::Color32<0,0,0,20>::Value; +static const unsigned int CUSTOM_COLOR_PREVIEW_PANEL_PRESSED_RECTANGLE = Tizen::Graphics::Color32<7,180,211>::Value; +static const unsigned int CUSTOM_COLOR_LISTVIEW_TEXT2 = Tizen::Graphics::Color32<70,70,70>::Value; +static const unsigned int CUSTOM_COLOR_SETTINGS_TEXT = Tizen::Graphics::Color32<128, 128, 128>::Value; +static const unsigned int CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND = Tizen::Graphics::Color32<248, 246, 239>::Value; +static const unsigned int CUSTOM_COLOR_SETTINGS_LISTITEM_RADIO_BACKGROUND = Tizen::Graphics::Color32<220, 218, 211>::Value; +static const unsigned int CUSTOM_COLOR_SETTINGS_GROUPTITLE = Tizen::Graphics::Color32<59, 115, 182>::Value; + +enum BrowserDbTableTypes +{ + DB_TYPE_INVALID = -1, + DB_TYPE_BOOKMARKURLS, + DB_TYPE_BOOKMARKFOLDERS, + DB_TYPE_HISTORYDATA, + DB_TYPE_FAVICON, + DB_TYPE_MAX +}; + + +#endif // _INT_TYPES_H + diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..6ba411b --- /dev/null +++ b/manifest.xml @@ -0,0 +1,157 @@ + + + kmcele1k0n + 1.0.0 + C++App + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x86 + vfpv3 + + + 2.0 + + http://tizen.org/privilege/web.privacy + http://tizen.org/privilege/web.service + http://tizen.org/privilege/alarm + http://tizen.org/privilege/application.launch + http://tizen.org/privilege/power + http://tizen.org/privilege/content.write + + + + + + Internet-Ref + 网络-Ref + ინტერნეტი-Ref + Internet-Ref + Браузер-Ref + Internet-Ref + Internet-Ref + Internetið-Ref + Internet-Ref + Internet-Ref + Internetas-Ref + Internet-Ref + Internet-Ref + Интернет-Ref + 瀏覽器-Ref + Internet-Ref + Internet-Ref + Ինտերնետ-Ref + Internet-Ref + Internet-Ref + الإنترنت-Ref + Internet-Ref + Internet-Ref + İnternet-Ref + Интернет-Ref + Internet-Ref + Шолушы-Ref + Internet-Ref + 互联网-Ref + Internet-Ref + Internet-Ref + Internet-Ref + Internet-Ref + इंटरनेट-Ref + Internet-Ref + Internet-Ref + Internet-Ref + Internet-Ref + Internet-Ref + Интернет-Ref + 網際網路-Ref + インターネット-Ref + Internet-Ref + 인터넷-Ref + Internet-Ref + Internett-Ref + Internet-Ref + Internet-Ref + an tIdirlíon-Ref + Internets-Ref + Internet-Ref + + + mainmenu.png + + + + http://tizen.org/appcontrol/operation/view + file + http + https + javascript + + + application/xml + image/svg+xml + text/html + http://tizen.org/appcontrol/operation/view + + + + + On + On + Off + On + + + + diff --git a/packaging/apps.Internet.spec b/packaging/apps.Internet.spec new file mode 100755 index 0000000..b8e7917 --- /dev/null +++ b/packaging/apps.Internet.spec @@ -0,0 +1,61 @@ +Name: apps.Internet +Summary: Internet application +Version: 1.0.0.0 +Release: 1 +Group: TO_BE/FILLED_IN +License: TO BE FILLED IN +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(osp-content) +BuildRequires: pkgconfig(osp-appfw) +BuildRequires: osp-appfw-internal-devel +BuildRequires: pkgconfig(osp-uifw) +BuildRequires: osp-uifw-internal-devel +BuildRequires: pkgconfig(osp-media) +BuildRequires: osp-media-internal-devel +BuildRequires: pkgconfig(osp-image) +BuildRequires: osp-image-internal-devel +BuildRequires: pkgconfig(osp-net) +BuildRequires: osp-net-internal-devel +BuildRequires: pkgconfig(osp-json) +BuildRequires: pkgconfig(osp-web) +BuildRequires: pkgconfig(osp-image-core) +BuildRequires: pkgconfig(osp-locations) + +%description +Verification application: Internet + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%ifarch %{ix86} +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ -D_OSP_EMUL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%else +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_ARMEL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif + +# Call make instruction with smp support +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%post +/sbin/ldconfig +PKG_ID=kmcele1k0n +echo "/usr/etc/package-manager/backend/tpk -i /usr/apps/"${PKG_ID} +/usr/etc/package-manager/backend/tpk -i /usr/apps/${PKG_ID} +cp -f /usr/lib/osp/osp-ui-app-loader /usr/apps/${PKG_ID}/bin/Internet + +%postun +/sbin/ldconfig +PKG_ID=kmcele1k0n +echo "/usr/etc/package-manager/backend/tpk -u "${PKG_ID} +/usr/etc/package-manager/backend/tpk -u ${PKG_ID} + +%files +%defattr(-,root,root,-) +/usr/apps/* diff --git a/res/.workflow b/res/.workflow new file mode 100644 index 0000000000000000000000000000000000000000..b7228a4f2ac78019a1bc24ec3ea969ff5579b2a1 GIT binary patch literal 260 zcmZ4UmVvdnh`~6&C|$24vnn-DFE6nqvn(~apg^xQGpRH)CndE=uROmfJ1r-_TrW32 zB{fISIWey+v6uk@7?~KDd>D9=Gk{8qQuCbi3o1((1bng*%M$fVOEPoxeKLzntbG_b zQgc#sQ}arS3mNJd7%PexOh~fR6`~tqDMLj8(BZ-$d-Oo|=s6Y@C02qgt7yC=JM(zr eTxJGFPX?A^psy+lK>EsAfCN_s*a09WOaK7zJ5X2v literal 0 HcmV?d00001 diff --git a/res/ara-AE.xml b/res/ara-AE.xml new file mode 100644 index 0000000..3320e7f --- /dev/null +++ b/res/ara-AE.xml @@ -0,0 +1,134 @@ + + + + اختيار الكل + 11 + المواقع الأكثر زيارة + Close all + إغلاق + حجم الخط + 12 + العلامة موجودة بالفعل + قبول ملفات تعريف الارتباط + هل تريد حذف محفوظات المستعرض؟ + هل تريد حذف المحتوى المخزن محليا وقواعد البيانات؟ + مسح كافة بيانات ملفات الارتباط + إثنـ + لا + إلغاء + مشاركة عبر Twitter + آخر شهر + سبت + تمت إضافة إشارة مرجعية + أضف للعلامات + اسأل دائما + صفحة فارغة + 06 + تلقائي + 07 + نسخ + تذكر كلمات المرور + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + بيانات النموذج + 04 + Edit Folder + 05 + البحث في الصفحة + نسخ الصورة + تم المسح + 03 + Yahoo + محرك البحث + بحث + مشاركة + ابحث عن عنوان URL أو أدخله + No Recently Visited Sites. + مشاركة صورة + مسح + هل تريد حذف كافة ملفات تعريف الارتباط؟ + لا يوجد علامات + أربـ + لا توجد محفوظات + 01 + إعدادات موقع الويب + الخصوصية والأمان + تمت + الإطار المتعدد + Earlier this month + ملفات تعريف الارتباط + العرض الافتراضي + 09 + كلمة المرور + 08 + إعدادات محتوى الصفحة + مقروء + مسح كلمات المرور + لصق + حفظ الصورة + Naver + تذكر بيانات النموذج + تعديل + الإنترنت + عرض الصور + اليوم + تحديد كلمة + أمس + العنوان + صفحة المستخدم الرئيسية + ملائمة للعرض + محدد + السطوع + الضبط + مسح الذاكرة المؤقتة + about: blank + إنشاء مجلد + العلامات + عرض الصور + مشاركة عبر البريد الإلكتروني + تشغيل JAVAscript + إعادة الضبط إلى الافتراضي + أدخل اسم الإشارة المرجعية + الموقع + الأسبوع الأخير + مشاركة عبر Facebook + المجلد + مجلد جديد + تمت إزالة العلامة + Reset all settings to default? + حفظ + إطار جديد + تمكين الموقع + إضافة + جمعة + منع الإطارات المنبثقة + نعم + الموقع + الخصوصية + إلغاء إمكانية الوصول إلى الموقع + منذ %d أسبوع + علامة + عنوان غير صحيح + No History \nAfter you load pages, the history will be shown. + المحفوظات + أحد + عرض تحذيرات الأمان + تعديل العلامة + الصفحة الحالية + مشاركة عبر الرسائل + الصفحة الرئيسية + يدوي + مسح بيانات النموذج + ثلا + 10 + خميس + لا توجد نتائج + مسح السجل + 02 + Failed to save Image + diff --git a/res/aze-AZ.xml b/res/aze-AZ.xml new file mode 100644 index 0000000..eb85330 --- /dev/null +++ b/res/aze-AZ.xml @@ -0,0 +1,134 @@ + + + + Hamısını seç + Noy. + Ən çox daxil olunan saytlar + Close all + Bağla + Şriftin ölçüsü + Dek + Əlfəcin artıq mövcuddur + Kukiləri qəbul edin + Brauzer tarixçəsi silinsin? + Lokal keş məzmunu və məlumat bazaları təmizlənsin? + Bütün kuki məlumatlarını silin + B.e + Xeyr + Ləğv et + Twitter ilə paylaş + Keçən ay + Şən + Əlfəcin əlavə edildi + Nişanlara əlavə et + Həmişə soruş + Boş səhifə + İyun + Avtomatik + İyul + Köçür + Parolları yadda saxlayın + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Forma məlumatları + Apr. + Edit Folder + May + Səhifədə tapın + Şəkli köçür + Silindi + Mart + Yahoo + Axtarış mexanizmi + Axtarış + Paylaş + Axtar və ya URL daxil et + No Recently Visited Sites. + Şəkil paylaş + Sil + Bütün kukilər silinsin? + Nişanlar yoxdur + Çərş. + Tarixçə yoxdur + Yan. + Vebsayt parametrləri + Məxfilik və təhlükəsizlik + Bitdi + Çoxpəncərəli + Earlier this month + Kukilər + Standart görünüş + Sent + Şifrə + Avq + Səhifə məzmunu parametrləri + Oxuna bilən + Parolları silin + Yapışdır + Təsviri yaddaşa yaz + Naver + Forma məlumatını xatırlayın + Redaktə et + Internet + Displey təsvirləri + Bu gün + Sözü seçin + Dünən + Başlıq + İstifadəçinin baş səhifəsi + Eninə uyğunlaşdırın + Seçilmişi + Parlaqlıq + Parametrlər + Keşi təmizlə + about: blank + Qovluq yaradın + Çevik keçidlər + Şəkil göstərlsn + E-poçtla paylaş + JavaScript-i işə sal + İlkin parametrə təyin et + Əlfəcin adını daxil edin + Yeri + Keçən həftə + Facebook ilə paylaş + Qovluq + Yeni qovluq + Əlfəcin silindi + Reset all settings to default? + Yaddaşa yaz + Yeni pəncərə + Məkanı aktivləşdir + Əlavə et + Cümə + Peyda olan menyuları blokla + Bəli + URL + Gizlilik + Məkana girişi sil + %d həftə əvvəl + Çevik keçid silindi + Yanlış ünvan + No History \nAfter you load pages, the history will be shown. + Tarix + Baz + Təhlükəsizlik xəbərdarlıqlarını göstərin + Nişanı redaktə et + Cari səhifə + Mesajlar ilə paylaş + Ana səhifə + Ələ işlət + Forma məlumatlarını silin + Ç.A. + Okt + C.A. + Heç bir nəticə tapılmamışdır + Tarixçəni sil + Fev. + Failed to save Image` + diff --git a/res/bul-BG.xml b/res/bul-BG.xml new file mode 100644 index 0000000..1824e62 --- /dev/null +++ b/res/bul-BG.xml @@ -0,0 +1,134 @@ + + + + Избери всички + Ное + Най-посещавани сайтове + Close all + Затваряне + Размер на шрифта + Дек. + Показалецът вече съществува + Приемане на бисквитки + Изтриване на хронологията на браузъра? + Изтриване на локално кешираното съдържание и бази данни? + Изчистване на всички данни от бисквитки + Пон + Не + Отмени + Споделяне чрез Twitter + Последен месец + Съб + Добавен е маркер + Добави към маркери + Винаги питай + Празна страница + Юни + Авто + Юли + Копиране + Запомняне на паролите + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Данни за формуляра + Апр. + Edit Folder + Май + Търсене в стр. + Копиране на изображение + Изтрито + Март + Yahoo + Търсачка + Търси + Споделям + Потърсете или въведете URL + No Recently Visited Sites. + Сподели образ + Изтрий + Желаете ли да изтриете всички cookies? + Няма показалци + Ср + Няма хронологии + Ян + Настройки на уеб сайт + Поверителност и защита + Готово + Множ. прозорец + Earlier this month + Бисквитки + Изглед по подразбиране + Сеп. + Парола + Авг. + Настр.съдържание страници + Четима + Изчисти паролите + Поставяне + Запис на изображение + Naver + Запомняне на данни за формуляри + Редактиране + Интернет + Покажи изображения + Днес + Избор на дума + Вчера + Заглавие + Потребителска начална страница + Побиране в ширината + Избрани + Яркост + Настройки + Изчистване на кеша / Изчисти кеша + about: blank + Създай папка + Показалци + Покажи изображ. + Споделяне през email + Изпълнение на JavaScript + Нулиране до стойности по подразбиране + Въведете име на показалец + Позиция + Последна седмица + Споделяне чрез Facebook + Папка + Ръчно + Показалецът е премахнат + Reset all settings to default? + Запази + Нов прозорец + Активиране на местоположение + Добави + Пет + Блокирай изскачащи прозорци + Да + URL + Поверителност + Изчистване на достъпа до местоположения + преди %d седмици + Показалец + Невалиден адрес + No History \nAfter you load pages, the history will be shown. + Хронология + Нед + Показване на предупрежденията за защита + Редактиране на показалец + Текуща страница + Споделяне чрез Съобщения + Начална страница + Ръчно + Изчистване на данни за формуляри + Вт + Окт. + Чтв + Няма намерени резултати + Изтриване на хронология + Фев. + Failed to save Image + diff --git a/res/cat-ES.xml b/res/cat-ES.xml new file mode 100644 index 0000000..f7acc0e --- /dev/null +++ b/res/cat-ES.xml @@ -0,0 +1,134 @@ + + + + Seleccioni-ho tot + Nov. + Llocs més visitats + Close all + Tancar + Mida de font + Des. + Ja existeix el preferit + Acceptar cookies + Esborrar historial de navegació? + Esborrar les bases de dades i el contingut en memòria cau local? + Esborrar totes les dades de cookies + Dl. + No + Cancel·lar + Compartir mitjançant Twitter + Mes passat + Ds. + Preferit afegit + Afegir a Preferits + Preguntar sempre + Pàgina buida + Juny + Auto + Jul. + Copiar + Recordar contrasenyes + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Dades del formulari + Abr. + Edit Folder + Maig + Cercar a pàgina + Copiar la imatge + Esborrat + Mar. + Yahoo + Cercador + Cercar + Compartir + Cerqui o introdueixi URL + No Recently Visited Sites. + Comp imatge + Esborrar + Eliminar totes les cookies? + No hi ha preferits + Dc. + Sense historials + Gen. + Ajustaments de lloc web + Privadesa i seguretat + Finalit. + Finestr múltip + Earlier this month + Cookies + Vista predeterminada + Set. + Contrasenya + Ago. + Ajustam contingut pàgina + Llegible + Esborrar contrasenyes + Enganxar + Desar imatge + Naver + Recordar dades de formularis + Editar + Internet + Mostrar imatges + Avui + Seleccionar paraula + Ahir + Títol + Pàgina d'inici d'usuari + Adaptar a l'amplada + Seleccionat + Brillantor + Ajustaments + Esborrar memòria cau + about: blank + Crear carpeta + Preferits + Veure imatge + Compartir amb correu electrònic + Executar JavaScript + Restablir a predeterminat + Introdueixi el nom del preferit + Ubicació + Setmana passada + Compartir mitjançant Facebook + Carpeta + Carpeta nova + Preferit eliminat + Reset all settings to default? + Desar + Finestra nova + Habilitar ubicació + Afegir + Dv. + Bloquejar finestres emergents + Sí + URL + Confidencialitat + Esborrar accés d'ubicació + fa %d setmanes + Preferit + Adreça no vàlida + No History \nAfter you load pages, the history will be shown. + Historial + Dg. + Mostrar advertiments de seguretat + Editar preferit + Pàgina actual + Compartir mitjançant Missatges + Pàgina d'inici + Manual + Esborrar dades de formularis + Dm. + Oct. + Dj. + No s'han trobat resultats + Esborrar historial + Feb. + Failed to save Image + diff --git a/res/ces-CZ.xml b/res/ces-CZ.xml new file mode 100644 index 0000000..28c2e95 --- /dev/null +++ b/res/ces-CZ.xml @@ -0,0 +1,134 @@ + + + + Vybrat vše + Lis + Nejnavštěvovanější stránky + Close all + Zavřít + Velikost písma + Pro + Záložka již existuje + Povolit cookies + Odstranit historii prohlížeče? + Odstranit obsah a databáze uložené v místní paměti? + Vymazat všechna data cookie + Po + Ne + Zrušit + Sdílet prostřednictvím Twitteru + Poslední měsíc + So + Záložka přidána + Přidat záložku + Vždy zobrazit dotaz + Prázdná stránka + Čer + Automaticky + Čvc + Kopírovat + Zapamatovat hesla + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Data formuláře + Dub + Edit Folder + Kvě + Najít na str. + Kopírovat obrázek + Odstraněno + Bře + Yahoo + Vyhledávač + Hledat + Sdílet + Vyhledejte nebo zadejte adresu URL + No Recently Visited Sites. + Sdílet obr. + Odstr + Odstranit všechny soubory cookie? + Žádné záložky + St + Žádná historie + Led + Nastavení webového serveru + Ochrana osobních údajů a zabezpečení + Hotovo + Více oken + Earlier this month + Soubory cookie + Výchozí zobrazení + Zář + Heslo + Srp + Nastavení obsahu stránky + Čitelný + Vymazat hesla + Vložit + Uložit obrázek + Naver + Zapamatovat data formuláře + Upravit + Internet + Zobrazit obrázky + Dnes + Vybrat slovo + Včera + Název + Domovská stránka uživatele + Přizpůsobit na šířku + Vybráno + Jas + Nastavení + Vyprázdnit vyrovnávací paměť + about: blank + Vytvořit složku + Záložky + Zobr. obrázek + Sdílet pomocí e-mailu + Spustit JavaScript + Obnovit výchozí nastavení + Zadejte název záložky + Místo + Poslední týden + Sdílet prostřednictvím Facebooku + Složka + Nová složka + Záložka byla odebrána + Reset all settings to default? + Uložit + Nové okno + Povolit informace o poloze + Přidat + Pá + Blokovat autom. otevíraná okna + Ano + URL + Soukromí + Zrušit přístup k informacím o poloze + Před %d týdny + Záložka + Neplatná adresa + No History \nAfter you load pages, the history will be shown. + Historie + Ne + Zobrazit upozornění zabezpečení + Upravit záložku + Aktuální stránka + Sdílet pomocí Zpráv + Domovská stránka + Ručně + Vymazat data formuláře + Út + Říj + Čt + Nebylo nic nalezeno + Smazat historii + Úno + Failed to save Image + diff --git a/res/dan-DK.xml b/res/dan-DK.xml new file mode 100644 index 0000000..794514b --- /dev/null +++ b/res/dan-DK.xml @@ -0,0 +1,134 @@ + + + + Vælg alle + Nov + Mest besøgte steder + Close all + Luk + Skriftstørrelse + Dec + Bogmærke findes allerede + Acceptér cookies + Slet browseroversigt? + Slet lokalt gemt indhold og databaser? + Tøm alle cookie data + Man + Nej + Annullér + Del via Twitter + Sidste måned + Lør + Bogmærke tilføjet + Føj til Bogmærker + Spørg altid + Tom side + Jun + Auto + Jul. + Kopiér + Husk adgangskoder + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formulardata + Apr + Edit Folder + Maj + Find på side + Kopiér billede + Slettet + Mar + Yahoo + Søgemaskine + Søg + Del + Søg eller angiv URL + No Recently Visited Sites. + Del billede + Slet + Slet alle cookies? + Ingen bogmærker + Ons + Ingen artikler + Jan + Webside indstillinger + Fortrolighed og sikkerhed + Udført + Multi vindue + Earlier this month + Cookies + Standardvisning + Sep + Adgangskode + Aug + Indst. for sideindhold + Læsbar + Slet adgangskoder + Indsæt + Gem billede + Naver + Husk formulardata + Redigér + Internet + Vis billeder + I dag + Vælg ord + I går + Titel + Brugers startside + Tilpas til bredden + Valgte + Lysstyrke + Indstillinger + Ryd cache + about: blank + Opret mappe + Bogmærker + Vis billede + Del via e-mail + Kør JavaScript + Nulstil til standard + Indtast bogmærkenavn + Placering + Sidste uge + Del via Facebook + Mappe + Ny mappe + Bogmærke fjernet + Reset all settings to default? + Gem + Nyt vindue + Aktivér placering + Tilføj + Fre + Blokér popup-vinduer + Ja + URL + Beskyttelse + Ryd placeringsadgang + %d uger siden + Bogmærke + Ugyldig adresse + No History \nAfter you load pages, the history will be shown. + Oversigt + Søn + Vis sikkerhedsadvarsler + Redigér bogmærke + Aktuel side + Del via Meddelelser + Startside + Manuelt + Tøm formulardata + Tir + Okt + Tor + Ingen resultater fundet + Ryd historik + Feb + Failed to save Image + diff --git a/res/deu-DE.xml b/res/deu-DE.xml new file mode 100644 index 0000000..e45c203 --- /dev/null +++ b/res/deu-DE.xml @@ -0,0 +1,134 @@ + + + + Alle auswählen + Nov. + Häufig besuchte Seiten + Close all + Schließen + Schriftgröße + Dez. + Lesezeichen ist bereits vorhanden. + Cookies akzeptieren + Browser-Verlauf löschen? + Lokalen Inhalt und lokale Datenbanken aus dem Cache löschen? + Alle Cookiedaten löschen + Mo + Nein + Abbrechen + Über Twitter freigeben + Letzter Monat + Sa + Lesezeichen hinzugefügt + Zu Favoriten hinzufügen + Immer fragen + Leere Seite + Jun. + Auto + Jul. + Kopieren + Passwörter merken + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formulardaten + Apr. + Edit Folder + Mai + Auf Seite suchen + Bild kopieren + Gelöscht + Mär. + Yahoo + Suchmaschine + Suche + Senden via + URL suchen oder eingeben + No Recently Visited Sites. + Bild freigeb. + Löschen + Alle Cookies löschen? + Keine Favoriten + Mi + Keine Verläufe + Jan. + Website-Einstellungen + Datenschutz und Sicherheit + OK + Multi-Window + Earlier this month + Cookies + Standardansicht + Sep. + Passwort + Aug. + Seiteninhaltseinstellungen + Lesbar + Passwörter löschen + Einfügen + Bild speichern + Naver + Formulardaten speichern + Bearbeiten + Internet + Bilder anzeigen + Heute + Wort auswählen + Gestern + Titel + Benutzer-Startseite + An Breite anpassen + Ausgewählt + Helligkeit + Einstellungen + Cache leeren + about: blank + Ordner erstellen + Favoriten + Bild anzeigen + Senden via E-Mail + JavaScript ausführen + Auf Standard zurücksetzen + Namen des Lesezeichens eingeben + Standortzugriff + Letzte Woche + Über Facebook freigeben + Ordner + Neuer Ordner + Lesezeichen entfernt + Reset all settings to default? + Speichern + Neues Fenster + Standortzugriff aktivieren + Hinzufügen + Fr + Pop-ups blockieren + Ja + URL + Datenschutz + Standortzugriffsdaten löschen + Vor %d Wochen + Lesezeichen + Ungültige Adresse + No History \nAfter you load pages, the history will be shown. + Verlauf + So + Sicherheitswarnungen anzeigen + Favorit bearbeiten + Aktuelle Seite + Senden via Nachricht + Startseite + Manuell + Formulardaten löschen + Di + Okt. + Do + Keine Ergebnisse gefunden + Verlauf löschen + Feb. + Failed to save Image + diff --git a/res/ell-GR.xml b/res/ell-GR.xml new file mode 100644 index 0000000..bfbe5ea --- /dev/null +++ b/res/ell-GR.xml @@ -0,0 +1,134 @@ + + + + Επιλογή όλων + Noέμ + Δημοφιλέστερες τοποθεσίες + Close all + Κλείσιμο + Μέγεθος γραμματοσειράς + Δεκ + Ο σελιδοδείκτης υπάρχει ήδη + Αποδοχή των cookies + Διαγραφή ιστορικού προγράμματος περιήγησης; + Διαγραφή περιεχομένου και βάσεις δεδομένων της τοπικής μνήμης cache; + Διαγραφή όλων των δεδομένων cookie + Δευ. + Όχι + Άκυρο + Κοινή χρήση μέσω Twitter + Περασμένος μήνας + Σάβ. + Προστέθηκε σελιδοδείκτης + Προσθήκη στους σελιδ/τες + Να γίνεται πάντα ερώτηση + Κενή σελίδα + Ιούν + Αυτόματο + Ιούλ + Αντιγραφή + Απομνημόνευση κωδ. πρόσβ. + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Δεδομένα φορμών + Απρ + Edit Folder + Μάης + Εύρ. σε σελίδα + Αντιγραφή εικόνας + Διαγράφηκε + Μάρτ + Yahoo + Μηχανή αναζήτησης + Αναζήτηση + Κοινόχρηστο + Αναζήτηση ή εισαγωγή διεύθυνσης URL + No Recently Visited Sites. + Κοινή χρ.εικ. + Διαγρ. + Διαγραφή όλων των cookies; + Κανένας σελιδοδείκτης + Τετ. + Κανένα ιστορικό + Ιαν + Ρυθμίσεις τοποθεσίας Web + Ιδιωτικό απόρρητο και ασφάλεια + Ok + Πολλαπλά Παράθυρα + Earlier this month + Cookies + Προεπιλεγμένη προβολή + Σεπτ + Κωδικός πρόσβασης + Αυγ + Ρυθμ. περιεχομένου σελ. + Για ανάγνωση + Διαγραφή κωδ. πρόσβασης + Επικόλληση + Αποθ. εικόνας + Naver + Απομνημόνευση των δεδομένων φορμών + Επεξεργ. + Internet + Προβολή εικόνων + Σήμερα + Επιλογή λέξης + Xθές + Τίτλος + Αρχική σελίδα χρήστη + Προσαρμογή κατά πλάτος + Επιλεγμένο + Φωτεινότητα + Ρυθμίσεις + Διαγραφή μνήμης cache + about: blank + Δημ/ργία φακέλου + Προσθ.στους σελιδ/τες + Προβολή εικόνας + Κοινή χρήση μέσω email + Εκτέλεση JavaScript + Επαναφορά της προεπιλογής + Εισαγωγή ονόματος σελιδοδείκτη + Θέση + Προηγούμενη εβδομάδα + Κοινή χρήση μέσω Facebook + Φάκελος + Νέος φάκελος + Ο σελιδοδείκτης καταργήθηκε + Reset all settings to default? + Αποθ/ση + Νέο παράθυρο + Ενεργοποίηση τοποθεσίας + Προσθήκη + Παρ. + Αποκλεισμός αναδυόμ. παραθύρων + Ναι + URL + Απόρρητο + Εκκαθάριση πρόσβασης τοποθεσίας + Πριν %d εβδομάδες + Σελιδοδείκτης + Άκυρη διεύθυνση + No History \nAfter you load pages, the history will be shown. + Ιστορικό + Κυρ. + Εμφάνιση προειδοποιήσεων ασφαλείας + Επεξεργασία σελιδοδείκτη + Τρέχουσα σελίδα + Κοινή χρήση μέσω μηνυμάτων + Αρχική σελίδα + Χειροκίνητα + Διαγραφή δεδομένων φορμών + Τρ. + Οκτ + Πέμ. + Δεν βρέθηκαν αποτελέσματα + Εκκαθάριση ιστορικού + Φεβρ + Failed to save Image + diff --git a/res/eng-GB.xml b/res/eng-GB.xml new file mode 100644 index 0000000..eed6e23 --- /dev/null +++ b/res/eng-GB.xml @@ -0,0 +1,135 @@ + + + + Select all + Nov + Most visited sites + Close all + Close + Font size + Dec + Bookmark already exists + Accept cookies + Delete browser history? + Delete locally cached content and databases? + Clear all cookie data + Mon + No + Cancel + Share via Twitter + Last month + Sat + Bookmark added + Add to Bookmarks + Always ask + Blank page + Jun + Auto + Jul + Copy + Remember passwords + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Form data + Apr + Edit Folder + May + Find on page + Copy image + Deleted + Mar + Yahoo + Search engine + Search + Share + Search or enter URL + No Recently Visited Sites. + Share image + Delete + Delete all cookies? + No bookmarks + Wed + No histories + Jan + Website settings + Privacy and security + Done + Multi window + Earlier this month + Cookies + Default view + Sep + Password + Aug + Page content settings + Readable + Clear passwords + Paste + Save image + Naver + Remember form data + Edit + Internet + Display images + Today + Select word + Yesterday + Title + User homepage + Fit to width + Selected + Brightness + Settings + Clear cache + about: blank + Create folder + Bookmarks + View image + Share via Email + Run JavaScript + Reset to default + Enter bookmark name + Location + Last week + Share via Facebook + Folder + New folder + Bookmark removed + Reset all settings to default? + Save + New window + Enable location + Add + Fri + Block pop-ups + Yes + URL + Privacy + Clear location access + %d weeks ago + Bookmark + Invalid address + No History \nAfter you load pages, the history will be shown. + History + Sun + Show security warnings + Edit bookmark + Current page + Share via Messages + Homepage + Manual + Clear form data + Tue + Oct + Thu + No results found + Clear history + Feb + Failed to save Image + + diff --git a/res/eng-PH.xml b/res/eng-PH.xml new file mode 100644 index 0000000..2ccfa1d --- /dev/null +++ b/res/eng-PH.xml @@ -0,0 +1,134 @@ + + + + Select all + Nov. + Most visited sites + Close all + Close + Font size + Dec. + Bookmark already exists + Accept cookies + Delete browser history? + Delete locally cached content and databases? + Clear all cookie data + Mon + No + Cancel + Share via Twitter + Last month + Sat + Bookmark added + Add to Bookmarks + Always ask + Blank page + Jun. + Auto + Jul. + Copy + Remember passwords + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Form data + Apr. + Edit Folder + May + Find on page + Copy image + Deleted + Mar. + Yahoo + Search engine + Search + Share + Search or enter URL + No Recently Visited Sites. + Share image + Delete + Delete all cookies? + No bookmarks + Wed + No histories + Jan. + Website settings + Privacy and security + Done + Multi window + Earlier this month + Cookies + Default view + Sep. + Password + Aug. + Page content settings + Readable + Clear passwords + Paste + Save image + Naver + Remember form data + Edit + Internet + Display images + Today + Select word + Yesterday + Title + User homepage + Fit to width + Selected + Brightness + Settings + Clear cache + about: blank + Create folder + Bookmarks + View image + Share via Email + Run JavaScript + Reset to default + Enter bookmark name + Location + Last week + Share via Facebook + Folder + New folder + Bookmark removed + Reset all settings to default? + Save + New window + Enable location + Add + Fri + Block pop-ups + Yes + URL + Privacy + Clear location access + %d weeks ago + Bookmark + Invalid address + No History \nAfter you load pages, the history will be shown. + History + Sun + Show security warnings + Edit bookmark + Current page + Share via Messages + Homepage + Manual + Clear form data + Tue + Oct. + Thu + No results found + Clear history + Feb. + Failed to save Image + diff --git a/res/eng-US.xml b/res/eng-US.xml new file mode 100644 index 0000000..66d6149 --- /dev/null +++ b/res/eng-US.xml @@ -0,0 +1,134 @@ + + + + Select all + Nov. + Most visited sites + Close all + Close + Font size + Dec. + Bookmark already exists + Accept cookies + Delete browser history? + Delete locally cached content and databases? + Clear all cookie data + Mon + No + Cancel + Share via Twitter + Last month + Sat + Bookmark added + Add to Bookmarks + Always ask + Blank page + Jun. + Auto + Jul. + Copy + Remember passwords + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Form data + Apr. + Edit Folder + May + Find on page + Copy image + Deleted + Mar. + Yahoo + Search engine + Search + Share + Search or enter URL + No Recently Visited Sites. + Share image + Delete + Delete all cookies? + No bookmarks + Wed + No histories + Jan. + Website settings + Privacy and security + Done + Multi window + Earlier this month + Cookies + Default view + Sep. + Password + Aug. + Page content settings + Readable + Clear passwords + Paste + Save image + Naver + Remember form data + Edit + Internet + Display images + Today + Select word + Yesterday + Title + User homepage + Fit to width + Selected + Brightness + Settings + Clear cache + about: blank + Create folder + Bookmarks + View image + Share via email + Run JavaScript + Reset to default + Enter bookmark name + Location + Last week + Share via Facebook + Folder + New folder + Bookmark removed + Reset all settings to default? + Save + New window + Enable location + Add + Fri + Block pop-ups + Yes + URL + Privacy + Clear location access + %d weeks ago + Bookmark + Invalid address + No History \nAfter you load pages, the history will be shown. + History + Sun + Show security warnings + Edit bookmark + Current page + Share via Messages + Homepage + Manual + Clear form data + Tue + Oct. + Thu + No results found + Clear history + Feb. + Failed to save Image + diff --git a/res/est-EE.xml b/res/est-EE.xml new file mode 100644 index 0000000..1709188 --- /dev/null +++ b/res/est-EE.xml @@ -0,0 +1,134 @@ + + + + Vali kõik + Nov + Enim külastatud saidid + Close all + Sulge + Fondi suurus + Det. + Järjehoidja on juba olemas + Nõustu küpsistega + Kas kustutada baruseri ajalugu? + Kas tühjendada kohaliku vahemälu sisu ja andmebaasid? + Kustuta kõik küpsiste andmed + E + Ei + Tühista + Jaga Twitteris + Eelmine kuu + L + Järjehoidja lisatud + Lisa järjehoidjatesse + Küsi alati + Tühi leht + Jun. + Automaatne + Jul. + Kopeeri + Mäleta paroole + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Ankeedi andmed + Apr. + Edit Folder + Mai + Otsi lehelt + Kopeeri pilt + Kustutatud + Mär. + Yahoo + Otsingumootor + Otsi + Jaga + Otsige või sisestage URL + No Recently Visited Sites. + Jaga pilti + Kustuta + Kas kustutada kõik küpsised? + Järjehoidjaid ei ole + K + Ajalugu pole + Jan. + Veebisaidi seaded + Privaatsus ja turvalisus + Valmis + Mitmikaken + Earlier this month + Küpsised + Vaikevaade + Sept + Parool + Aug. + Lehekülje sisu seaded + Loetav + Kustuta paroolid + Kleebi + Salvesta pilt + Naver + Mäleta ankeedi andmeid + Muuda + Internet + Kuva pildid + Täna + Valige sõna + Eile + Pealkiri + Kasutaja avaleht + Mahuta laiusele + Valitud + Heledus + Seaded + Tühjenda vahemälu + about: blank + Loo kaust + Järjehoidjad + Kuva pilt + Jaga e-kirja kaudu + Käivita JavaScript + Lähtesta vaikeväärtusele + Sisestage järjehoidja nimi + Asukoht + Eelmine nädal + Jaga Facebookis + Kaust + Uus kaust + Järjehoidja on eemaldatud + Reset all settings to default? + Salvesta + Uus aken + Luba asukoht + Lisa + R + Blokeeri hüpikud + Jah + URL + Privaatsus + Tühista asukoha juurdepääs + %d nädalat tagasi + Järjehoidja + Kehtetu aadress + No History \nAfter you load pages, the history will be shown. + Ajalugu + P + Kuva turvahoiatused + Muuda järjehoidjat + Hetkel kuvatav leht + Jaga sõnumite kaudu + Avalehekülg + Käsitsi + Kustuta ankeedi andmed + T + Okt + N + Tulemusi ei leitud + Kustuta ajalugu + Veeb + Failed to save Image + diff --git a/res/eus-ES.xml b/res/eus-ES.xml new file mode 100644 index 0000000..7210078 --- /dev/null +++ b/res/eus-ES.xml @@ -0,0 +1,134 @@ + + + + Denak aukeratu + Aza. + Gehien bisitatutako guneak + Close all + Itxi + Letraren tamaina + Abe. + Lastermarka badago + Onartu cookieak + Ezabatu nabigatzailearen historia? + Ezabatu lokalki katxean gordetako edukia eta datu baseak? + Garbitu cookie datu guztiak + Asl. + Ez + Ezeztatu + Partekatu Twitter bidez + Joan den hilean + Lar. + Lastermarka gehitu da + Laster-marketara gehitu + Beti galdetu + Orri zuria + Eka. + Auto + Uzt. + Kopiatu + Gogoratu pasahitzak + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formularioko datuak + Api. + Edit Folder + Maiatza + Aurkitu orrian + Kopiatu irudia + Ezabatua + Mar. + Yahoo + Bilaketa motorra + Bilatu + Partekatu + Bilatu edo idatzi URLa + No Recently Visited Sites. + Part. irudia + Ezabatu + Cookie guztiak ezabatu? + Laster-markarik ez + Asz. + Historiarik ez + Urt. + Webgunearen ezarpenak + Pribatutasuna eta segurtasuna + Amaituta + Multi window + Earlier this month + Cookie-ak + Ikuspegi lehenetsia + Ira. + Pasahitza + Abu. + Orri edukiaren ezarpenak + Irakurgarria + Garbitu pasahitzak + Itsatsi + Irudia gorde + Naver + Gogoratu formulario datuak + Editatu + Internet + Irudiak erakutsi + Gaur + Aukeratu hitza + Atzo + Izenburua + Erabiltzailearen orri nagusia + Egokitu zabalerara + Aukeratutakoa(k) + Argitasuna + Ezarpenak + Cachea hustu + about: blank + Sortu karpeta + Laster-markak + Ikusi irudia + Partekatu email bidez + JavaScript abiarazi + Lehenetsira berrezarri + Idatzi laster-markaren izena + Kokalekua + Azkeneko astea + Partekatu Facebook bidez + Karpeta + Karpeta berria + Lastermarka kenduta + Reset all settings to default? + Gorde + Leiho berria + Gaitu kokapena + Gehitu + Otr. + Blokeatu agerkariak + Bai + URLa + Pribatutasuna + Garbitu kokapen sarrera + Duela %d aste + Laster-marka + Helbide baliogabea + No History \nAfter you load pages, the history will be shown. + Historia + Iga. + Erakutsi segurtasun oharrak + Laster-marka editatu + Uneko orria + Partekatu mezuen bidez + Hasiera orria + Eskuzkoa + Garbitu formularioko datuak + Asr. + Urr. + Osg. + Ez da emaitzarik aurkitu + Historia ezabatu + Ots. + Failed to save Image + diff --git a/res/fin-FI.xml b/res/fin-FI.xml new file mode 100644 index 0000000..113b3ef --- /dev/null +++ b/res/fin-FI.xml @@ -0,0 +1,134 @@ + + + + Valitse kaikki + Mar + Useimmin katsotut sivustot + Close all + Sulje + Kirjasinkoko + Jou + Kirjanmerkki on jo olemassa + Hyväksy evästeet + Poistetaanko selainhistoria? + Poistetaanko paikallisessa välimuistissa olevat sisällöt ja tietokannat? + Poista kaikki evästetiedot + Ma + Ei + Peruuta + Jaa Twitterin kautta + Edellinen kuukausi + La + Kirjanmerkki lisätty + Lisää kirjanmerkkeihin + Kysy aina + Tyhjä sivu + Kesä + Automaattinen + Hei + Kopioi + Muista salasanat + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Lomaketiedot + Huh + Edit Folder + Toukokuu + Etsi sivulta + Kopioi kuva + Poistettu + Maa. + Yahoo + Hakukone + Etsi + Jaa + Hae tai anna URL-osoite + No Recently Visited Sites. + Jaa kuva + Poista + Poistetaanko kaikki evästeet? + Ei kirjanmerkkejä + Ke + Historioita ei ole + Tam. + Sivuston asetukset + Yksityisyys ja tietoturva + Valmis + Moni-ikkuna + Earlier this month + Evästeet + Oletusnäkymä + Syys + Salasana + Elo + Sivun sisällön asetukset + Luku + Tyhjennä salasanat + Liitä + Tallenna kuva + Naver + Muista lomaketiedot + Muokkaa + Internet + Näytä kuvat + Tänään + Valitse sana + Eilen + Otsikko + Käyttäjän kotisivu + Sovita leveyteen + Valittu + Kirkkaus + Asetukset + Tyhjennä välimuisti + about: blank + Luo kansio + Kirjanmerkit + Näytä kuva + Jaa sähköpostin kautta + Suorita JavaScript + Palauta oletukset + Anna kirjanmerkin nimi + Osoite + Viime viikko + Jaa Facebookin kautta + Kansio + Uusi kansio + Kirjanmerkki poistettu + Reset all settings to default? + Tallenna + Uusi ikkuna + Ota sijainti käyttöön + Lisää + Pe + Estä ponnahdusikkunat + Kyllä + URL-osoite + Yksityisyys + Poista sijainnin käyttö + %d viikkoa sitten + Kirjanmerkki + Virheellinen osoite + No History \nAfter you load pages, the history will be shown. + Historia + Su + Näytä suojausvaroitukset + Muokkaa kirjanmerkkiä + Nykyinen sivu + Jaa viestien kautta + Kotisivu + Manuaalinen + Poista lomaketiedot + Ti + Lok + To + Tuloksia ei löytynyt + Tyhjennä historia + Hel + Failed to save Image + diff --git a/res/fra-CA.xml b/res/fra-CA.xml new file mode 100644 index 0000000..e956fab --- /dev/null +++ b/res/fra-CA.xml @@ -0,0 +1,134 @@ + + + + Sélectionner tout + Nov. + Sites les plus visités + Close all + Fermer + Taille de police + Déc. + Ce favori existe déjà + Accepter les témoins + Supprimer l'historique du navigateur ? + Supprimer les bases de données et le contenu en cache ? + Effacer toutes les données du témoin + Lun. + Non + Annuler + Partager via Twitter + Mois précédent + Sam. + Marque-page ajouté + Ajouter aux signets + Toujours demander + Page vierge + Jui. + Auto + Juil. + Copier + Mémoriser les MDP + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Données formulaire + Avr. + Edit Folder + Mai + Rechercher dans la page + Copier l'image + Supprimé + Mars + Yahoo + Moteur de recherche + Recherche + Partager + Rechercher ou entrer une URL + No Recently Visited Sites. + Partager l'image + Supp. + Supprimer tous les témoins? + Aucun favori + Mer. + Aucun historique + Jan. + Paramètres des sites Web + Confidentialité et sécurité + OK + Fenêtres multi. + Earlier this month + Témoins + Vue par défaut + Sep. + Mot de passe + Aou. + Param. contenu des pages + Lisible + Effacer les mots de passe + Coller + Enregistrer l'image + Naver + Mémoriser les données de formulaire + Modifier + Internet + Afficher les images + Aujourd'hui + Sélectionner un mot + Hier + Titre + Page d'accueil utilisateur + Ajuster selon largeur + Sélectionné + Luminosité + Paramètres + Vider le cache + about: blank + Créer dossier + Favoris + Afficher l'image + Partager par courriel + Exécuter JavaScript + Restaurer valeurs par défaut + Entrez le nom d'un favori + Emplacement + Dernière semaine + Partager via Facebook + Dossier + Nouveau dossier + Favori supprimé + Reset all settings to default? + Sauv. + Nouvelle fenêtre + Activer la localisation + Ajouter + Ven. + Bloquer fen. contextuelles + Oui + URL + Confidentialité + Effacer l'accès à la position + il y a %d semaines + Favori + Adresse invalide + No History \nAfter you load pages, the history will be shown. + Historique + Dim. + Afficher les avertissements de sécurité + Modifier le marque-page + Page en cours + Partager par messages + Page d'accueil + Manuel + Effacer les données de formulaire + Mar. + Oct. + Jeu. + Aucun résultat trouvé + Effacer l'historique + Fév. + Failed to save Image + diff --git a/res/fra-FR.xml b/res/fra-FR.xml new file mode 100644 index 0000000..62bc657 --- /dev/null +++ b/res/fra-FR.xml @@ -0,0 +1,134 @@ + + + + Sélect. tout + Nov. + Sites les plus visités + Close all + Fermer + Taille de la police + Déc. + Ce favori existe déjà + Accepter les cookies + Supprimer l'historique du navigateur ? + Supprimer les bases de données et le contenu en cache ? + Supprimer tous les cookies + Lun + Non + Annuler + Partager via Twitter + Mois précédent + Sam + Marque-page ajouté + Ajouter aux favoris + Toujours demander + Page vierge + Jui. + Auto. + Juil + Copier + Retenir les mots de passe + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Données formulaire + Avr. + Edit Folder + Mai + Rech. sur page + Copier l'image + Supprimé + Mars + Yahoo + Moteur de recherche + Rechercher + Partager + Rechercher ou entrer une URL + No Recently Visited Sites. + Part. image + Suppr. + Supprimer tous les cookies ? + Aucun favori + Mer + Aucun historique + Jan. + Paramètres des sites Web + Confidentialité et sécurité + Effectué + Fenêtres multiples + Earlier this month + Cookies + Vue par défaut + Sep. + Mot de passe + Aoû. + Param. contenu des pages + Lisible + Effacer les mots de passe + Coller + Enregistrer image + Naver + Se rappeler des données de formulaire + Modifier + Internet + Afficher les images + Aujourd'hui + Sélect. mot + Hier + Titre + Page d'accueil utilisateur + Ajuster selon largeur + Sélectionné + Luminosité + Paramètres + Vider le cache + about: blank + Créer dossier + Favoris + Afficher image + Partager par e-mail + Exécuter JavaScript + Restaurer valeurs par défaut + Entrez le nom d'un favori + Position + Dernière semaine + Partager via Facebook + Dossier + Nouveau dossier + Favori supprimé + Reset all settings to default? + Sauveg. + Nouvelle fenêtre + Activer la localisation + Ajouter + Ven + Bloquer les pop-ups + Oui + URL + Confidentialité + Effacer l'accès à la position + il y a %d semaines + Favori + Adresse non valide + No History \nAfter you load pages, the history will be shown. + Historique + Dim + Afficher les avertissements de sécurité + Modifier le marque-page + Page en cours + Partager par messages + Page d'accueil + Manuel + Supprimer les données de formulaire + Mar + Oct. + Jeu + Aucun résultat trouvé + Effacer l'historique + Fév. + Failed to save Image + diff --git a/res/gle-IE.xml b/res/gle-IE.xml new file mode 100644 index 0000000..63a3c74 --- /dev/null +++ b/res/gle-IE.xml @@ -0,0 +1,134 @@ + + + + Roghnaigh gach + Samh + Láithreáin is mó cuairt orthu + Close all + Dún + Méid an chló + Nol. + Tá an leabharmharc ann cheana + Glac le fianáin + Scrios stair an bhrabhsálaí? + Scrios inneachar agus bunachair shonraí a taisceadh go logánta? + Glan gach sonra fianáin + Luan + Ná déan é + Cuir ar ceal + Comhroinn le Twitter + An mhí seo caite + Sath + Leabharmharc curtha leis + Cuir le Leabharmharcanna + Iarr i gcónaí + Leathanach bán + Meit + Uath- + Iúil + Cóipeáil + Cuimhnigh ar phasfhocail + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Sonraí ar fhoirm + Aib. + Edit Folder + Bealtaine + Aimsigh ar lch. + Cóipeáil íomhá + Scriosta + Már. + Yahoo + Inneall cuardaigh + Cuardaigh + Comhroinn + Cuardaigh nó iontráil URL + No Recently Visited Sites. + C.roinn íomhá + Scrs + Scrios gach fianán? + Níl leabharmharcanna ann + Céad + Níl stair ann + Ean. + Socruithe láithreán Gréasáin + Príobháideacht agus slándáil + Déanta + Multi window + Earlier this month + Fianáin + Réamh-amharc + M.F. + Pasfhocal + Lún. + Soc. inneachar an lch. + Inléite + Glan pasfhocail + Greamaigh + Sábháil íomhá + Naver + Cuimhnigh sonraí foirme + Eagraigh + an tIdirlíon + Taispeáin íomhánna + Inniu + Roghnaigh focal + Inné + Teideal + Leathanach baile d'úsáideoirí + Oir don leithead + Roghnaithe + Gile + Socruithe + Glan taisce + about: blank + Déan fillteán + Leabharmharcanna + Amharc ar íomhá + Comhroinn le r-phost + Rith JavaScript + Athshocraigh go réamhshocraithe + Iontráil ainm an leabharmhairc + Suíomh + An tseachtain seo caite + Comhroinn le Facebook + Fillteán + Fillteán nua + Leabharmharc bainte + Reset all settings to default? + Sábháil + Fuinneog nua + Cumasaigh suíomh + Cuir leis + Aoin + Cuir bac ar mhíreanna aníos + Déan é + URL + Príobháideacht + Glan rochtain an tsuímh + %d seachtain ó shin + Leabharmharc + Seoladh neamhbhailí + No History \nAfter you load pages, the history will be shown. + Stair + Domh + Taispeáin rabhaidh shlándála + Cuir leabharmharc in eagar + Leathanach reatha + Comhroinn trí Theachtaireachtaí + Leathanach baile + Láimhe + Glan sonraí foirme + Már + D.F. + Déar + Níor aimsíodh torthaí + Glan stair + Feab + Failed to save Image + diff --git a/res/glg-ES.xml b/res/glg-ES.xml new file mode 100644 index 0000000..f1a5909 --- /dev/null +++ b/res/glg-ES.xml @@ -0,0 +1,134 @@ + + + + Seleccionar todo + Nov. + Sitios máis visitados + Close all + Pechar + Tamaño da fonte + Dec. + O favorito xa existe + Aceptar cookies + Desexas borrar o historial do navegador? + Desexas borrar contidos e bases de datos gardados localmente na caché? + Borrar todos os datos de cookies + Lun + Non + Cancelar + Compartir a través de Twitter + O mes pasado + Sáb + Favorito engadido + Engadir a Favoritos + Preguntar sempre + Páxina en branco + Xun. + Automático + Xul. + Copiar + Recordar contrasinais + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Datos do formulario + Abr. + Edit Folder + Mai. + Buscar en páx. + Copiar imaxe + Eliminado + Mar. + Yahoo + Motor de busca + Buscar + Compartir + Buscar ou introducir URL + No Recently Visited Sites. + Comp. imaxe + Elim. + Eliminar Todas as Cookies? + Sen favoritos + Mér + Non hai historiais + Xan. + Axustes do sitio Web + Privacidade e seguridade + Finalizado + Multi window + Earlier this month + Cookies + Vista predeterminada + Set. + Contrasinal + Ago. + Axust do contido da páx + Lexible + Borrar contrasinais + Pegar + Gardar imaxe + Naver + Recordar datos de formularios + Editar + Internet + Mostrar imaxes + Hoxe + Seleccionar palabra + Onte + Título + Páxina de inicio de usuario + Axustar anchura + Seleccionado + Brillo + Axustes + Borrar caché + about: blank + Crear carpeta + Favoritos + Ver imaxe + Compartir a través de correo electrónico + Executar JavaScript + Restablecer como predeterminado + Introduce o nome do favorito + Localización + Última semana + Compartir a través de Facebook + Carpeta + Nova carpeta + Favorito eliminado + Reset all settings to default? + Gardar + Nova ventá + Permitir localización + Engadir + Ven + Bloquear ventás emerxentes + Si + URL + Privacidade + Borrar acceso de localización + Hai %d semanas + Favorito + Enderezo non válido + No History \nAfter you load pages, the history will be shown. + Historial + Dom + Mostrar advertencias de seguridade + Editar favorito + Páxina actual + Compartir a través de Mensaxes + Páxina de inicio + Manual + Borrar datos de formularios + Mar + Out. + Xov + Non se atoparon resultados + Borrar historial + Feb. + Failed to save Image + diff --git a/res/hin-IN.xml b/res/hin-IN.xml new file mode 100644 index 0000000..ae81ee5 --- /dev/null +++ b/res/hin-IN.xml @@ -0,0 +1,134 @@ + + + + सभी चुनें + नव. + अधिकतम भेंट दिए साइट्स + Close all + बंद करें + फॉन्ट आकार + दिस. + बुकमार्क पहले से मौजूद है + कुकीज स्‍वीकारें + ब्राउज़र इतिहास हटाएँ? + स्थानीय कैचे सामग्री और डाटाबेस हटाएँ? + सभी कुकीज़ डेटा साफ़ करें + सोम + नहीं + रद्द + ट्विटर के द्वारा साझा करें + अंतिम महीना + शनि + बुकमार्क जोड़ा गया + बुकमार्क्स में जोड़ें + हमेशा पूछें + खाली पेज + जून + स्वतः + जुल. + कॉपी करें + पासवर्ड्स याद रखें + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + फ़ॉर्म डेटा + अप. + Edit Folder + मई + पेज़ पर ढूँढें + छवि कॉपी करें + हटाया गया + मा. + Yahoo + खोज इंजन + खोजें + शेयर करें + खोजें या URL दर्ज करें + No Recently Visited Sites. + छवि शेयर करें + हटाएँ + सभी कुकीज़ डिलीट करें? + कोई बुकमार्क नहीं + बुध + इतिहास नहीं + जन. + वेबसाइट सेटिंग + गोपनीयता और सुरक्षा + हुआ + मल्टी विंडो + Earlier this month + कुकीज + डीफ़ॉल्ट दृश्य + सित. + पासवर्ड + अग. + पेज सामग्री सेटिंग्स + पढ़ने योग्य + पासवर्ड्‍स साफ़ करें + पेस्ट करें + छवि सुरक्षित करें + Naver + फॉर्म डाटा याद रखें + संपादन + इंटरनेट + छवियाँ दर्शाएँ + आज + शब्‍द चुनें + बीता हुआ कल + शीर्षक + उपयोगकर्ता होमपेज + चौड़ाई में फिट करें + चुना गया + चमक + सेटिंग्स + कैचे साफ़ करें + about: blank + फ़ोल्‍डर बनाएँ + बुकमार्क्स + छवि देखें + ईमेल के द्वारा साझा करें + जावा स्क्रिप्ट चलाएँ + डिफॉल्‍ट में रीसेट करें + बुकमार्क का नाम दर्ज करें + स्थान + पिछला सप्ताह + फ़ेसबुक के द्वारा साझा करें + फोल्डर + नया फ़ोल्‍डर + बुकमार्क निकाला गया + Reset all settings to default? + सेव + नई विंडो + स्थान सक्षम करें + जोड़ें + शुक्र + पॉप-अप अवरुद्ध करें + हाँ + URL + गोपनीयता + स्थान ऍक्सेस साफ करें + %d सप्ताह पहले + बुकमार्क + अमान्य पता + No History \nAfter you load pages, the history will be shown. + इतिहास + रवि + सुरक्षा चेतावनियां दिखाएँ + बुकमार्क संपादित करें + वर्तमान पेज + संदेशो के द्वारा साझा करें + होमपेज + मैनुअल + फ़ॉर्म डेटा साफ़ करें + मंगल + अक. + गुरु + कोई परिणाम नहीं मिले + इतिहास साफ़ करें + फ़र + Failed to save Image + diff --git a/res/hrv-HR.xml b/res/hrv-HR.xml new file mode 100644 index 0000000..b404e06 --- /dev/null +++ b/res/hrv-HR.xml @@ -0,0 +1,134 @@ + + + + Odaberi sve + Stu + Najposjećenija mjesta + Close all + Prekid + Veličina slova + Pro + Oznaka se već koristi + Prihvati kolačiće + Obrisati povijest preglednika? + Obrisati lokalno spremljeni sadržaj i baze podataka? + Obriši sve podatke kolačića + Pon + Ne + Prekid + Dijeli putem Twittera + Prošli mjesec + Sub + Dodano u favorite + Dodaj u Favorite + Uvijek pitaj + Prazna stranica + Lip + Auto + Srp + Kopiraj + Zapamti šifre + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Podaci formi + Tra + Edit Folder + Svibanj + Traži na stranici + Kopiraj sliku + Obrisano + Ožu + Yahoo + Pretraživač + Traži + Dijeli + Potražite ili unesi URL + No Recently Visited Sites. + Dijeli sliku + Obriši + Obrisati sve kolačiće? + Nema favorita + Sri + Nema povijesti + Sij + Postavke web stranice + Privatnost i sigurnost + OK + Više prozora + Earlier this month + Kolačići + Zadani prikaz + Ruj + Šifra + Kol + Postavke stranice + Čitljivo + Obriši šifre + Zalijepi + Spremi sliku + Naver + Zapamti unose obrazaca + Uredi + Internet + Prikaz slika + Danas + Odaberite riječ + Jučer + Naslov + Poč. str. korisnika + Prilagodi širini + Odabrano + Svjetlina + Postavke + Obriši međuspremnik + about: blank + Nova mapa + Favoriti + Prikaži sliku + Dijeljenje preko emaila + Pokreni JavaScript + Vrati na zadano + Unesite naziv favorita + Lokacija + Zadnji tjedan + Dijeli putem Facebooka + Mapa + Nova mapa + Favorit uklonjen + Reset all settings to default? + Spremi + Novi prozor + Uključi lokaciju + Dodaj + Pet + Blokiraj pop-up prozore + Da + Adresa + Privatnost + Obriši pristup lokaciji + Prije %d tjedana + Favorit + Neispravna adresa + No History \nAfter you load pages, the history will be shown. + Povijest + Ned + Prikaži sigurnosna upozorenja + Uredi favorita + Trenutna stranica + Dijeljenje preko poruka + Početna stranica + Ručno + Obriši unose obrazaca + Uto + Lis + Čet + Nema rezultata + Brisanje povijesti + Velj + Failed to save Image + diff --git a/res/hun-HU.xml b/res/hun-HU.xml new file mode 100644 index 0000000..98f50f3 --- /dev/null +++ b/res/hun-HU.xml @@ -0,0 +1,134 @@ + + + + Összes kijelölése + nov. + Leggyakrabban látogatott helyek + Close all + Bezárás + Betűméret + dec. + Már van ilyen könyvjelző + Cookie-k elfogadása + Törli a böngészőelőzményeket? + Törli a helyi gyorsítótárba helyezett tartalmat és adatbázisokat? + Minden cookie törlése + Hét + Nem + Mégse + Megosztás a Twitteren + Elmúlt hónap + Szo + Könyvjelző hozzáadva + Könyvjelző mentése + Mindig kérdezzen rá + Üres oldal + jún. + Auto. + júl. + Másol + Jelszót megjegyez + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Űrlap adatok + ápr. + Edit Folder + máj. + Keresés az oldalon + Kép másolása + Törölve + már. + Yahoo + Kereső + Keresés + Megosztás + Keressen vagy írjon be URL-t + No Recently Visited Sites. + Kép megoszt. + Töröl + Törli a cookie-kat? + Nincs könyvjelző + Sze + Nincsenek előzmények + jan. + Webhelybeállítások + Adatvédelem és biztonság + Kész + Több ablak + Earlier this month + Cookie-k + Alapértelmezett nézet + szep + Jelszó + aug. + Oldaltartalom beállításai + Olvasható + Jelszavak törlése + Beilleszt + Kép mentése + Naver + Űrlapadatok megjegyzése + Szerkeszt + Internet + Képek megjelenítése + Ma + Szó kiválasztása + Tegnap + Cím + Felhasználó kezdőlapja + Szélességhez + Kiválasztott + Fényerő + Beállítások + Gyorsítótár ürítése + about: blank + Mappát létrehoz + Könyvjelzők + Képet megtekint + Megosztás e-mailben + JavaScript futtatása + Alapértelmezés visszaállítása + Adja meg a könyvjelző nevét + Hely + Utolsó hét + Megosztás a Facebookon + Mappa + Új mappa + Könyvjelző eltávolítva + Reset all settings to default? + Ment + Új ablak + Hely engedélyezése + Hozzáad + Pén + Előugró ablakok blokkolása + Igen + URL + Védett adataim + Helyadatok törlése + %d héttel ezelőtt + Könyvjelző + Érvénytelen cím + No History \nAfter you load pages, the history will be shown. + Előzmények + Vas + Biztonsági figyelmeztetések + Könyvjelző szerkesztése + Jelenlegi oldal + Megosztás üzenetben + Kezdőlap + Kézi + Űrlapadatok törlése + Ke + okt. + Csü + Nincs találat + Előzmények törlése + feb. + Failed to save Image + diff --git a/res/hye-AM.xml b/res/hye-AM.xml new file mode 100644 index 0000000..34866af --- /dev/null +++ b/res/hye-AM.xml @@ -0,0 +1,134 @@ + + + + Ընտրել բոլորը + Նոյ + Առավել այցելված կայքեր + Close all + Փակել + Տառաչափ + Դեկտ + Էջանիշն արդեն գոյություն ունի + Ընդունել թխուկները + Վերացնե՞լ զննարկչի պատմությունը: + Վերացնե՞լ հիշապահեստում տեղայնորեն պահված բովանդակությունն ու տվյալների շտեմարանները: + Ջնջել թխուկների ողջ տվյալները + Երկ + Ոչ + Չեղարկել + Համօգտագործել Twitter-ի միջոցով + Անցյալ ամիս + Շբթ + Էջանիշն ավելացվել է + Ավելացնել Էջանիշերում + Միշտ հարցնել + Դատարկ էջը + Հուն + Ավտոմատ + Հուլ + Պատճենել + Հիշել գաղտնաբառերը + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Ձևի տվյալներ + Ապր. + Edit Folder + Մայ + Գտնել էջում + Պատճենել պատկեր + Ջնջված է + Մրտ + Yahoo + Որոնիչ + Որոնել + Համատեղ օգտագործում + Որոնել կամ մուտքագրել URL + No Recently Visited Sites. + Հմօգտ. պատկեր + Ջնջել + Ջնջե՞լ բոլոր թխուկները + Էջանիշներ չկան + Չրք + Պատմություններ չկան + Հնվ + Կայքի դրվածքներ + Գաղտնիություն և անվտանգություն + Պատրաստ + Բազմապատուհան + Earlier this month + Cookies + Կանխադրված դիտում + Սպտ + Գաղտնաբառ + Օգս + Էջի բվնդկության դրվածքներ + Ընթեռնելի + Մաքրել գաղտնաբառերը + Տեղադրել + Պահպանել պատկերը + Naver + Հիշել տվյալներից + Խմբագրել + Ինտերնետ + Ցուցադրել պատկերներ + Այսօր + Ընտրել բառ + Երեկ + Վերնագիր + Օգտվողի հիմնաէջ + Տեղավորել լայնքի վրա + Ընտրված + Պայծառություն + Պարամետրեր + Դատարկել հիշապահեստը + about: blank + Ստեղծել թղթպանակ + Էջանիշեր + Տեսնել պատկերը + Համօգտագործել էլփոստի միջոցով + Գործարկել JavaScript + Զրոյացնել լռելյայնի + Մուտքագրեք էջանիշի անվանումը + Գտնվելու վայր + Վերջին շաբաթ + Համօգտագործել Facebook-ի միջոցով + Թղթապանակ + Նոր թղթապանակ + Էջանիշը հեռացվեց + Reset all settings to default? + Պահել + Նոր պատուհան + Ընձեռել տեղ + Ավելացնել + Ուրբ + Արգելափակել ելնող պատուհանները + Այո + URL + Գաղտնիություն + Մաքրել տեղի մուտքը + %d շաբաթ առաջ + Էջանիշ + Անվավեր հասցե + No History \nAfter you load pages, the history will be shown. + Պատմություն + Կիր + Ցուցադրել անվտանգության զգուշացումները + Խմբագրել էջանիշը + Ընթացիկ էջ + Համօգտագործել Հաղորդագրությունների միջոցով + Սկզբնական էջ + Ձեռքով + Ջնջել տվյալներից + Երք + Հոկտ + Հնգ + Արդյունքներ չեն գտնվել + Մաքրել պատմությունը + Փտրվ + Failed to save Image + diff --git a/res/isl-IS.xml b/res/isl-IS.xml new file mode 100644 index 0000000..87c0fce --- /dev/null +++ b/res/isl-IS.xml @@ -0,0 +1,134 @@ + + + + Velja allt + nóv. + Mest opnuð svæði + Close all + Loka + Leturstærð + Des. + Bókamerkið er þegar til + Samþykkja fótspor + Eyða vafrasögu? + Eyða gagnagrunnum og staðbundnu efni í skyndiminni? + Hreinsa öll fótsporagögn + Mán + Nei + Hætta við + Samnýta um Twitter + Síðasti mánuð + Lau + Bókamerki bætt við + Bæta við Bókamerki + Spyrja alltaf + Auð síða + Jún. + Sjálfvirkt + Júl. + Afrita + Muna lykilorð + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Innsláttargögn + apr. + Edit Folder + Maí + Finna á síðu + Afrita mynd + Eytt + Mar. + Yahoo + Leitarvél + Leit + Samnýta + Leita eða slá inn vefslóð + No Recently Visited Sites. + Samnýta mynd + Eyða + Viltu eyða öllum fótsporum? + Ný bókamerki + Mið + Engin saga + Jan. + Vefsíðustillingar + Gagnaleynd og öryggi + Lokið + Margir gluggar + Earlier this month + Fótspor + Sjálfgefin skjár + Sep. + Aðgangsorð + ág. + Efnisstillingar síðu + Læsileg + Hreinsa lykilorð + Líma + Vista mynd + Naver + Vista innslegnar upplýsingar + Breyta + Internetið + Birta myndir + Í dag + Velja orð + Í gær + Titill + Heimasíða notanda + Fella að breidd + Valið + Birtustig + Stillingar + Hreinsa skyndiminni + about: blank + Búa til möppu + Bókamerki + Skoða mynd + Samnýta með tölvupósti + Keyra Java-vefforskrift + Endurstilla á sjálfgildi + Sláðu inn heiti bókamerkis + Staðsetning + Síðasta vika + Birta í gegnum Facebook + Mappa + Ný mappa + Bókamerki fjarlægt + Reset all settings to default? + Vista + Nýr gluggi + Virkja staðsetningu + Bæta við + Fös + Loka fyrir sprettiglugga + Já + Vefslóð + Leynd + Hreinsa aðgang að staðsetningu + Fyrir %d vikum + Bókamerki + Ógilt veffang + No History \nAfter you load pages, the history will be shown. + Saga + Sun + Sýna öryggisviðvaranir + Breyta bókamerki + Opin síða + Samnýta með skilaboðum + Heimasíða + Handvirkt + Hreinsa innslegnar upplýsingar + Þri + okt. + Fim + Ekkert fannst + Hreinsa feril + feb. + Failed to save Image + diff --git a/res/ita-IT.xml b/res/ita-IT.xml new file mode 100644 index 0000000..672750e --- /dev/null +++ b/res/ita-IT.xml @@ -0,0 +1,134 @@ + + + + Seleziona tutto + Nov + Siti più visitati + Close all + Chiudi + Dimensioni carattere + Dic + Preferito già esistente + Accetta cookie + Eliminare cronologia browser? + Eliminare contenuto della cache e database locali? + Cancella tutti i dati cookie + Lun + No + Annulla + Condividi con Twitter + Ultimo mese + Sab + Preferito aggiunto + Aggiungi a Preferiti + Chiedi sempre + Pagina vuota + Giu + Automatica + Lug + Copia + Ricorda password + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Dati modulo + Apr + Edit Folder + Maggio + Trova nella pagina + Copia immagine + Eliminato/i + Mar + Yahoo + Motore di ricerca + Cerca + Condividi + Cerca o immetti URL + No Recently Visited Sites. + Condiv. immag. + Elimina + Eliminare tutti i cookie? + Nessun preferito + Mer + Nessuna cronologia + Gen + Impostazioni sito web + Privacy e sicurezza + Fatto + Multischermo + Earlier this month + Cookie + Vista predefinita + Set + Password + Ago + Impost. contenuto pagina + Leggibile + Cancella password + Incolla + Salva immagine + Naver + Ricorda dati modulo + Modifica + Internet + Visualizza immagini + Oggi + Parola + Ieri + Titolo + Pagina iniziale utente + Adatta a larghezza + Selezionato + Luminosità + Impostazioni + Svuota cache + about: blank + Crea cartella + Preferiti + Vedi immagine + Condividi con e-mail + Esegui JavaScript + Ripristina impostazioni predefinite + Inserisci nome preferito + Posizione + Ultima settimana + Condividi con Facebook + Cartella + Nuova cartella + Segnalibro rimosso + Reset all settings to default? + Salva + Nuova finestra + Attiva localizzazione + Aggiungi + Ven + Blocca pop-up + Sì + URL + Privacy + Cancella accesso posizione + %d settimane fa + Preferito + Indirizzo non valido + No History \nAfter you load pages, the history will be shown. + Cronologia + Dom + Mostra avvisi di sicurezza + Modifica preferito + Pagina corrente + Condividi con Messaggi + Homepage + Manuale + Cancella dati modulo + Mar + Ott + Gio + Nessun risultato trovato + Cancella cronologia + Feb + Failed to save Image + diff --git a/res/jpn-JP.xml b/res/jpn-JP.xml new file mode 100644 index 0000000..7f9368d --- /dev/null +++ b/res/jpn-JP.xml @@ -0,0 +1,134 @@ + + + + 全て選択 + 11月 + よく見るサイト + Close all + 閉じる + 文字サイズ + 12月 + ブックマークは既に存在します。 + Cookieを許可 + 保存された閲覧履歴を消去しますか? + 保存された全てのキャッシュ情報を消去しますか? + Cookieを消去 + 月 + いいえ + キャンセル + Twitterで共有 + 先月 + 土 + ブックマークが追加されました + ブックマークに追加 + 毎回確認 + 空白のページ + 6月 + 自動 + 7月 + コピー + パスワードを保存 + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 文字入力履歴 + 4月 + Edit Folder + 5月 + ページ内を検索 + 画像をコピー + 削除しました。 + 3月 + Yahoo + 検索エンジン + 検索 + 共有 + 検索、またはURLを入力 + No Recently Visited Sites. + 画像を共有 + 削除 + 保存された全てのCookieを消去しますか? + ブックマークがありません。 + 水 + 履歴がありません。 + 1月 + Webサイト設定 + プライバシーとセキュリティ + 完了 + マルチウィンドウ + Earlier this month + Cookie + 基本表示モード + 9月 + パスワード + 8月 + ページコンテンツ設定 + 判読可能 + パスワードを消去 + 貼り付け + 画像を保存 + Naver + 文字入力履歴を保存 + 編集 + インターネット + 画像表示 + 今日 + テキスト選択 + 昨日 + タイトル + ユーザーホームページ + 幅に合わせる + 選択済み + 明るさ + 設定 + キャッシュを消去 + about: blank + フォルダ作成 + ブックマーク + 画像を表示 + Eメールで共有 + JavaScriptを実行 + 初期値にリセット + ブックマーク名を入力してください。 + 場所 + 先週 + Facebookで共有 + フォルダ + 新規フォルダ + ブックマークが削除されました。 + Reset all settings to default? + 保存 + 新規ウィンドウ + 位置情報を有効にする + 追加 + 金 + ポップアップをブロック + はい + URL + プライバシー + 位置情報を消去 + %d週間前 + ブックマーク + アドレスが正しくありません。 + No History \nAfter you load pages, the history will be shown. + 履歴 + 日 + セキュリティ警告を表示 + ブックマークを編集 + 現在のページ + メッセージで共有 + ホームページ + 手動 + 文字入力履歴を消去 + 火 + 10月 + 木 + 検索結果がありません。 + 履歴を消去 + 2月 + Failed to save Image + diff --git a/res/kat-GE.xml b/res/kat-GE.xml new file mode 100644 index 0000000..b39137e --- /dev/null +++ b/res/kat-GE.xml @@ -0,0 +1,134 @@ + + + + ყველას არჩევა + ნოე. + ყველაზე ხშირად ნანახი საიტები + Close all + დახურვა + შრიფტის ზომა + დეკ. + სანიშნე უკვე არსებობს + ქუქი–ფაილების მიღება + წაშლით ბრაუზერის ისტორიას? + წაშლით ადგილობრივ ქეშ-მეხსიერებაში შენახული მასალებსა და მონაცემთა ბაზებს? + ყველა ქუქი–მონაცემების გასუფთავება + ორშ. + არა + გაუქმება + გაზიარება Twitter-ით + გასული თვე + შაბ. + სანიშნე დაემატა + სანიშნეებში დამატება + ყოველთვის მკითხე + ცარიელი გვერდი + ივნ. + ავტომატური + ივლ. + ასლი + დაიმახსოვრეთ პაროლები + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + ფორმის მონაცემები + აპრ. + Edit Folder + მაისი + გვერდზე პოვნა + სურათის ასლის გადაღება + წაშლილია + მარ. + Yahoo + საძიებო სისტემა + ძიება + გაზიარება + მოძებნეთ ან ჩაწერეთ URL + No Recently Visited Sites. + გააზიარე სურ. + წაშლა + წავშალო ყველა ფუნთუშა-ფაილი? + ჩემი ნიშნულები + ოთხ. + ისტორიები არ არის + იან. + ვებსაიტის პარამეტრები + კონფიდენციალურობა და უსაფრთხოება + შესრულდა + რამდენიმე ფანჯარა + Earlier this month + ქუქი-ფაილები + ნაგულისხმევი ხედი + სექ. + პაროლი + აგვ. + გვერდის შინაარსის პარამ. + წაკითხვადი + პაროლების წაშლა + ჩასმა + სურათის შენახვა + Naver + ფორმის მონაცემების დამახსოვრება + შესწორება + ინტერნეტი + ეკრანის სურათები + დღეს + აირჩიეთ სიტყვა + გუშინ + სათაური + მომხმარებლის საწყისი გვერდი + მორგება სიგანეზე + შერჩეული + სიკაშკაშე + პარამეტრები + ქეშის გასუფთავება + about: blank + საქაღალდის შექმნა + სანიშნი + სურათის ნახვა + გაზიარება ელ.ფოსტით + JavaScript-ის გაშვება + ავტო. პარამეტრის დაბრუნება + ჩაწერეთ სანიშნის სახელი + ადგილმდებ. + გასული კვირა + გაზიარება Facebook-ით + საქაღალდე + ახალი საქაღალდე + სანიშნე მოცილდა + Reset all settings to default? + შენახვა + ახალი ფანჯარა + ლოკაციის ჩართვა + დამატება + პარ. + ამოსახტომი ფანჯრების დაბლოკვა + დიახ + URL + პირადი + გაასუფთავეთ ლოკაციაზე წვდომის მონაცემი + %d კვირის წინ + სანიშნე + მისამართი არასწორია + No History \nAfter you load pages, the history will be shown. + ისტორია + კვ. + უსაფრთხოების გაფრთხილებების ჩვენება + ნიშნულის შეცვლა + მიმდინარე გვერდი + გაზიარება წერილებით + საწყისი გვერდი + მექანიკური + ფორმის მონაცემების გასუფთავება + სამ. + ოქტ. + ხუთ. + შედეგები არ მოიძებნა + ისტორიის გასუფთავება + თებ. + Failed to save Image + diff --git a/res/kaz-KZ.xml b/res/kaz-KZ.xml new file mode 100644 index 0000000..ac97f8c --- /dev/null +++ b/res/kaz-KZ.xml @@ -0,0 +1,134 @@ + + + + Бәрін бөлектеу + Қар + Көп кіретін сайттар + Close all + Жабу + Шрифт өлшемі + Жел + Бетбелгі бұрыннан бар + Куки файлдарын қабылдау + Браузер журналын жою керек пе? + Жергілікті кэштелген мазмұн мен дерекқорларды жою керек пе? + Барлық куки деректерін өшіру + Дүй + Жоқ + Тоқтату + Twitter арқылы бөлісу + Соңғы ай + Сен + Бетбелгі қосылды + Бетбелгілерге қосу + Әрқашан сұрау + Бос бет + Мау + Авто + Шіл + Көшіру + Құпиясөзді сақтау + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Үлгі деректері + Сәу + Edit Folder + Maм. + Беттен табу + Сурет көшіру + Жойылды + Нау + Yahoo + Іздеу механизмі + Іздеу + Байланысқа жол + URL мекенжайын іздеу немесе енгізу + No Recently Visited Sites. + Сурет бөлісу + Жою + Барлық «куки» файлдарын жою керек пе? + Бетбелгі жоқ + Сәр + Журналдар жоқ + Қаң + Веб-сайт параметрлері + Құпиялық және қауіпсіздік + Дайын + Көп терезе + Earlier this month + Cookies + Әдепкі көрініс + Қыр + Кілтсөз + Там + Бет мазмұны параметрлері + Оқылатын + Құпия сөзді жою + Қою + Көріністі сақтау + Naver + Деректерден еске сақтау + Өзгер. + Шолушы + Суреттерді көрсету + Бүгін + Сөз таңдау + Кеше + Тақырыбы + Пайдаланушының бастапқы беті + Еніне сәйкес келу + Таңдалды + Ашықтығы + Қондырғ-р + Кэшті тазарту + about: blank + Қалта жасау + Қосымшалар + Суретті көру + Электрондық пошта арқылы бөлісу + JavaScript орындау + Стандартты бапстапқы мәндеріне баптау + Бетбелгі атын енгізіңіз + Орналасу орны + Соңғы апта + Facebook арқылы бөлісу + Қалта + Жаңа қалта + Бетбелгі жойылды + Reset all settings to default? + Сақтау + Жаңа терезе + Орнын қосу + Қосу + Жұм + Қалқымалы терезелерді бұғаттау + Иә + URL + Құпия + Орнына кіруді тазалау + %d апта бұрын + Белгі қосу + Мекен-жай жарамсыз + No History \nAfter you load pages, the history will be shown. + Тарих + Жек + Қауіпсіздік ескертулерін көрсету + Қосымшаны өзгерту + Ағымдағы бет + Хабарлар арқылы бөлісу + Үй беті + Қолмен + Формадағы деректерді өшіру + Сей + Қаз + Бей + Ешқандай нәтиже табылмады + Журналды тазарту + Ақп + Failed to save Image + diff --git a/res/kor-KR.xml b/res/kor-KR.xml new file mode 100644 index 0000000..83ab635 --- /dev/null +++ b/res/kor-KR.xml @@ -0,0 +1,134 @@ + + + + 모두 선택 + 11월 + 자주 방문한 웹사이트 + Close all + 닫기 + 글자 크기 + 12월 + 이미 있는 북마크입니다 + 쿠키 허용 + 웹사이트 방문 기록을 삭제할까요? + 캐시에 저장된 컨텐츠와 데이터베이스를 삭제할까요? + 모든 쿠키 삭제 + 월 + 아니요 + 취소 + Twitter로 공유 + 지난 달 + 토 + 북마크가 추가되었습니다 + 북마크에 추가 + 항상 묻기 + 빈 페이지 + 6월 + 자동 + 7월 + 복사 + 비밀번호 저장 + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 양식 데이터 + 4월 + Edit Folder + 5월 + 페이지 내에서 검색 + 이미지 복사 + 삭제되었습니다 + 3월 + Yahoo + 검색 엔진 + 검색 + 공유 + URL을 검색하거나 입력하세요 + No Recently Visited Sites. + 사진 공유 + 삭제 + 모든 쿠키를 삭제할까요? + 북마크가 없습니다 + 수 + 기록이 없습니다 + 1월 + 웹사이트 설정 + 개인정보 보호 및 보안 + 완료 + 멀티윈도우 + Earlier this month + 쿠키 + 기본 화면 + 9월 + 비밀번호 + 8월 + 페이지 컨텐츠 설정 + 읽을 수 있는 크기 + 비밀번호 삭제 + 붙여넣기 + 이미지 저장 + Naver + 양식 데이터 저장 + 편집 + 인터넷 + 이미지 보기 + 오늘 + 단어 선택 + 어제 + 제목 + 사용자 홈페이지 + 너비에 맞추기 + 단일 선택 + 밝기 + 설정 + 캐시 삭제 + about: blank + 폴더 추가 + 북마크 + 이미지 보기 + 이메일을 통해 공유 + 자바 스크립트 실행 + 기본값으로 초기화 + 북마크 이름을 입력하세요 + 위치 + 마지막 주 + Facebook으로 공유 + 폴더 + 새 폴더 + 북마크가 삭제되었습니다 + Reset all settings to default? + 저장 + 새 창 + 위치 정보 사용 + 추가 + 금 + 팝업 차단 + 예 + URL + 개인정보 보호 + 위치 정보 삭제 + %d주 전 + 북마크 + 주소가 바르지 않습니다 + No History \nAfter you load pages, the history will be shown. + 기록 + 일 + 보안 경고 보기 + 북마크 편집 + 현재 페이지 + 메시지로 공유합니다 + 홈페이지 + 수동 + 양식 데이터 삭제 + 화 + 10월 + 목 + 검색 결과가 없습니다 + 기록 삭제 + 2월 + Failed to save Image + diff --git a/res/lav-LV.xml b/res/lav-LV.xml new file mode 100644 index 0000000..76b2150 --- /dev/null +++ b/res/lav-LV.xml @@ -0,0 +1,134 @@ + + + + Izv. visu + Nov. + Biežāk apmeklētās vietnes + Close all + Aizvērt + Fonta lielums + Dec. + Grāmatzīme jau pastāv + Pieņemt sīkfailus + Vai dzēst pārlūka vēsturi? + Vai dzēst vietējās kešatmiņas saturu un datu bāzes? + Notīrīt visus sīkfailu datus + Pr. + Nē + Atcelt + Koplietot, izmantojot Twitter + Pagājušais mēnesis + Se. + Pievienota grāmatzīme + Pievienot grāmatzīmēm + Jautāt vienmēr + Tukša lapa + Jūn. + Automātiski + Jūl. + Kopēt + Atcerēties paroles + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Veidlapas dati + Apr. + Edit Folder + Maijs + Meklēt lapā + Kopēt attēlu + Izdzēsts + Mar. + Yahoo + Meklētājprogramma + Meklēt + Koplietot + Meklējiet vai ievadiet vietrādi URL + No Recently Visited Sites. + Kopl. attēlu + Dzēst + Vai izdzēst visus sīkfailus? + Nav grāmatzīmes + Tr. + Nav vēstures + Jan. + Tīmekļa vietnes iestatījumi + Konfidencialitāte un drošība + Gatavs + Vairāki logi + Earlier this month + Sīkfaili + Noklusējuma skats + Sep. + Parole + Aug. + Lapas satura iestatījumi + Lasāma + Notīrīt paroles + Ielīmēt + Saglabāt attēlu + Naver + Iegaumēt veidlapas datus + Rediģēt + Internets + Rādīt attēlus + Šodien + Izv. vārdu + Vakar + Nosaukums + Lietotāja sākumlapa + Pielāgot platumam + Izvēlēts + Spilgtums + Iestatījumi + Iztīrīt kešatmiņu + about: blank + Izveidot mapi + Grāmatzīmes + Skatīt attēlu + Koplietot, izmantojot e-pastu + Palaist JavaScript + Atjaunot noklusējumu + Ievadiet grāmatzīmes nosaukumu + Atrašanās vieta + Pēdējā nedēļa + Koplietot, izmantojot Facebook + Mape + Jauna mape + Grāmatzīme noņemta + Reset all settings to default? + Saglabāt + Jauns logs + Aktivizēt atrašanās vietu + Pievienot + Pk. + Bloķēt uznirstošos logus + Jā + URL + Konfidencialitāte + Notīrīt atrašanās vietas piekļuvi + Pirms %d nedēļām + Grāmatzīme + Nederīga adrese + No History \nAfter you load pages, the history will be shown. + Vēsture + Sv. + Rādīt drošības brīdinājumus + Rediģēt grāmatzīmi + Pašreizējā lapa + Koplietošana, izmantojot Ziņas + Mājas lapa + Manuāli + Notīrīt veidlapas datus + Ot. + Okt. + Ce. + Nav atrasts neviens rezultāts + Nodzēst vēsturi + Feb. + Failed to save Image + diff --git a/res/lit-LT.xml b/res/lit-LT.xml new file mode 100644 index 0000000..4f714fb --- /dev/null +++ b/res/lit-LT.xml @@ -0,0 +1,134 @@ + + + + Pasirinkti viską + Lap. + Dažniausiai lankomos svetainės + Close all + Uždaryti + Šrifto dydis + Gru. + Adresyno įrašas jau yra + Priimti slapukus + Trinti naršyklės istoriją? + Ištrinti įrenginyje saugomą turinį ir duomenų bazes? + Pašalinti visus slapukų duomenis + Pir. + Ne + Atšaukti + Bendrinti per „Twitter“ + Paskutinis mėnuo + Šeš. + Žymelė pridėta + Pridėti prie adresyno įrašų + Visada klausti + Tuščias puslapis + Bir. + Automatinis + Lie. + Kopijuoti + Prisiminti slaptažodžius + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formos duomenys + Bal. + Edit Folder + Geg. + Iešk. puslapyje + Kopijuoti vaizdą + Ištrinta + Kov. + Yahoo + Paieškos sistema + Ieškoti + Dalytis + Ieškoti arba įvesti URL + No Recently Visited Sites. + Bendr. vaizdą + Trinti + Ištrinti visus slapukus? + Žymeklių nėra + Tre. + Istorijos nėra + Sau. + Svetainės nustatymai + Privatumas ir sauga + Atlikta + Keli langai + Earlier this month + Slapukai + Numatytasis vaizdas + Rug. + Slaptažodis + Rgp. + Puslapio turinio nustat. + Nuskaitoma + Išvalyti slaptažodžius + Įklijuoti + Išsaugoti vaizdą + Naver + Prisiminti formos duomenis + Redaguoti + Internetas + Rodyti vaizdus + Šiandien + Pasirinkite žodį + Vakar + Pavadinimas + Pagrindinis naudotojo puslapis + Pritaikyti pagal plotį + Pasirinkta + Ryškumas + Nustat. + Valyti talpyklą + about: blank + Kurti aplanką + Žymelės + Žiūrėti pav. + Bendrinti per el. paštą + Vykdyti „JavaScript“ + Nustatyti į numatytąjį + Čia įveskite žymeklio pavadinimą + Vieta + Praėjusią savaitę + Bendrinti per „Facebook“ + Aplankas + Naujas aplankas + Adresyno įrašas pašalintas + Reset all settings to default? + Išsaugoti + Naujas langas + Įjungti vietą + Pridėti + Pen. + Blokuoti iškylančiuosius lang. + Taip + URL + Privatumas + Ištrinti vietos prieigą + Prieš %d sav. + Adresyno įrašas + Neteisingas adresas + No History \nAfter you load pages, the history will be shown. + Istorija + Sek. + Rodyti apsaugos įspėjimus + Redaguoti žymelę + Dabartinis puslpais + Bendrinti per žinutes + Pradinis puslapis + Rankinis + Išvalyti formos duomenis + Ant. + Spal. + Ket. + Rezultatų nerasta + Išvalyti istoriją + Vas. + Failed to save Image + diff --git a/res/mkd-MK.xml b/res/mkd-MK.xml new file mode 100644 index 0000000..d47fcbe --- /dev/null +++ b/res/mkd-MK.xml @@ -0,0 +1,134 @@ + + + + Избери ги сите + Ное. + Најпосетувани сајтови + Close all + Затвори + Големина на букви + Дек. + Омилената страница веќе постои + Прифаќај колачиња + Да се избрише историјата на прегледникот? + Да се избрише локално кешираната содржина и бази? + Избриши ги сите податоци за колачињата + Пон + Не + Откажи + Сподели преку Twitter + Последниот месец + Саб + Омилената страница е додадена + Додај во Омилени + Прашувај секогаш + Празна страница + Јун + Автоматски + Јул + Копирај + Памети лозинки + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Податоци за формулари + Апр + Edit Folder + Мај + Најди на стр. + Копирај слика + Избришано + Март + Yahoo + Пребарувач + Побарај + Сподели + Пребарајте или внесете URL + No Recently Visited Sites. + Сподели слика + Избр. + Избриши сите колачиња? + Нема сочувани страници + Сре + Нема истории + Јан + Опции за сајт + Приватност и безбеднсот + Готово + Повеќе прозорци + Earlier this month + Колачиња + Основен преглед + Сеп + Лозинка + Авг + Опции за содрж. на стр. + Читливо + Избриши ги лозинките + Пресликај + Меморирај слика + Naver + Запомни податоци за формулар + Измени + Интернет + Прикажи слики + Денес + Изберете збор + Вчера + Наслов + Корисничка почетна страница + На цела широчина + Избраните + Светлина + Опции + Избриши кеш-меморија + about: blank + Нова папка + Сочувани адреси + Види слика + Подели преку email + Активирај JavaScript + Ресетирај на основните вредности + Внесете име на омилената страница + Локација + Последна седмица + Сподели преку Facebook + Папка + Нова папка + Омилената страница е отстранета + Reset all settings to default? + Сочувај + Нов прозорец + Овозможи локација + Додај + Пет + Блокирај појавни прозорци + Да + URL + Доверливо + Избриши пристап кон локација + Пред %d недели + Омилена страница + Неправилна адреса + No History \nAfter you load pages, the history will be shown. + Историја + Нед + Прикажи безбедносни предупредувања + Измени омилена стр. + Тековна страница + Сподели преку Пораки + Почетна стр. + Рачно + Избриши податоци за формулари + Вто + Окт. + Чет + Нема резултати + Избриши историја + Фев + Failed to save Image + diff --git a/res/nld-NL.xml b/res/nld-NL.xml new file mode 100644 index 0000000..4f9d4fd --- /dev/null +++ b/res/nld-NL.xml @@ -0,0 +1,134 @@ + + + + Alles selecteren + nov + Meest bezochte sites + Close all + Sluiten + Tekstgrootte + dec + Favoriet bestaat al + Cookies accepteren + Browsergeschiedenis verwijderen? + Inhoud in lokale cache en databases verwijderen? + Alle cookiegegevens wissen + MA + Nee + Annuleren + Delen via Twitter + Vorige maand + ZA + Favoriet toegevoegd + Toevoegen aan Favorieten + Altijd vragen + Lege pagina + jun + Automatisch + jul + Kopiëren + Wachtwoorden onthouden + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formuliergegevens + apr + Edit Folder + Mei + Zoek op pagina + Afbeelding kopiëren + Verwijderd + mrt + Yahoo + Zoekmachine + Zoeken + Delen + URL zoeken of ingeven + No Recently Visited Sites. + Afbld. delen + Wissen + Alle cookies wissen? + Geen favorieten + WO + Geen geschiedenis + jan + Website-instellingen + Privacy en beveiliging + Gereed + Multi window + Earlier this month + Cookies + Standaardweergave + sep + Wachtwoord + aug + Instellingen pagina-inhoud + Leesbaar + Wachtwoorden wissen + Plakken + Afbeelding opslaan + Naver + Formuliergegevens onthouden + Bewerken + Internet + Afbeeldingen weergeven + Vandaag + Woord selecteren + Gisteren + Titel + Startpagina gebruiker + Passend in breedte + Geselecteerd + Helderheid + Instellingen + Buffer leegmaken + about: blank + Map maken + Favorieten + Afbeelding bekijken + Delen via e-mail + JavaScript uitvoeren + Standaardinstellingen + Geef naam favoriet in + Locatie + Laatste week + Delen via Facebook + Map + Nieuwe map + Favoriet verwijderd + Reset all settings to default? + Opslaan + Nieuw venster + Locatie activeren + Toevoegen + VR + Pop-ups blokkeren + Ja + URL + Privacy + Toegang tot locatie wissen + %d weken geleden + Favorieten + Ongeldig adres + No History \nAfter you load pages, the history will be shown. + Geschiedenis + ZO + Beveiligingswaarschuwingen weergeven + Favoriet bewerken + Huidige pagina + Delen via Berichten + Startpagina + Handmatig + Formuliergegevens wissen + DI + okt + DO + Geen resultaten gevonden + Geschiedenis wissen + feb + Failed to save Image + diff --git a/res/nob-NO.xml b/res/nob-NO.xml new file mode 100644 index 0000000..5f60817 --- /dev/null +++ b/res/nob-NO.xml @@ -0,0 +1,134 @@ + + + + Merk alt + Nov. + Mest besøkte sider + Close all + Lukk + Skriftstørrelse + Des. + Bokmerket finnes allerede + Godta informasjonskapsler + Slette nettleserhistorikk? + Slette lokalt bufret innhold og databaser? + Tøm alle informasjonskapseldata + Man + Nei + Avbryt + Del via Twitter + Forrige måned + Lør + Bokmerke lagt til + Legg til i Bokmerker + Spør alltid + Tom side + Juni + Auto + Juli + Kopier + Husk passord + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Skjemadata + Apr. + Edit Folder + Mai + Finn på side + Kopier bilde + Slettet + Mars + Yahoo + Søkemotor + Søk + Del + Søk eller angi URL + No Recently Visited Sites. + Del bilde + Slett + Slette alle informasjonskapsler? + Ingen bokmerker + Ons + Ingen poster + Jan. + Innstillinger for webområde + Personvern og sikkerhet + Utført + Flervindu + Earlier this month + Informasjonskapsler + Standard visning + Sep. + Passord + Aug. + Innst. for sideinnhold + Lesbar + Tøm passord + Lim inn + Lagre bilde + Naver + Husk skjemadata + Rediger + Internett + Vis bilder + I dag + Velg ord + I går + Tittel + Brukerangitt hjemmeside + Tilpass til bredde + Valgt + Lysstyrke + Innstillinger + Tøm mellomlager + about: blank + Lag mappe + Bokmerker + Vis bilde + Del via e-post + Kjør Java-skript + Tilbakestill til standard + Angi bokmerkenavn + Sted + Siste uke + Del via Facebook + Mappe + Ny mappe + Bokmerke fjernet + Reset all settings to default? + Lagre + Nytt vindu + Aktiver plassering + Legg til + Fre + Blokker popups + Ja + URL + Personvern + Fjern plasseringstilgang + %d uker siden + Bokmerke + Ugyldig adresse + No History \nAfter you load pages, the history will be shown. + Historikk + Søn + Vis sikkerhetsvarsler + Rediger bokmerke + Gjeldende side + Del via Meldinger + Startside + Manuelt + Tøm skjemadata + Tir + Okt. + Tor + Fant ingen resultater + Tøm logg + Feb. + Failed to save Image + diff --git a/res/pol-PL.xml b/res/pol-PL.xml new file mode 100644 index 0000000..333e847 --- /dev/null +++ b/res/pol-PL.xml @@ -0,0 +1,134 @@ + + + + Zaznacz wszystko + Lis. + Najczęściej odwiedzane witryny + Close all + Zamknij + Rozmiar czcionki + Gru. + Zakładka już istnieje + Odbiór plików cookie + Usunąć historię przeglądania? + Usunąć zawartość lokalnej pamięci podręcznej oraz bazy danych? + Usuń wszystkie pliki cookie + Pn + Nie + Anuluj + Udostępnij przez Twitter + Ostatni miesiąc + So + Zakładka została dodana + Dodaj do zakładek + Zawsze pytaj + Pusta strona + Cze. + Automatyczny + Lip. + Kopiuj + Pamiętaj hasła + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Dane formularzy + Kwi. + Edit Folder + Maj + Znajdź na str. + Skopiuj obraz + Usunięto + Mar. + Yahoo + Wyszukiwarka + Szukaj + Udostępnij + Wyszukaj lub wprowadź adres URL + No Recently Visited Sites. + Udost. obraz + Usuń + Usunąć wszystkie pliki cookie? + Brak zakładek + Śr + Brak historii + Sty. + Ustawienia witryn internetowych + Prywatność i bezpieczeństwo + Gotowe + Wiele okien + Earlier this month + Pliki cookie + Widok domyślny + Wrz. + Hasło + Sie. + Ust. zawartości strony + Można odczytać + Wyczyść hasła + Wklej + Zapisz obraz + Naver + Zapamiętaj dane formularza + Edytuj + Internet + Wyświetl obrazy + Dzisiaj + Wybierz słowo + Wczoraj + Tytuł + Strona główna użytkownika + Dopasuj do szerokości + Wybrany + Jasność + Ustawienia + Wyczyść cache + about: blank + Utwórz katalog + Zakładki + Wyświetl obraz + Udostępnij poprzez wiadomość email + Uruchom JavaScript + Przywróć domyślne + Wprowadź nazwę zakładki + Miejsce + Ostatni tydzień + Udostępnij przez Facebook + Katalog + Nowy katalog + Usunięto zakładkę + Reset all settings to default? + Zapisz + Nowe okno + Włącz lokalizację + Dodaj + Pt + Blokuj wyskakujące okna + Tak + Adres URL + Prywatność + Wyczyść dostęp do lokalizacji + %d tyg. temu + Zakładka + Nieprawidłowy adres + No History \nAfter you load pages, the history will be shown. + Historia + Nd + Ostrzeżenia zabezpieczeń + Edytuj zakładkę + Bieżąca strona + Udostępnij w wiadomości + Strona domowa + Ręcznie + Wyczyść dane formularza + Wt + Paź. + Cz + Nie znaleziono wyników + Wyczyść historię + Lut. + Failed to save Image + diff --git a/res/por-BR.xml b/res/por-BR.xml new file mode 100644 index 0000000..d321e75 --- /dev/null +++ b/res/por-BR.xml @@ -0,0 +1,134 @@ + + + + Selecionar tudo + Nov. + Sites mais visitados + Close all + Fechar + Tamanho de fonte + Dez. + O indicador já existe + Aceitar cookies + Excluir histórico do navegador? + Excluir conteúdo em cache local e bancos de dados? + Limpar todos os dados de cookies + Seg + Não + Cancelar + Compartilhar via Twitter + Mês passado + Sáb + Favorito adicionado + Adicionar aos Favoritos + Perguntar sempre + Página em branco + Jun. + Automático + Jul. + Copiar + Lembrar senhas + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Dados do formulário + Abr. + Edit Folder + Maio + Encontrar na página + Copiar imagem + Apagado + Mar. + Yahoo + Mecanismo de pesquisa + Pesquisar + Compartilhar + Procurar ou inserir URL + No Recently Visited Sites. + Compartilhar imagem + Apagar + Apagar todos os cookies? + Sem favoritos + Qua + Nenhum histórico + Jan. + Configurações de site da Internet + Privacidade e segurança + Concluído + Multi janela + Earlier this month + Cookies + Vista padrão + Set. + Senha + Ago. + Def. conteúdo de página + Legível + Limpar senhas + Colar + Salvar imagem + Naver + Lembrar dados de formulário + Editar + Internet + Exibir imagens + Hoje + Selecionar palavra + Ontem + Título + Página inicial do usuário + Ajustar à largura + Selecionado + Brilho + Configurações + Excluir cache + about: blank + Criar pasta + Favoritos + Ver imagem + Compartilhar via e-mail + Executar JavaScript + Restaurar padrão + Inserir nome do favorito + Local + Última semana + Compartilhar via Facebook + Pasta + Nova pasta + Marcador removido + Reset all settings to default? + Salvar + Nova janela + Ativar localização + Adicionar + Sex + Bloquear pop-ups + Sim + URL + Privacidade + Limpar acesso à localização + há %d semanas + Favoritos + Endereço inválido + No History \nAfter you load pages, the history will be shown. + Histórico + Dom + Exibir avisos de segurança + Editar favorito + Página atual + Compartilhar via Mensagens + Página inicial + Manual + Limpar dados de formulário + Ter + Out. + Qui + Nenhum resultado encontrado + Limpar histórico + Fev. + Failed to save Image + diff --git a/res/por-PT.xml b/res/por-PT.xml new file mode 100644 index 0000000..c269c0b --- /dev/null +++ b/res/por-PT.xml @@ -0,0 +1,134 @@ + + + + Selec. tudo + Nov. + Sites mais visitados + Close all + Fechar + Tamanho da fonte + Dez. + Favorito já existe + Aceitar cookies + Eliminar o histórico do browser? + Eliminar conteúdo na memória cache local e bases de dados? + Limpar todos os dados de cookies + Seg. + Não + Cancelar + Partilhar via Twitter + Mês passado + Sáb. + Favorito adicionado + Adicionar aos Favoritos + Perguntar sempre + Página em branco + Jun. + Automático + Jul. + Copiar + Lembrar palavras-passe + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Dados do formulário + Abr. + Edit Folder + Maio + Local. na pág. + Copiar imagem + Eliminado + Mar. + Yahoo + Motor de pesquisa + Procurar + Partilhar + Procurar ou introduzir URL + No Recently Visited Sites. + Part. imagem + Eliminar + Eliminar todos os cookies? + Nenhum favorito + Qua. + Nenhuns históricos + Jan. + Definições de site da Web + Privacidade e segurança + Concluído + Multi Janela + Earlier this month + Cookies + Vista padrão + Set. + Palavra-passe + Ago. + Def. conteúdo de página + Legível + Limpar palavras-passe + Colar + Guardar imagem + Naver + Lembrar dados de formulário + Editar + Internet + Visualizar imagens + Hoje + Selec. palavra + Ontem + Título + Página inicial do utilizador + Ajustar à largura + Seleccionado + Brilho + Definições + Limpar cache + about: blank + Criar pasta + Favoritos + Ver imagem + Partilhar via e-mail + Executar JavaScript + Repor padrão + Introduzir nome do favorito + Localização + Última semana + Partilhar via Facebook + Pasta + Nova pasta + Favorito removido + Reset all settings to default? + Guardar + Nova janela + Activar localização + Adicionar + Sex. + Bloquear janelas de contexto + Sim + URL + Privacidade + Limpar acesso à localização + há %d semanas + Favorito + Endereço inválido + No History \nAfter you load pages, the history will be shown. + Histórico + Dom. + Mostrar avisos de segurança + Editar favoritos + Página actual + Partilhar via Mensagens + Página inicial + Manual + Limpar dados de formulário + Ter. + Out. + Qui. + Nenhuns resultados encontrados + Limpar histórico + Fev. + Failed to save Image + diff --git a/res/ron-RO.xml b/res/ron-RO.xml new file mode 100644 index 0000000..60f8f8c --- /dev/null +++ b/res/ron-RO.xml @@ -0,0 +1,134 @@ + + + + Selectare toate + Nov + Site-urile cele mai vizitate + Close all + Închidere + Dimensiune font + Dec + Marcajul există deja + Acceptare module cookie + Ştergeţi istoricul browserului? + Ştergeţi conţinutul stocat în memoria cache la nivel local şi bazele de date? + Ştergere integrală date module cookie + Lun + Nu + Anulare + Partajare prin Twitter + Luna trecută + Sâm + Marcaj adăugat + Adăugare la Marcaje + Se întreabă întotdeauna + Pagină goală + Iun + Automat + Iul + Copiere + Memorare parole + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Date formular + Apr + Edit Folder + Mai + Găsire în pag. + Copiere imagine + Şters + Mar + Yahoo + Motor de căutare + Căutare + Partajare + Căutaţi sau introduceţi adresa URL + No Recently Visited Sites. + Partaj. imag. + Şter. + Ştergeţi toate modulele cookie? + Niciun marcaj + Mie + Niciun istoric + Ian + Setări pentru site-uri web + Confidenţialitate şi securitate + Gata + Ferestre + Earlier this month + Module cookie + Vizualizare implicită + Sep + Parolă + Aug + Setări conţinut pagină + Lizibil + Ştergere parole + Lipire + Salvare imagine + Naver + Memorare date formular + Editare + Internet + Afişare imagini + Azi + Selectaţi un cuvânt + Ieri + Titlu + Pagina de pornire a utilizatorului + Încadrare pe lăţime + Selectat + Luminozitate + Setări + Ştergere cache + about: blank + Creare folder + Marcaje + Viz. imagine + Partajare prin e-mail + Executare JavaScript + Reiniţializare la valori implicite + Introduceţi numele marcajului + Locaţie + Ultima săptămână + Partajare prin Facebook + Folder + Folder nou + Marcaj eliminat + Reset all settings to default? + Salvare + Fereastră nouă + Activare locaţie + Adaugă + Vin + Blocare ferestre de tip pop-up + Da + URL + Confidenţialitate + Autorizare acces la locaţie + Acum %d săptămâni + Marcaj + Adresă incorectă + No History \nAfter you load pages, the history will be shown. + Istoric + Dum + Afişare avertismente de securitate + Editare marcaj + Pagină actuală + Partajare prin Mesaje + Pagină de pornire + Manual + Ştergere date formular + Mar + Oct + Joi + Nu au fost găsite rezultate + Ştergere istoric + Feb + Failed to save Image + diff --git a/res/rus-RU.xml b/res/rus-RU.xml new file mode 100644 index 0000000..dfba50c --- /dev/null +++ b/res/rus-RU.xml @@ -0,0 +1,134 @@ + + + + Выбрать все + Ноя + Часто посещаемые сайты + Close all + Закрыть + Размер шрифта + Дек + Закладка уже существует + Разрешить cookies + Удалить журнал браузера? + Удалить локально кэшированное содержимое и базы данных? + Удалить cookies + Пн + Нет + Отмена + Отправить в Twitter + Последний месяц + Сб + Закладка добавлена + Добавить в Закладки + Всегда спрашивать + Пустая страница + Июн + Авто + Июл + Копировать + Сохранять пароли + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Данные формы + Апр + Edit Folder + Май + Найти на странице + Копировать изображение + Удалено + Мар + Yahoo + Поисковая система + Поиск + Поделиться + Выполните поиск или введите URL-адрес + No Recently Visited Sites. + Картинки + Удал. + Удалить все cookies? + Нет закладок + Ср + Нет журналов + Янв + Настройки веб-сайтов + Конфиденциальность и безопасность + Готово + Несколько окон + Earlier this month + Файлы Cookie + По умолчанию + Сен + Пароль + Авг + Параметры содерж.страницы + Для чтения + Очистить пароли + Вставить + Сохранить картинку + Naver + Сохранять данные форм + Изменить + Интернет + Показывать картинки + Сегодня + Выберите слово + Вчера + Название + Домашняя страница пользователя + По ширине + Выбрано + Яркость + Настройки + Очистить кэш + about: blank + Создать папку + Закладки + Просмотр картинки + Отправить по электронной почте + Выполнять JavaScript + Восстановить настройки по умолчанию + Введите имя закладки + Местоположение + Последняя неделя + Отправить в Facebook + Папка + Новая папка + Закладка удалена + Reset all settings to default? + Соxранить + Новое окно + Включить местоположение + Добавить + Пт + Блокировать всплыв. сообщения + Да + URL + Конфиденциальность + Удалить данные о местоположении + %d нед. назад + Закладка + Неверный адрес + No History \nAfter you load pages, the history will be shown. + Журнал + Вс + Предупреждать о безопасности + Редактировать закладку + Текущая страница + Отправить с помощью сообщения + Домашняя страница + Вручную + Очистить данные форм + Вт + Окт + Чт + Ничего не найдено + Очистить журнал + Фев + Failed to save Image + diff --git a/res/screen-density-xhigh/00_button_off.png b/res/screen-density-xhigh/00_button_off.png new file mode 100644 index 0000000000000000000000000000000000000000..a87a8dc3259a2d5e9dfd0d09c7024b420064ddf0 GIT binary patch literal 4295 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_on.png b/res/screen-density-xhigh/00_button_on.png new file mode 100644 index 0000000000000000000000000000000000000000..43212d748f8ac50ee07bd124d5398f3218a30524 GIT binary patch literal 4608 zcmV+b694UqP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 BwPXMQ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_radio_selected.png b/res/screen-density-xhigh/00_button_radio_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..7b00666b8db74829b4409d78428d8f67e86e4fa0 GIT binary patch literal 3835 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_sweep_delete.9.png b/res/screen-density-xhigh/00_button_sweep_delete.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7b154ab011ae280b3e03067e7d32bd9f647f66 GIT binary patch literal 980 zcmV;_11tQAP){x)+Vq0ei`4rTb_8mGUD;b$kwegx^0_`?c6D+a&jijtSyAM;6Cc}jT`9co;@;> zlk?Xeqn?Zm@n>a?n>BXW(XqpazrHFiwuOGzpOq!eZueKS#_lb4y>D&(Ho9ZS&u4dP z7&WD(eKTw9URn1Coamnmva{71Qc}dMvBlmuHOVjrnRKkNQHF6on4*sjZP`Lqzh+Go zv3H@63}$9h=~zR94C3l$s!vXK#@+%Oz#vml#p>&2VDn}w6?+4$AA?L3*0*UBRo&{< z3Kk4X-^PtpD)t)KBMdU>SY4ew+OUDDZq+Jh>=m$w>(^7&GFUGLnRKkSR(joTs@jz+ zow1iSHS%EHI;t8Cdjae|2AMc4J)Np%#R>(hu9kai*HTq$*z>9?xto?oRh^U+MeG@{ zJE^HuRVr3lDYx-khp8$tQNaQMxs7`}lZrhBb_;_{l^PZSb`y6{rpo2ZXJIk}tEiA3 z+^3iVGclQsm6uBo?gmVOgoIhxjJG)s>;?vz{=jCRv$3)=xsDGoQw4?LGsjdBAMcEf zmX^vjT-i(%){Q}?auvhh{@u73naYE_ zha|;(z6$5m{`hj&| zkV(giiliepmWsm8E?7Wi;nhVC>jQQMgG@TMf4`iWKc7m+3JWQy9r+Zj^Ik#0lo@QF zH_x#Xm??^jn=)(cu$Bwkw}0ut-9W>_IA?oZt}kYd9hMTv$cUWBExCQ}T-%NTvv8f| zr>95E8pmzIP(s2)8y1|z!qd|_j<200009?sHp~=J+o1599(a0XRx3i~RU2M9$yUJb75Vqi$35T~fQz^FG*S8Uq~H_9-Xb;)k%HXV8^kU_q;P@~y9kkj+}LZxE;Kcf zIBquU$5s$K50QfW*g1$4j)`Kg5SxNXL2m3NVv`Ul9F-nB3z32_wv1Q?A_cG1*bBtY zK%^i)b{ZlDRcdSru~QH!$c;TmEDe#u5xFs+j}%JrnBW~ye59)NG+q{|g8?nZjYc-s z*;(f^TCw@rk&*38TbnQzYHek%o}O(!qZPBq1_vvXcour0L`%#5^RnA3d`9<}Fl4n> zqb3s@$99t#{z(E`3t~k)MeP3`E|^I(`WrYL*P-rgEt5$OQ) s(9voZtTi01^3PfF(dxf_k&f_x07q}F_v6x0BLDyZ07*qoM6N<$g1drNhyVZp literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_circle_button_Expand_closed.png b/res/screen-density-xhigh/00_circle_button_Expand_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..83e67629d52343594253365ac46ea483fc7378c4 GIT binary patch literal 7318 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_circle_button_Expand_open.png b/res/screen-density-xhigh/00_circle_button_Expand_open.png new file mode 100644 index 0000000000000000000000000000000000000000..85e99f911f9c9bcb0f3d0a9cfb66f8968ea1ec86 GIT binary patch literal 7148 zcmV004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 Y01ETHC0GGL#Q*>R07*qoM6N<$f;1Q#z5oCK literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/2.png b/res/screen-density-xhigh/2.png new file mode 100644 index 0000000000000000000000000000000000000000..32ff6458ce480fa64f72e5e8db49ac15ed96bc4c GIT binary patch literal 1020 zcmVE=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#o=HSORCwBA{Qv(y11`VK@Ni2i46V#?POuZ=URXOVkE{Z zDBb`OAg{n2bOwmuLFxZ6SHm2HVKz`FBNGE201F{TH1YogT?-IEcqNIk669c5#Nf09 z=6!5&0s}r!`a3p1;M2GRh)sa_FF~imVgeS?g#3tX<9Db(7;&imPnA#w2q3aGGBJ<| zkmC_O_c34#I9NQg;PO1S$S20BAcg*DV#c`Q5e7Vw%K{{D2AZO_;<9l&5VI3-I#!J! z8+D;cj)9mYhioGq;t@|8CEBU@0_DiSrB#3cBHKoC0TTnA0Y+p1b0sH``bKVuVW~<8 z`p|eV1nC+y*Aq(9|DjlmTnj^x(mkjcVkT0bA~6{XU;JzV;*C^IG&sO4Af5@tPoZoO zNC2e?T3MJzvupt^hZxC7t+0xWnOq;9C9}D0;y+U7H5Z6a(j()y0x=hKM8J&J z^1|N*cUA926zZJ2K7M4W*?? zO{Ky>tO5-ha;m4LDNHDnQQ`qwUh6Zy`W{ z(LD}_eTa^Fkd|F1bU=%8j@IQSxiRR(0GasvPX~O7npGj*LI!EN<_w)924pciy<(7a zAW|M(@*tT2)R$Yy02zk74{e}&0CC_@FGWF}9c^geu?C3MfjAlJ;UH*#qk~Md`H}J{ zs0&|8%{)kG`Wpt)86e~Cpec&0XmZPdI2y|SKxFTM5zT`i(B#4MpVTTvi2*aAA$%1} zfl&`-yOP*78q^j2WoVLRhvvlO})hES%PP za32th4NxirHOsmNQ)8P_zys}nmO|^%K~aj{W`K-P(-ZuqXDO-&ZD>EGLr3@^5SueV qR-sbXn;0q8#Ha^HJviz?+5rIHR1Kj~wDXt%0000E=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#)k#D_RCwBA{Qv(y11`V{^fn%wmM{0tC#Q?H+Bc3!$v>)*~`N+VfRe%5@+eUH$69b(AMq~if4=0fNMsA3q z3&3(OJ|7wnh9J!a)rwH|M*TTurnwAk-H6JEYpCU0C3Rm2$M#^lA&|=G& z;zWZdh(NV$F%YX0Q~yzFAqYqSaWB=g1+*MuBqO-aVrvVM;zN>}5Y!G*Mrv6&{L4~+ z02=;29R3!vpw)%Qg{}|@<~)TKeGG)^Lu~o*Es2)Fz-}ORBPo?aeMm{NC9B3C6p3al zQV)xrfLdmJ1wXMC`am02py1}g(uY6>JkZMd4<#0Y4B$lSPpT84hndnu^AXyf0ae7$ z@gy34q~QogN)in})GxEEFiuH zjXw#h)Q40mX{eTHXjam^Bh#$iP+FSQI1~nA6==|qQ#~yuC(+y?)0dzuV?b#teF(&I z^sFt`kZJa7VzUKR0eZF=ZI=#x3jqR*?r}KmLv+-GwCp;e16q`Gv@SQvjX_X5^a%rE zgpii_5;dzryoC(Xbj=w$N6arGI%rgjLC%3ld34ExWCBoIaXJuRfc8oiq0KnyppKdF{ebu&R1DPLI8LV7{788e)P*k{2oDB9yZ!k7VA zsbCLi$e@b>Y5tR5N%Rt0A+dk~GF3Vq+7C0Mq`y2^EBfz9eR9y$z^0+)v t6rlN_9TfNIM@ls@>cLSDj(U)G000tZ8w@UVT5tdW002ovPDHLkV1h@T%sc=9 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/4.png b/res/screen-density-xhigh/4.png new file mode 100644 index 0000000000000000000000000000000000000000..66bc543b285b23e3f4a35fb57ca59aa9c3711f19 GIT binary patch literal 955 zcmV;s14R6ZP)E=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#T}ebiRCwBA{Qv(y11`V59AOhqSn4Rd_Wq^`TkzKnOiTwoGwHOuybuz+2h!IWhKS9?51Q1?Hd;n%8$W5?_ z!D$K1``F?H2HpYjbS&ckaYZH!2oZ8B+>bz~azfJ%KBxW%1u43X-=UI>I5hsJN~i(^ z5ZM};7{~<3@ra)L7|@e2ay+u&@;tW4C)TNYXnbR0H1c8*I|Ibt_%!+e@n>>Ebql4@ zaf!C^h$oE_)JRNx9vQf_3J^eK+ej{8VxTj?hzuf%ECy0CA1wFc^P%xz3esX|sh~$d z-G3<7qQpW*XagdX1U-txWGHMP1sc>QK>Qkt3xIe6#fb(7n1jT=2E`#%Nu@*pEo^Z^ ziG@d?@kMHCg;iwC( zL1~1NAe98-dnBl5rX)yb0kJN&HVQ>$DV`u@L=tBtGDyLEa)T7sfHHydO=#^yT)w55 z50Sx4dc+|qB@NYmNcEED9hqkBhSJicw%UY&SOpq1WI0(cyp(7L_^bRQ|8YeSDAa(%a zbRce`z$|{GJo*QSO9$G6`=EIU|4DBT`U9~uw7YtMfxuAvfYyT~ zf}7A01~zDwB0cCUdJ+L>PU;JkErUh=GPK_hN?KcnVj*)FN5wr2Dz6LWZ=q)ljyATb z05Xx9V57Z>f$-q>0dUuMEOj5vJa`sbuf3*|=Rl>c2AWtnt*Z%8%S3E|QdtoL+5*nO z*4QSeC*caj`A~XLRP?tQAS2ZD1b^vSih|Y(fu_Em(xD>^>VBC6@eYc6^rIF1s0T+q dIO;)40RSpE5>2tvzCZu~002ovPDHLkV1lNMmNx(Z literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/5.png b/res/screen-density-xhigh/5.png new file mode 100644 index 0000000000000000000000000000000000000000..f17bba089f762d2fbd426c7a80a26a88cd386d45 GIT binary patch literal 1017 zcmVE=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#n@L1LRCwBA{Qv(y11`V-1Q6L8nHb0f z$nl7t`xvkV94sDLhzvooKxErUE?{DyGr))pV6NoElDvryF)XzOK_40qmLMf1 z9sh@7Epjcq45cSR>miWke~HkiNUnvOfH)9{^MSY>h=qW-n<|M02dIY9tw8(^h~H8z zl@e(&12ru?0*xb5Q!A_@VAgqT+Ei=A?pI8eQLk)p7 z9WLQf%LDCG{Gr6cSwNf\VRhDbfklvsEQ+N7`t;%Fc?q)J&zLMmm%p$;U@55yl} zd~#E%2@?A+JyI!X9Do-Zm!J`xa9Y>+SD{VCtw6jN8kcm9Lws>dl{lnnN%M|Ovvxyi zX;R}*7>HG%K|@aUw3M7gbB9b{<^Zt)rK$8G5X;fCwpc@^*{_Ms7E}f3*x9wPra?JJ>vEIa7<6KQOria!1HMGfst|7>gEU=phRzZ53)=Lh zOAK-jM9QN}9wZa21mcf4kbp&AnoM(%`zfGqVkHBSW9`)T z;9Mvj3&b;N6e*w~1JFd{HE6GqZuKB2WEVi$`_M*nKv)}yZw}>({sJ`S(x82DxNoR>a5_?QJc1=}UO?&?4@nPZ0`YBVOxmL5zZ3?@ zng`HqvhGl>CR7HX)ic^%A_TqYAdlG$mQwUKv;?Im_)D!kNDKhY9D?R&p3E=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#$4Nv%RCwBA{Qv(y11`VI?6so$agV8o&JKUG2%Ab`l$ z$izSY*$cYYqAZ{U)>?n^%LVm)hk(l^AGH_`XAb`lWkzByUKxcpv8Ngi038cP}8)8^$ z3xYm09t=Tx9L@EF()52Q)*{zJD`*yt0AfiJJfuiWhQbCwwWb6RuR!wQYakY-IMLt$ zpehdky;iG|FRSyfQG*h zhrfj^XmufSp({j!IZuK31=ivTtvf>v4VIQrLA ztDZQaG_0*^2~Gb0X_aXBu{1Sko=QP2Hen#{1LA0;)*H=g{O3Tt4BFnghpoLyR((jN zl7=7JAqMjYWl8gnOtWBFMViz&1SJj?EUA;&>S-xCiRKQOzRUq)14>irLm-x;XKk^D zOtW7Tn=Pmc(6hy8yL9MV2oPX&kHcXfqN5(9W!DKE(4w59b-77y41${WPZ$s*gtWw$ zs96=_Eo6|UYtGO)Vtzq;6Lg6|&VfjIbjgDhfb~GU1KMr`^#@`ZAd^``z7!3D_A63= zSRIJdfcOg#n?uECk!dbJQXU0$;Y+ER2MJAo!vM%rb8)DL^#DLgPnV3L9^{S~4EO-? zR%(@^#1sm1q3l2)HbEQB(S!C4%SH2;FeDg(4btUFXa2rAi5LSs`EDgUuUW3CH` z&kw4$C>a1$*WDZKO$;&*ejfmLq1(w!OAmtbk23>~aU>c5P${c{CKgWXJh%^t#Re#q z6#;SYU~6ns+LLgF)~Bw6r4+r*02!gCC-_UxQdAGxQ+P^;j_^Tf?_>wXy@`=hO^kYQ f)PtiQq#XbNY#9jO%mAQq00000NkvXXu0mjfiP^*O literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/7.png b/res/screen-density-xhigh/7.png new file mode 100644 index 0000000000000000000000000000000000000000..427f1716c6dc9040cb0699ccbc8e782bdbf5c72d GIT binary patch literal 940 zcmV;d15^BoP)E=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#PDw;TRCwBA{Qv(y11`V59 zAOhqSn4SNTya58dK*=vmIK1(hpjTia#E300@VXWtfbdEZV@Y z>_4H%WI>O0bijlj6HxGnkROpXeup}b5r^9UR0&mp03ur>69bt5IUdn-9|N|4gT*5Y zF3%H+QzjgWu!XKM*1&;gAbd80GZ>*H$4G9d<`5l^)N(5E@kqd5ocJ^n6Q2W^RsjNt zY#Yf1Obm1e7?A-?KcE=fWr+O;I1JY=cEue{lk&M&|tH=~dDrvB^6NxS;v6+va4_U~~(4%E3 zE&vcf!{3L)-$E7~c~Aw2`AIP6CJ=uiR2SmPhi`#chz!Sr3inoWf>emi(6St|iRLm| zAAk{B5#s_v_zHevEYwA6GJr5BC9J@s-UEowKrzKZ>I1|fK&(ZCS`|tw;J?uJ%zt`i zd@CSMre_o56c8VvSJCzhS3inY7QO@Gne;5YC8*VE8x$qYJ2K5W4yC1uZek!+PwGI- zLxN?XF2F}9`zN$C`UtF^1c=QRH_7znYN%xt<--poR>l-3n)PIwy`Gdfqzb^+#29Ut z4t)y&0*vl)IP61o)PuC_I$^Y8s9erb8(=Fp$&EoLAby3`+@}>@N~k`iS|NipU2}%c zk+T)rg`rCfat_-(NCE&gV%HF%P6*nu9C986&90usBflGn?=wJ_0FdLsC}`dUffqpR z5A8P6&4bc7dU3CT*bs=HLLC@I1-n2UxLrUjKu-_iD=0u+p(lj;QbVnxUx4Jf=L6+A zT6qxEpG<_ZSCH759TFalgVLZOQ}5x{7QKU1y7>*KdJqOw7$_Xi9PLfez=Pihz+HdQ z_{_BQAgG1n46U^30YKwbp=e^^wCqg`Bml+S76!;n3o-zWiwaP)KS)miYKmn7@k0j4 zazl^7P>PZ}pGmDeO7j?00^((K$fvKN_9#&$4~~>-V$_499vt-`?EnBY{{395o}h*R O0000E=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#%}GQ-RCwBA{Qv(y11`V59 zAOhqSn4KW)@<99$s(=?L`32dvFMxPGl>HfQEEN32Y9}m2&;tXnYXJfXuOvPIcMs4v zu!zBF3C#QW;)D^0_F((@1pA7?`vQ5I|(xNG@PvpfkXT3}E`<1XAC~4Ka-9XJaGi zL*u~^q+ifn&qzT1e_Y9yg-8o|fVcw5qAse%Ar9aJEkt0h)`M32y|l7$3zTk!76X@P z?L!!-rh2vjf+NtlA~m(bDl$2eN*XNfM4}5yZ04iqLl$x~^k`X%3jhSr@b}^Hw~z%# z9#jEheiF>N39V7^)`ht8;aeaUBE#`D(6W}~AQd7rv@C~oqIrbW!vf)tc+?8vEBJ}E zPzi`vLksa9{D?n6^CA)rD@1$-4Wv;f4pxCRcW9f!P7OF==p z7l_&EQPOBZX(xK5Qc)n51meX&EC9snw6^dS5Ko4-cUA!L4SKZNLZEo)S5NQAH0wB0 zo+Yk{fmA)IL;DlNf;&jX-A`!i{3Eb>5+F7XZ<6WDMc76JNKG^!NUV%0PBiPuGyq()Gp_!4X~A)1Zg9cDfj`k)7lLx;KfVE=0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#zez+vRCwBA{Qv(y11`VKnNshNZS3=tJYd5TvuvT+awCgBkFYzaXqdu7!$7Y*^kdAWn3sq`VVGefu9Vhx#Qza}IS?t2E_skl@EzI-IR$Mug4&vaKG|9;9~mFDzXg7}zmr>Om601R%Z!?Hsa0yG|<5zB$O#LeLK9m!axGSn>k_(D>U0 zXsoJ3J;e)^a~-OM%svLh0OM|GA)^lUtTR+iI1q;n)fjYwcF6sqr6w|v0OGw+H4H;J ziGrF~=SO=JgUo~92f$tEcG7hG_bjxKcugnIT?S$eG_i16=Rr^jDKWk700000NkvXXu0mjfm&CqJ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/EditBackground.png b/res/screen-density-xhigh/EditBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bcaa56c21aa5653ab19c2ed3aac9a8826c3cce GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl{SNcITwWnidMV_;}#VPNhJyShX&#pfYfQtA$T^vI+f|C;@SeuPm7#L?U VFoqbln*n7QJYD@<);T3K0RU=YE9(FN literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_Nocontents_Bookmarks.png b/res/screen-density-xhigh/I01_Nocontents_Bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..f944b88e5e16f4e32bea8e1afadf6c3471e9b8b8 GIT binary patch literal 8539 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 U7tcm5YybcN07*qoM6N<$f)4ZnV*mgE literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_Play_disabled.png b/res/screen-density-xhigh/I01_controlbar_icon_Play_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..8890d41708b58a10a24b3532a5dc72c35eb70632 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^en9NO!3HEFJ|6~>3@qu6zK#qG8~eHcB(ehek|nMY zCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dZwOTe;zO}FgAO-IEGZjy}fmjtI0s*SYh+7 z4vwxxvlVI<-aC2y+qz^49?#p)mc5-*uOM>vWZm4_zSPiL17)nCsfTz_7mg_3HK0-kUkjjm)xPdmeKC>ZJDX5%mWx8`$6b z>6(0LRsPR*Rele2&PLN*rLT2`^{3lJ5>q_&BmbC>>P4*6*vrFbQ zuX;l2x_`>o_r1UT%qR4#<+NRoSk}z@oV?P)e9NOHw){_8d_pH%nx(Jey5W2DikEH2 z#+A38&XBQrX3F-Dw@>D?hQH&Zz%YLGSqcpdOdQyVKivno*;Ax6nWJSkf+Eq=)z4*} HQ$iB}o=wVc literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_Play_temp.png b/res/screen-density-xhigh/I01_controlbar_icon_Play_temp.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f9cdbdc29950f9139b5461bf2e610fc5aa86f3 GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^en9NO!3HEFJ|6~>3@qu6zK#qG8~eHcB(ehek|nMY zCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dZwOTe;zO}Fm`#mIEGZjy}f0~b;v;E*vF>T z4|wOyv1xdqVo}K!zWm;z>+hDV4^k9~o@|nNwz_`df*H%6JU@M1AUbr9fCB>~3s#~- zDC73G8zyHrTkrZFI5)z^bHh7%3-*Hai%J=1?mzhTYW36Iz5(ger1}q9UM=7HhGt z40(DZNOZa0@uI_=5i?i+Ke6@w?=6m2V|i_G)PmWshwQ~J)% zT*XutY`8UuKPhKbnWY+ge`RlDeY5g$n^VCPDyCdL+^NQ)(7?cijrgzhfvJAgsVEbM Rf~TOk^mO%eS?83{1OUjE(dhsH literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_Play_temp_press.png b/res/screen-density-xhigh/I01_controlbar_icon_Play_temp_press.png new file mode 100644 index 0000000000000000000000000000000000000000..af153707e6947da7e1b772fb7b6d7bacbde42959 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^en9NO!3HEFJ|6~>3@qu6zK#qG8~eHcB(ehek|nMY zCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dZwOTe;zO}Fm`*oIEGZjy}f0~b;v;ESmD9Y z4{UyZat;MSb8MPd2cLhOxODP9uhxJZ-%CqO-~VlGN}4rkzJ9#(o1}x>j4T2U4A_W9 zjmBN;%9sCsd{gG^?-hPJ^Hd_P^Uq=4u`NT;Tjy`ggwP zt`w{)%30MFJUw~mLzXpXuGT-f^}Y7ijFqeGjt7O$X$VcO(-D2%7B*+g^Ts(7R%RI; zKjst4xO>HnsFmy&%|mC)Om05D=huP#2PY=WJ=OHEIrZwHi!ja*s~4|-6+RoQ P2Z~HjS3j3^P63@qu6zK#qG8~eHcB(ehek|nMY zCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dZwOTe;zO}FxGmyIEGZjy}jkjb;v-V?I9Oe z7f07Fp)1^#%j0%it6y^JSZijloB2$XOHb#>@q9H;-_Vav42&!S4%i5V?8ar8e5JAb z&!pZW+@0_O>HQVCBuR2r4-Cr6f?r7}czVT07qJS?Z zUS7Gd-fG2yyT_ND`PXx2@%G~OkO3dp0GSb zGuY6Q<3=9Wh9vd&DYZVnD`#!JIz>}^T?p$N3-JiSrCJHMcODeupPnQr-MsIHu6Ti9 zzrpgjA`$!5MwTv1&fl3;6&+ghC?{X+z{i)#r$v(`K5qyLUCF1o{9S!_?D5tm2C4sp zS+6H9kFZ(YvYFxMX0;_Hx(C|d?+Yz`H0SI6>j$OMLi;WH-qx$+{opw{^+=`4InDUK zO4eJod9SS}IIpbg;1Y9>wB7SVgNZ|-fdLC~V8Q|E3zkx9e`*arfuhgT)z4*}Q$iB} D5UISM literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_backward_temp.png b/res/screen-density-xhigh/I01_controlbar_icon_backward_temp.png new file mode 100644 index 0000000000000000000000000000000000000000..db67c909e642bf6d12b68848b6235df1e94e6da0 GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^en9NO!3HEFJ|6~>3@qu6zK#qG8~eHcB(ehek|nMY zCBgY=CFO}lsSE*$nRz98ey$-3WyX4@dZwOTe;zO}Ft&QSIEGZjy}jkjb;v-V?O{{& zL1vD1F_jDlrz%u%Zf|;^TlIEbiIQ&1jjYd?C#A(Ld~nFA=1^6SjnmD@v)s-OFo#wau2Zd;6Dn<2k;=+svNMX&yC zzfl_F!4>??KD0o#tn27zFAMGo_SsHe*O_X5yo(N1KNtDGR(4Hd*w>E7H~zUlYCAt6 z#&eGQqdA|R&In&{_xZMc%$8GDwXaAhoO1PWcfV2t0~3b=7J`R!599marvg>n9koHx N=;`X`vd$@?2>{lP%!&X2 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_backward_temp_press.png b/res/screen-density-xhigh/I01_controlbar_icon_backward_temp_press.png new file mode 100644 index 0000000000000000000000000000000000000000..04b94f2cf3f0cfe9ebc187c1f32b06aadce5a1ff GIT binary patch literal 499 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 FV1lVVTciL0 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_compose.png b/res/screen-density-xhigh/I01_controlbar_icon_compose.png new file mode 100644 index 0000000000000000000000000000000000000000..11cdaf1a4efbc3810553e19f6b0b58d620ec1416 GIT binary patch literal 790 zcmV+x1L^#UP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp0&ht~ zK~!i%?U>(Z13?hSk5ED=c?zLVc`6~4QbH*qPo+ltkDq?l*_H^O)x`kXZ1qeht%L$J?aySHCzSM1L^_wfOAt}jz0PWVNTR*m{vX6Pd zJYXI$510ph+85q5)ngHf;yB97 zM>J3U)Sf_5k2<2LOLL6-LSsR#DH^I3@D~HrMmyKJdaVMw#m_ZVE0+QYhu>j*xKpKC zugh7~fq5<6b24NX00GkX4aaX=B79a?2MCa!Z*QR0Y=tpi3MC+>n8rsNpUR2)I`QZj?3V&I#y79!pRL@PvUICQKC-30}0e+PX;d7CD)tQ z^3vSu|Ftm)lf9gMV})so@69wzlp~8AB-=m|8x%K%0?%X40TJ0ofODENDk}b z4vO!STs_QLnxqh{&hc&}JH{@vW6hkRp;`frF|`hMY2%(AFeVu9+PR?nt+ij&!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC?Q$m z8c`CQpH@gGW$R7W=-SpB{4f~h^m4@qa1*hM?loS8JvG`HVbioAihuz$5EH~0wZtQMw zmr!+xtP$cAOxc|E86j9+fe-|#%_^{#rSi1Tf|VXp-(q8pkZ{%(vm`oOLb{mQeAM^zXY O)C``kelF{r5}E+!ow#}c literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_create_disable.png b/res/screen-density-xhigh/I01_controlbar_icon_create_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..71ef71e2139dce7e225d84e6f07c28c37dcf54f3 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBC?Q$m z8c`CQpH@Mmxs1O_lVFt;&tR+QxX$}R62 z0vUuZl*=5yf6e3iqCW)(Co;rUAJpByygKH9a!=RiSht4Q7JWSlp@jK@3GbQY5~nbv ze)LpvneevBk?rJy?hS8xlmb<Tcw%d5b?!2wcU>wR;=uE{hMA zMJB(hKAlX7>s*+=<@3&pliMFD6j$wvX*)L?*ADS1v_Vqu`L|bXIsI~47au~Uw{?0pjK>pUoc$Tj&drksFnZeW5 K&t;ucLK6Uwe711_ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_create_folder.png b/res/screen-density-xhigh/I01_controlbar_icon_create_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f1e37bb129396d7bb76893c46e3022ada0b99d GIT binary patch literal 633 zcmV-<0*3vGP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp0n$lC zK~!i%?N`BO1VIoTmJq^{(-J}mA%w7mWeIx<`Gb&C$Oq&Ua+%+rQ}W90(#9tBrn_`z z)*FhUtE=C8RW;MqG}qf?-ekKlx&2w>P?_+>P_@ozQyx+p! zGwlicW;Edl@Lmi6`rHG;`tkXj_6Rgw+VAe*^X2sH2NiV-qS&TaHuQ(ufw;^L#f(F#SngdF7GpQ0i zR2lkB^k!A6#3Opli}A0&2^(WPfTimL2*zL4s5A#Tf#}K;3qF^yQ_qjSYzJYd!q}w1 z0B3vocvAq2+(QI&1tQg*B9|PLgO%5|DUN5=_jW2^QTwO{RfDR*y54cD zL0q?O{}ngW;vnX8K-Xh7|)S#U(Ri#npaPKG`cS+7bR@rWApa{TFM!rB-Q zVC#GV!T75hWphvvh~9W&A?6h0$cv*d+dPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp0jfzv zK~!i%?OIW113?fDp|7EY67tm7Qc5X(Eg_WBe^5dxeadUx-@d2zo4Dg#_I7u6cP^Ls z!an3OJNwNyJKx<-ZZ_kG43L4VW1z0d&{Gy`)s7efTVertkjZ5iNH80cqEzW1@= z+G{_{XU7jvw-|32JKu0^&%S+(jbn`uTw9wE0mq*yb!9cDXpji*&I)L%Utro63lh%W zQ-N5{D;eO6CD0V#ApKA*Kyd_zOSyqhWY`EzQO2g~3>jRUF^em6UPQf8YNpg22AInL zGpIZ!X}4}}f`aphGT7cqe1IE)ng?v28(%w@T@YZdfh)l7X~74+UE6nF?ASaoz}#%P z<}-sHk>M5vIjlj8y6gI64YCH0XUoC9DQl25n8^S|h9X0eITjI0fv1T~IdM;?$WUY` zG87pTap^n+pLDh%JiqPlkxi%lkR5!@o7=?WWSUL_1i&^JKY^CuS4`s=HYfkzkM<@; z3_xu&S7UFwJ)5m_uK`rjR$fXl4^S2;30mU|0p5%fpa?;z-Za2tY^Ci#N^o3+43Ggb fKnBRb6*2G+pddGUK{u!800000NkvXXu0mjfk7(=E literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_delete_disable.png b/res/screen-density-xhigh/I01_controlbar_icon_delete_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..82f0d064c0c2464c408e3f44d57f5584ca097bd4 GIT binary patch literal 518 zcmV+h0{Q)kP)T=L3!WDhG*~nEZ-eJKrJyoFiyVV+Ma#; z7#qhLdpvtFAp(vMDRpHvr)ZD}?%4`xs$XFGEEXi3?NfnR&MO(`Sb*XP z4xi)zpUAKgnxc$N)md{?+$)nSb6!NfQfj8u90r)n05hn(CTX{BZi0gIhceh6B|gB7 zK+OX-+s4<)WfugPYv2m7dt2~I*L-HsBQo5gAcr+*QFmRRtU=b` z^=>)XH)Rd71~VC;$WUY`GS?zPDeyLtDJSmf6d8&PMTR0{A}*aT!8e_42+w!>d1TY+ zGGqr|^T{0(0v5n_7+-;w;4!9g44a$Z???M5Mhrl0Ggo78x;>k%v(^AAX)Aw9Fb_}` zC<$8Q3jr=h2~dO}RBsyKF}Bk7A0;?0LI%hH86X2>;DH$U1Hmb0pQWFRCjbBd07*qo IM6N<$g7>`8o&W#< literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_controlbar_icon_more.png b/res/screen-density-xhigh/I01_controlbar_icon_more.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2fbd6649980c40186af63a736eaab99c1cd70e GIT binary patch literal 3097 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_field_btn_Clear.png b/res/screen-density-xhigh/I01_field_btn_Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..44317766242e279519b553fc10592d83ef99b3b5 GIT binary patch literal 3495 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 AVE_OC literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_fit_screen.png b/res/screen-density-xhigh/I01_fit_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..666ba6cb8e983e84900d5336f6c3b1a0a6b934f2 GIT binary patch literal 3740 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_bookmark_off_temp.png b/res/screen-density-xhigh/I01_icon_bookmark_off_temp.png new file mode 100644 index 0000000000000000000000000000000000000000..93b0504ba06a6a7df96c3bd34d0b8e957fcb69b6 GIT binary patch literal 3944 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 a=GOq@7UYQsgY}010000hK*kU literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_more.png b/res/screen-density-xhigh/I01_icon_more.png new file mode 100644 index 0000000000000000000000000000000000000000..49a6d06a5cff1c82344d93cb5c9a67c2527cda1e GIT binary patch literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|l`=yjN+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh)vuvVobQf|-e)p^1T| ziKUK$k%6IszM+x6fw``sft9Jbm4TrG6et00D@sYT3UYCS+6CmEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{LKY@8PFS`} zm>iGcx|-tsR&{~Lg6>;c7v38GWQe>yHO1*4zYTkPVnv9J)_EESPcgZJC@S5vHh^3%$u)bOJ~jTQ(w$`;?m16eHUw-A0%z8aO3_b z_)9@4<5uVNsa{LB_c>>;zW-j{WVY|M*I(y#UQ4aYt5+A|+!~|jJ<-Eu;llW~^9Q(o zc72KvH(oZSeagwu2%r7!?{_`^A7u~p;RAMtIcL-2C+)i`-hFgh!?LXk%zvJJtk8N} z_WO!Sf!=iPvuT^(H##_|If|cKx{~wG;+_8S0y`?FFROpI`26$9&I>PWJ=A$Ev99vL zD{C3Po!8Kn(4K4+s`Jw>E0gGpIP@^KNf2>|Gd5F+e=G>JePJKp87)1*Y_e< z>!F)gd~4t4ZU4PAZhd~ntZj-)2C=dA*Ro7?<@)z8m_Pk>h3?+ve_VdLTu}QQeM#@B z;Jw43xOjM}AajRFjFg`47Vp)ocHPe~d2%sBM3{Hlb@^Vm^Q*7E(h=*nH7|M@y5D>M wLYwPHdxO26hVApdznuXsN*_#pw4Q;P;o23Gyj`rJt3ZXVr>mdKI;Vst0I~Trr2qf` literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_more_press.png b/res/screen-density-xhigh/I01_icon_more_press.png new file mode 100644 index 0000000000000000000000000000000000000000..3a135097366db9d6b268d59882d67e10cb32a046 GIT binary patch literal 1570 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 i_TUS@tTeY>d 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 QL;wH)07*qoM6N<$f@&P<7XSbN literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_page_navigation_05.png b/res/screen-density-xhigh/I01_icon_page_navigation_05.png new file mode 100644 index 0000000000000000000000000000000000000000..7545f2150ba7b30de2d88b8d83e8266536c30fd6 GIT binary patch literal 4917 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_page_navigation_06.png b/res/screen-density-xhigh/I01_icon_page_navigation_06.png new file mode 100644 index 0000000000000000000000000000000000000000..47e260e764fd4f8f6b8fbad55d31758d02135848 GIT binary patch literal 4975 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 Hu0mjf)l}=y literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_page_navigation_08.png b/res/screen-density-xhigh/I01_icon_page_navigation_08.png new file mode 100644 index 0000000000000000000000000000000000000000..d017474dd1109a70bee83a4d23a764c177709920 GIT binary patch literal 4986 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 Ef?Ysez5oCK literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_icon_page_navigation_09.png b/res/screen-density-xhigh/I01_icon_page_navigation_09.png new file mode 100644 index 0000000000000000000000000000000000000000..bf759d554d969a2a822f10fb142791cb180c19ab GIT binary patch literal 4966 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 b`P23r=GDs;{|vg;00000NkvXXu0mjfP*UlF literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_popup_bottom_bg.9.png b/res/screen-density-xhigh/I01_popup_bottom_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d74827f88df4c0322406945d938756ac10c433a2 GIT binary patch literal 108 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 Dd=iTM literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_search_list_icon_favorite.png b/res/screen-density-xhigh/I01_search_list_icon_favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4526897e46bbc325db738c0de6bf5c63c37986 GIT binary patch literal 4850 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 Ui)dBxZvX%Q07*qoM6N<$f@9#>SpWb4 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_tab_icon_bookmarks.png b/res/screen-density-xhigh/I01_tab_icon_bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..4d91a66c57aa8cee631e2c967ed6062dba5be9f0 GIT binary patch literal 621 zcmV-z0+RiSP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp0mey0 zK~!i%?U~UH!Y~X(8G#WPfe{#i5jp}RbnSjYETt%_lGf)qX zIk@QJ#4FLjt4eU|_XA5mmbT|!(oyZYc;udG7dh^kcCpksORgSo_`z0ix2H)LgL@MS zXzF)S0ype*6Wn@+_e<(pt{9Xn=4?OCQ8$bi%Z^)8w`$_3fkjQSqZb`#Y6P4SOFN0( zXN>}4+gbCT>ftEcy>wv@VH(#E!L30W0$S#%f?I<}-L5Kdqe7~}jRZ-%sR`T&kj>!| z$Y;yOQ5fIeO`Y2&r^%rgBs8UHRslJ+ON((DT(Vu84&j=Hh;m7t;l_zXX$EnHO4n&> zg>&^db)0$+ZvQcoy0jP9?YA#yZwsJYPIzl+1vp^*N4K^RT82P*qzy)L^r8n$kT{LS zXoI1tCm9azh^wbG8m_<;EHlrtK{ZT)avTBffk{9iaT<$DfCv}@s-YRmkpjji&HsB0 zN|ad~pQcagHEMIh@iap97^8Y!2QGjIcm=!yUIDMb6)Nxp(>HXPYj|0e00000NkvXX Hu0mjfm+1Ks literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_tab_icon_history.png b/res/screen-density-xhigh/I01_tab_icon_history.png new file mode 100644 index 0000000000000000000000000000000000000000..bcee66e6c772be8d45e1b00a8c49b67b3d08f3df GIT binary patch literal 804 zcmV+<1Ka$GP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp0)0tD zK~!i%?OEGx!!QiY2pz#AbcBqM5i&wY@Y?=r#lkLJhsU=aH&p?nKq8Sm@_3@0%ccMI z4D<~247@@HrfGU>&y}7(kEemSjpO*~d1%k6fm3BXfTXpjs&XZ;E$F8LrJky)m}ZB3 z9ZFwo)u^x9Goaw;J8QolR?X(F_zdaNG&~Cwz$sL}lx+3Lv5?#p(uG$@fZt zh^ignIs<^7gF8#}hUyA7djoT>+G)y3aunR$HxGA3&pF8XW&qmtp|byu0!T5Ni}3FN zdM6j-F=3|^Q<_u}qJuG_h%l_*&9vGqts0 zg>Mo_X=_PrmG?m@SPrCAK~5h+_d!Hc3dkx1)^%ia3B3Kk2?GP$yH-CB>(B%eHkjO4 z{!T`yVrq_z;N+-jQC!s*5&})>RKt!1TX zS8eh6@ef&-d19M!+3jHD#u}MnLQ`otVoLTqvoappIoK91J_ZjVO02+T|g2 i3q1op13d#To`EmdmK`t-$M&880000f literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_title_btn.9.png b/res/screen-density-xhigh/I01_title_btn.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8af29113cc0e11adc1e81e1c17f37f628bd084c1 GIT binary patch literal 348 zcmV-i0i*tjP)P-uXJ1fiqyCni=N!^9hS6)UT8-v$hV%Gz1XCKEO@ z?|r+;R*%u>`=Ywkm#*tGP17#odlyA@-Rs`$qtP&ou@D><^Es{aoVJ?{?RPs_*rSJ; z(40)uoW48xuv#vusw&EbI8D=+LJzYzjwPgfy65{om1Ws8cB?1~f)<|k>DMgF2F*=D z3s3t7^eX_K=Tq6Xt!!=zp5}?kvaFv0@GyV@3}65Q7{CAqFn|FJV8H(aWavtgMA-~& zJ9Np|7e$dW0NQTs^Bl)f20;4~JnLH=gCH0*Lj!FuJBvU)!N7H03d2xlS2$hnA%v)3URAtQTbW$%nLv${l9h!k1n z$~Ys@8DHN&;QRgI^?X0x@5kfyc>VDDx7d@-ezV*qhRUnt~K$)kTTCOvFt%)HK8(9E2w^^NA7R(u|CT5T<-#Q+j z#gi%P$|dI7BdG-*iBoq>Vb&naHkD+}SHfCjht$iP&F7uAuk5xO3hNEV*2gkI@OiS} zCALQ0c*S&?71fnF3l<0!a9Q7j6Jr%80tG9@39_w;tgHjy5eyDbzTT7l?!q*f>8)=t zzU;%!MuX+gkpDLQB}eP;noAjmnsNXTm&qPReX^S}`;^_q2XO41SSzo5nS#SxRa#o# zsHi}cPpeGMefPcYd|iMCaUbDPpxX22TlFVXJivp|xJS+V&*kbEabt48`)_2YPig?J zw8D%3b8iQ$5lkVDQmZ4e@rk8n1~_v-nT_*+_0%|~x2V1cC91LgVsFAueb>-29w%SN zD(ukEzCJ$ z9XKl;!gIt;9f3`p6L8bM(wbpgbdro8PrrpbGAP0@oSxW9l@cChXiU z6PD^3o0`l3cJKAEwU0uAp-(O45#jvp2BGUd8V1J~m&_Ao7|FuBas zLfay6H?m5XU)T3lkg2MvbA|P^o(gwu?5y6xtL_Q#1~rzW17sKBdAqGdq1dZLVxnG& z>k@NGVq<@RlZcXjR!bJ!sD>f$4?b5ABq@8qsd3LLw1$6HaAc6NA$m@F({$5%6XZup zrqvs){631=ZkOa^&3sY)mcK8*k9k@A2~&Vnm-r&>&I{D452@@(H$?U9dKhJ|X0o^& z`zF2cQ_+6$+hRrOm=qF@l!_3o0@ubx=*U00+L#)U5Rk2=8)A?uOiZywOo|Gl>4+dA zA5oqtmTfpIawE0mJ>?#YH{_V|7<`;a4ev+v8$`-AY8C4iYdaxU@S^r+=2QCKEiQE~ z(Q6FDzf&P*0a9{OoKml+gDQC{)6A}#`Al6#o1?>t7DP7U)v0@>~qp;)cKvy9OZxpbeGtM9K2w+w&F2$nF;^iMO+SQ1;3 zIya#xdsPmqNG@w|ST61#HTz|@P*zh0H+Z4YT~06aONv&i?k=oiu3oLYv}Ud7Wt~MC zRtv40{d%(^uhh0KL^seTy4b0{|E|9NWEqU{@bUHhhew{5pxsHHZ1!1$_h34FCc+&--+y8?f&+1SV4;J%Eld$ncx z?90}?)=a-TzvqWk{7p$wV?6n^`S&}x?4EfxZEJkv4QeQewlB6%T=WgKS~4rF?llgd z03JVh{1)P-$fYF8eVyBtrQDg zg38jHg#&-cO-P1y;=G(s6Tb79c3*yCR>nUhco-@WIu9W*kV}csX)zyZQuP#BI`-_i9h+)r3n@*c9OG@xS~*lI7vSl zZDMcYpeUv$euNy{3lNuOb?Hn%KHN=a~hmlq2sJR=Cig^nMfpo%|N zx>g>ox?0QEbl0Ff^!(I=bDRlMtA_6uhBAkY#pc8|ky%JAq6U$-+<~daE2P5Gex?3M zJ56I13%|o)j5Zi5d-u9vZJ3lA*p2>xo<~O!{}H2!CGH-xo7Rw#zssr*HMy&mJE$!t z$1QqI^xENS8R$amv}17@+21;?Sg1nhEj4vq)xk-kVT?MV+~qUBvQ`w3DWjd$|Lu{+yCmJY>0+RvOF7Op22o)S71e z+`mDmq1&wyTR#@6Tf=3YIPK)1QgxDH4*k;je~CoZ^ret5;9lof(@ofOb3G$*=WyYhDN;c}I=n@~bv!-(;T7LthT!O6J(*CM&MK8EKg;fVWKECVs_iGs zYOBs}zc9hzrHL@YX|3-a-yz=}77Xjx%D)vmZWE6x)MC}M0!jMLR?bUp30}FmmviEC zHTYKed2aGy+uP==@W-($DN`Kn@HypBm46$FJGQ;QA6@gP^(tw(B1lDeN+<{uB%hL= z6t3Qs;F7QjpExOM&7ZQLrtn?Ej{1rFCHcYqm9hkkq* zu1=`V|14YYdvO1t?c8P8oQzx7B=}bUwo|R~!m`Q>!XRsk*t6HaKN_@kdD?Y$uN;2I zY>@I(Hc}>UY~C>UH{b4Q&kXchK6^*EK?i3o6R?Dtg-ny0x5posWR#Q>YzhAa>2CGh z8siB+Gd%ATVc(;T(SO+-VXs2 zN3na&_TH4=?CTHk$s-`m{dA6Xw3yr%jt%7#dx1hH7Zf5UniJxh36#Pt$ zU_cKFJV$Ep!t@Ywm0Y8`tqy=V^5ha+|BZa;|p4|QDYy8r+H literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_title_btn_icon_down_disabled.png b/res/screen-density-xhigh/I01_title_btn_icon_down_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e091a68e5e37a727e348caad833a30e241ccfd GIT binary patch literal 3304 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 Ic=yY;+$h;B{Ry1W6MF-G0Qk~$UKQ` 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 Z{_ZR5`G7ZeIDZeo7-p_tbKCX#{{T7oB(wkk literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_title_btn_press.9.png b/res/screen-density-xhigh/I01_title_btn_press.9.png new file mode 100644 index 0000000000000000000000000000000000000000..753b7b249fa91907b59292bbd1c3a757715c0b73 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0zmAFVdQ&MBb@01-oc Axc~qF literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_title_progress_bar.png b/res/screen-density-xhigh/I01_title_progress_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..4250944968bbee250c02cf9963486db7aafd5e6e GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!3HE3cV7<&2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl{SNcITwWnidMV_;}#VPNhJyShX&#pfYfQsBbT^vIs!WnHC4*zE`Uj5}i zgTcyA{~2_az5makzWB|52Bifr{xitTdGen@Y{rBC41!bc{Ab{qc;i0VM%xNb!1@J z*w6hZkrl{SNcITwWnidMV_;}#VPNhJyShX&#pfYfQke>T^vIs!jmI*7Co(J`^3SZ X`A2!DPVB7!pd5pztDnm{r-UW|ArCNc literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_bg_01.png b/res/screen-density-xhigh/I01_toolbar_bg_01.png new file mode 100644 index 0000000000000000000000000000000000000000..dd422294c88b7f0d92815b29c2b8e196e1e42ca6 GIT binary patch literal 2852 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_01_press.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_01_press.png new file mode 100644 index 0000000000000000000000000000000000000000..a41bc96452131652cf6e3ab76fa674af5fe274f5 GIT binary patch literal 4005 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_02_press.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_02_press.png new file mode 100644 index 0000000000000000000000000000000000000000..f92c5a80aa1c2086562866e0b50edc783f0dd8d7 GIT binary patch literal 4734 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_03_press.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_03_press.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba95d69764aad7f4f23aca4fe701745cae76b55 GIT binary patch literal 4983 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 BO&0(F literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_04.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_04.png new file mode 100644 index 0000000000000000000000000000000000000000..d69f799ecb7abfd1fa1019765c213b7776c85bf9 GIT binary patch literal 4261 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_05.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_05.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd80e6663792ae76a516676538d89c168e5dce8 GIT binary patch literal 4665 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 LNkvXXu0mjfU>yFZ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_06_press.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_06_press.png new file mode 100644 index 0000000000000000000000000000000000000000..d18ab689f0596c964bde8eb6b8bf16cc0d7f3539 GIT binary patch literal 4953 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 XE<=t<{qxo800000NkvXXu0mjfARto# literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07.png new file mode 100644 index 0000000000000000000000000000000000000000..09e822de0d49f8b92d8ddef15e3ff5bff5ddc07a GIT binary patch literal 4203 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 B*g60J literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07_press.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_07_press.png new file mode 100644 index 0000000000000000000000000000000000000000..504af6b0952a00be940140f2c49906d887d06cb9 GIT binary patch literal 4346 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_08.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_08.png new file mode 100644 index 0000000000000000000000000000000000000000..f7196b7ffeed860b58e7d2465c7ca71c5b4f5669 GIT binary patch literal 4863 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 IM6N<$g1a7Z=>Px# literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_09.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_09.png new file mode 100644 index 0000000000000000000000000000000000000000..8cade2cc8aac5b8a242c13c964bde011545eb314 GIT binary patch literal 4788 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 QZvX%Q07*qoM6N<$f}7PeL;wH) literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_empty.png b/res/screen-density-xhigh/I01_toolbar_icon_windows_manager_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..87a858006deebb12cf90a53e97bbb5a63ccd83ab GIT binary patch literal 3667 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/I01_toolbar_input_field.9.png b/res/screen-density-xhigh/I01_toolbar_input_field.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fac478dd02e489d6a7c3c78e6934f29c6183277b GIT binary patch literal 1918 zcmV-^2Z8vBP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;UJt{NMlp2G>bM zK~#8N?VMRlBU=!F@BJ74R0UssQcxd6!3Q^79z?+v6%2x}2O}aDC%uM<$RbSVsQ)m76F|pP%ye^%eE-o4zM4dB{r{KPj^@rk|+r`uf^Hd4GSG=jUhH+uM`5xj7je z9F)4cI;pR(m*V1LDJ(3MqM{=6@Na(O9cf5Q9`aHKWl<(&|AY>{fx5W3kjKYIV<{*y zFfbsMm6cLbQXu-IVn3kJLYSn^vB0X z9FSN*$^K6nltr18O&!!loz#sCnFf|NC>-mhB1BZ$&y(|Cf`#hbt40^AQQ4tN4iem zGpM_}JHdxw@=Z-mMj)EPZvcvgjSR?wOvr|e$coHf{gx+Cm@`ePwzgLK`}<9o?ROJP z)$+7SA{#OyD>5Rx7g#BQIz2r#-SF}8vFWDA$Hz_kx9hP|Rm`vS$cBu_ip5THI-pA`PTn;r3SL-PkjBPFSzli_ zCY%e9tgw(7+0g-A(8;Y;xdKIj+uPgH+}v#brmg#J1%8!}>{eae!b%E?Xcy`Y4Gprj zwUyJ56h5%f1)b1Mb#$^WM^KE^>1rvEU@n&}Db_;KWo>QEG(&VmS5Khm6)2ntm%%C2 z{b~-sRW3TA8#*F`lXFjKQR?^@p%d-qlH+y@9-YvQDI8jiQ;cN`N(Z>Dt*vr!aA4+s z+*Y1z>Cg=w+uGV32hz5n7)*|gjF=%nko;1jkBE-wiq7b6=d0pCVNDDmySuy1cq!K` z#H+mMiq7b6H=h*;3ZkQ?nUC|lc?W`&aluq9=rvuegE6ert=#1`m z)5=kxNWgfA9w1ECq#qca(H#b{5qlIUGW7QLns_4Dt;4JQ=nez&Tb+6Y6i)2?{9LA{ zrb5xvIrV@rfQ5BdGy+Oz2bio6VsPo!!q6QCtRWIMs8vNk5qJ#`4~M$hDNH&wVk($K zfx^sQUS7;BU>E|-WYz@(Sil4}ktKBfpm%SJXpDU&E?9@eQ9r>4i!dz3S0BSX;E?Y#DOnh$5r@_STx zK)^|49>ldfufSlT+Xo^|k0H$d{(e5-wD>3j&cnmQ=phUPKOH4|{Q^PDhZS93UPcd! zb($qVDE>6Adp@>N2Ys`vZWZ^meOi~3^{`+NgHYW*oz{kY z?H-xH(#NlE`M1io>gIH6Au@57ED>EMW1k@TD|A7pj2#+Mh#Ff30Tw#YySatr+M?9C z2f?zemgLL9MquetS%Bs0!A4~F^{A}Xj{%9EBG-<}BJ++OAx=$iiD^DkV(hDNeDcoz`|MyI~z7E7|J*njT1A0YYV#>$i7XSbN07*qoM6N<$ Ef<8lecK`qY literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/ListIcon.png b/res/screen-density-xhigh/ListIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e42b8ae511a14676c3299cb418b789ec1f5100 GIT binary patch literal 3268 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
+ + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_ARTICLE_READER.xml b/res/screen-size-normal/IDL_ARTICLE_READER.xml new file mode 100644 index 0000000..73f303b --- /dev/null +++ b/res/screen-size-normal/IDL_ARTICLE_READER.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_BLANK_PANEL.xml b/res/screen-size-normal/IDL_BLANK_PANEL.xml new file mode 100644 index 0000000..3a60f45 --- /dev/null +++ b/res/screen-size-normal/IDL_BLANK_PANEL.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_BOOKMARK_LIST.xml b/res/screen-size-normal/IDL_BOOKMARK_LIST.xml new file mode 100644 index 0000000..a27dc33 --- /dev/null +++ b/res/screen-size-normal/IDL_BOOKMARK_LIST.xml @@ -0,0 +1,35 @@ + + + + + 480 +
+ + + + +
+ + + + + + +
+
+ + +
+ + + + + + + + + + +
diff --git a/res/screen-size-normal/IDL_BRIGHTNESS.xml b/res/screen-size-normal/IDL_BRIGHTNESS.xml new file mode 100644 index 0000000..ad6025d --- /dev/null +++ b/res/screen-size-normal/IDL_BRIGHTNESS.xml @@ -0,0 +1,34 @@ + + + + + 720 +
+ + + + +
+ + + + + +
+
+ + +
+ + + + + + +
diff --git a/res/screen-size-normal/IDL_CONFIRMATION_POPUP.xml b/res/screen-size-normal/IDL_CONFIRMATION_POPUP.xml new file mode 100644 index 0000000..e66e1e2 --- /dev/null +++ b/res/screen-size-normal/IDL_CONFIRMATION_POPUP.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CREATE_BOOKMARK_FOLDER.xml b/res/screen-size-normal/IDL_CREATE_BOOKMARK_FOLDER.xml new file mode 100644 index 0000000..4f5e55d --- /dev/null +++ b/res/screen-size-normal/IDL_CREATE_BOOKMARK_FOLDER.xml @@ -0,0 +1,36 @@ + + + + + + 720 +
+ + + + +
+ + + + + +
+ + + + + + + +
diff --git a/res/screen-size-normal/IDL_EDIT_BOOKMARK_LIST.xml b/res/screen-size-normal/IDL_EDIT_BOOKMARK_LIST.xml new file mode 100644 index 0000000..d706abb --- /dev/null +++ b/res/screen-size-normal/IDL_EDIT_BOOKMARK_LIST.xml @@ -0,0 +1,43 @@ + + + + + 720 +
+ + + + +
+ + + + +
+
+ + +
+ + + + + + + + + + + + + + + + +
diff --git a/res/screen-size-normal/IDL_EDIT_HISTORY_LIST.xml b/res/screen-size-normal/IDL_EDIT_HISTORY_LIST.xml new file mode 100644 index 0000000..8de0833 --- /dev/null +++ b/res/screen-size-normal/IDL_EDIT_HISTORY_LIST.xml @@ -0,0 +1,39 @@ + + + + + 720 +
+ + + + +
+ + + + + +
+
+ + +
+ + + + + + + + + + + +
diff --git a/res/screen-size-normal/IDL_EDIT_HOME_PAGE.xml b/res/screen-size-normal/IDL_EDIT_HOME_PAGE.xml new file mode 100644 index 0000000..5963718 --- /dev/null +++ b/res/screen-size-normal/IDL_EDIT_HOME_PAGE.xml @@ -0,0 +1,35 @@ + + + + + 720 +
+ + + + +
+ + + + + +
+ + + + + + + +
diff --git a/res/screen-size-normal/IDL_FIND_ON_PAGE.xml b/res/screen-size-normal/IDL_FIND_ON_PAGE.xml new file mode 100644 index 0000000..46eee25 --- /dev/null +++ b/res/screen-size-normal/IDL_FIND_ON_PAGE.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_FONT_SIZE.xml b/res/screen-size-normal/IDL_FONT_SIZE.xml new file mode 100644 index 0000000..7e81667 --- /dev/null +++ b/res/screen-size-normal/IDL_FONT_SIZE.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_FORM.xml b/res/screen-size-normal/IDL_FORM.xml new file mode 100644 index 0000000..7ad4fb1 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM.xml @@ -0,0 +1,59 @@ + + + + + + 720 +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/res/screen-size-normal/IDL_HISTORY_LIST.xml b/res/screen-size-normal/IDL_HISTORY_LIST.xml new file mode 100644 index 0000000..6271a5b --- /dev/null +++ b/res/screen-size-normal/IDL_HISTORY_LIST.xml @@ -0,0 +1,33 @@ + + + + + 480 +
+ + + + +
+ + + + +
+
+ + +
+ + + + + + + + + + +
diff --git a/res/screen-size-normal/IDL_MULTIPLE_WINDOW.xml b/res/screen-size-normal/IDL_MULTIPLE_WINDOW.xml new file mode 100644 index 0000000..6295a18 --- /dev/null +++ b/res/screen-size-normal/IDL_MULTIPLE_WINDOW.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_NOTIFICATION_PANEL.xml b/res/screen-size-normal/IDL_NOTIFICATION_PANEL.xml new file mode 100644 index 0000000..101c89b --- /dev/null +++ b/res/screen-size-normal/IDL_NOTIFICATION_PANEL.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_READER.xml b/res/screen-size-normal/IDL_READER.xml new file mode 100644 index 0000000..9c058da --- /dev/null +++ b/res/screen-size-normal/IDL_READER.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SETTINGS.xml b/res/screen-size-normal/IDL_SETTINGS.xml new file mode 100644 index 0000000..1ff2a36 --- /dev/null +++ b/res/screen-size-normal/IDL_SETTINGS.xml @@ -0,0 +1,21 @@ + + + + + 480 +
+ + + + +
+ + +
+
+ + +
+
diff --git a/res/screen-size-normal/IDL_SETTINGS_CLEAR_PRIVATE_DATA.xml b/res/screen-size-normal/IDL_SETTINGS_CLEAR_PRIVATE_DATA.xml new file mode 100644 index 0000000..f26d285 --- /dev/null +++ b/res/screen-size-normal/IDL_SETTINGS_CLEAR_PRIVATE_DATA.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_SETTING_FORM.xml b/res/screen-size-normal/IDL_SETTING_FORM.xml new file mode 100644 index 0000000..a696eae --- /dev/null +++ b/res/screen-size-normal/IDL_SETTING_FORM.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_SHARE_POPUP.xml b/res/screen-size-normal/IDL_SHARE_POPUP.xml new file mode 100644 index 0000000..61136f5 --- /dev/null +++ b/res/screen-size-normal/IDL_SHARE_POPUP.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/res/slk-SK.xml b/res/slk-SK.xml new file mode 100644 index 0000000..9569332 --- /dev/null +++ b/res/slk-SK.xml @@ -0,0 +1,134 @@ + + + + Vybrať všetky + Nov. + Najnavštevovanejšie lokality + Close all + Zavrieť + Veľkosť písma + Dec. + Záložka už existuje + Prijať súbory cookie + Odstrániť históriu prehliadača? + Odstrániť obsah a databázy uložené do lokálnej vyrovnávacej pamäte? + Vymazať údaje všetkých súborov cookie + Po + Nie + Zrušiť + Zdieľať cez Twitter + Minulý mesiac + So + Záložka je pridaná + Pridať do priečinka Záložky + Vždy sa pýtať + Prázdna strana + Jún + Automaticky + Júl + Kopírovať + Zapamätať heslá + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Údaje formulára + Apr. + Edit Folder + Máj + Hľadať na str. + Kopírovať obrázok + Odstránené + Mar. + Yahoo + Vyhľadávací nástroj + Hľadať + Zdieľať + Hľadajte alebo zadajte adresu URL + No Recently Visited Sites. + Zdieľať obr. + Odstrániť + Odstrániť všetky súbory cookie? + Žiadne záložky + St + Žiadne histórie + Jan. + Nastavenia webovej lokality + Ochrana osobných údajov a zabezpečenie + Hotovo + Viac okien + Earlier this month + Súbory cookie + Predvolené zobrazenie + Sep. + Heslo + Aug. + Nastavenia obsahu stránok + Čitateľný + Vymazať heslá + Vložiť + Uložiť obrázok + Naver + Zapamätať údaje formulára + Upraviť + Internet + Zobraziť obrázky + Dnes + Vybrať slovo + Včera + Názov + Používateľská domovská stránka + Prispôsobiť na šírku + Vybrané + Jas + Nastavenia + Vymazať vyrovnávaciu pamäť + about: blank + Vytvoriť priečinok + Záložky + Zobr. obrázok + Zdieľať cez e-mail + Spustiť JavaScript + Obnoviť predvolené + Zadajte názov záložky + Miesto + Minulý týždeň + Zdieľať cez Facebook + Priečinok + Nový priečinok + Záložka bola odstránená + Reset all settings to default? + Uložiť + Nové okno + Povoliť umiestnenie + Pridať + Pi + Blokovať kontextové okná + Áno + URL + Súkromie + Vymazať prístup k umiestneniu + Pred %d týždňami + Záložka + Neplatná adresa + No History \nAfter you load pages, the history will be shown. + História + Ne + Zobraziť bezpečnostné upozornenia + Upraviť záložku + Aktuálna stránka + Zdieľať cez správy + Domovská stránka + Ručne + Vymazať údaje formulára + Ut + Okt. + Št + Nenašli sa žiadne výsledky + Vymazať históriu + Feb. + Failed to save Image + diff --git a/res/slv-SI.xml b/res/slv-SI.xml new file mode 100644 index 0000000..043d0b7 --- /dev/null +++ b/res/slv-SI.xml @@ -0,0 +1,134 @@ + + + + Izberi vse + Nov + Največkrat obiskane strani + Close all + Zapri + Velikost pisave + Dec + Zaznamek že obstaja + Sprejmi piškotke + Želite izbrisati zgodovino iskalnika? + Želite izbrisati vsebino in podatkovne zbirke v lokalnem medpomnilniku? + Počisti vse podatke piškotkov + Pon + Ne + Prekliči + Skupna raba prek storitve Twitter + Zadnji mesec + Sob + Zaznamek dodan + Dodaj med zaznamke + Vedno vprašaj + Prazna stran + Jun + Samodejno + Jul + Kopiraj + Zapomni si gesla + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Podatki obrazcev + Apr + Edit Folder + Maj + Najdi na strani + Kopiraj sliko + Izbrisano + Mar + Yahoo + Iskalnik + Iskanje + Deli + Poiščite ali vnesite URL + No Recently Visited Sites. + Soupor. slike + Izbriši + Izbrišem vse piškotke? + Ni zaznamkov + Sre + Ni zgodovin + Jan + Nastavitve spletnega mesta + Zasebnost in varnost + Končano + Več oken + Earlier this month + Piškotki + Privzeti pogled + Sep + Geslo + Avg + Nastavitve vsebine strani + Čitljivo + Izbriši gesla + Prilepi + Shrani sliko + Naver + Zapomni si podatke obrazcev + Uredi + Internet + Prikaži slike + Danes + Izberi besedo + Včeraj + Naslov + Uporabnikova domača stran + Prilagodi širini + Izbrano + Svetlost + Nastavitve + Izprazni medpomnilnik + about: blank + Ustvari mapo + Zaznamki + Prikaži sliko + Souporaba preko e-pošte + Zaženi JavaScript + Ponastavi na privzeto + Vnesite ime zaznamka + Lokacija + Zadnji teden + Skupna raba prek storitve Facebook + Mapa + Nova mapa + Zaznamek je odstranjen + Reset all settings to default? + Shrani + Novo okno + Omogoči položaj + Dodaj + Pet + Blokiraj pojavna okna + Da + URL + Zasebnost + Počisti dostop do položaja + Pred %d tedni + Zaznamek + Neveljaven naslov + No History \nAfter you load pages, the history will be shown. + Zgodovina + Ned + Prikaži varnostna opozorila + Uredi zaznamek + Trenutna stran + Souporaba preko sporočil + Domača stran + Ročno + Počisti podatke obrazca + Tor + Okt + Čet + Ni najdenih rezultatov + Počisti zgodovino + Feb + Failed to save Image + diff --git a/res/spa-ES.xml b/res/spa-ES.xml new file mode 100644 index 0000000..1625608 --- /dev/null +++ b/res/spa-ES.xml @@ -0,0 +1,134 @@ + + + + Seleccionar todo + Nov. + Sitios más visitados + Close all + Cerrar + Tamaño de fuente + Dic. + El favorito ya existe + Aceptar cookies + ¿Eliminar historial del navegador? + ¿Eliminar las bases de datos y el contenido guardado en la caché local? + Borrar todos los datos de cookies + Lunes + No + Cancelar + Compartir mediante Twitter + Último mes + Sábado + Favorito añadido + Añadir a Favoritos + Preguntar siempre + Página en blanco + Jun. + Auto + Jul. + Copiar + Recordar contraseñas + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Datos de formulario + Abr. + Edit Folder + Mayo + Buscar en página + Copiar imagen + Eliminado + Mar. + Yahoo + Motor de búsqueda + Buscar + Compartir + Buscar o introducir URL + No Recently Visited Sites. + Compar imagen + Eliminar + ¿Eliminar todas las cookies? + Ningún favorito + Miércoles + No hay historiales + Ene. + Ajustes del sitio web + Privacidad y seguridad + Hecho + Ventana múltiple + Earlier this month + Cookies + Vista predeterminada + Sep. + Contraseña + Ago. + Ajuste. del cont. de pág. + Legible + Borrar contraseñas + Pegar + Guardar imagen + Naver + Recordar datos de formularios + Editar + Internet + Mostrar imágenes + Hoy + Seleccionar palabra + Ayer + Título + Página de inicio del usuario + Ajustar al ancho + Seleccionado + Brillo + Ajustes + Borrar caché + about: blank + Crear carpeta + Favoritos + Ver imagen + Compartir por correo electrónico + Ejecutar JavaScript + Restablecer valores predeterminados + Introducir nombre de favorito + Ubicación + Última semana + Compartir mediante Facebook + Carpeta + Nueva carpeta + Favorito eliminado + Reset all settings to default? + Guardar + Nueva ventana + Activar ubicación + Añadir + Viernes + Bloquear ventanas emergentes + Sí + URL + Privacidad + Borrar acceso a ubicación + Hace %d semanas + Favorito + Dirección no válida + No History \nAfter you load pages, the history will be shown. + Historial + Dom. + Mostrar advertencias de seguridad + Editar elemento favorito + Página actual + Compartir mediante mensajes + Página de inicio + Manual + Borrar datos del formulario + Mar. + Oct. + Jue. + No se han encontrado resultados + Borrar historial + Feb. + Failed to save Image + diff --git a/res/spa-MX.xml b/res/spa-MX.xml new file mode 100644 index 0000000..49114de --- /dev/null +++ b/res/spa-MX.xml @@ -0,0 +1,134 @@ + + + + Seleccionar todo + Nov. + Sitios más visitados + Close all + Cerrar + Tamaño de fuente + Dic. + El Favorito ya existe + Aceptar cookies + ¿Eliminar historial del navegador? + ¿Eliminar bases de datos y contenido en memoria caché local? + Eliminar cookies + Lun + No + Cancelar + Compartir en Twitter + Último mes + Sáb + Favorito añadido + Añadir a Favoritos + Preguntar siempre + Página en blanco + Jun. + Automático + Jul. + Copiar + Recordar contraseñas + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Datos de formulario + Abr. + Edit Folder + Mayo + Buscar en páginas + Copiar imagen + Eliminado + Mar. + Yahoo + Motor de búsqueda + Buscar + Compartir + Buscar o introducir URL + No Recently Visited Sites. + Compart imagen + Eliminar + ¿Eliminar todas las cookies? + No hay favoritos + Mié + No hay historiales + Ene. + Configuración del sitio Web + Privacidad y seguridad + Realizado + Ventana múltiple + Earlier this month + Cookies + Vista predeterminada + Sep. + Contraseña + Ago. + Config. del cont. de pág. + Legible + Eliminar contraseñas + Pegar + Guardar imagen + Naver + Recordar datos de formularios + Editar + Internet + Mostrar imágenes + Hoy + Seleccionar palabra + Ayer + Título + Página de inicio del usuario + Ajustar al ancho + Seleccionado + Brillo + Configuración + Eliminar caché + about: blank + Crear carpeta + Favoritos + Ver imagen + Compartir vía correo + Ejecutar JavaScript + Restablecer valores predeterminados + Introducir nombre de Favorito + Ubicación + Última semana + Compartir en Facebook + Carpeta + Nueva carpeta + Favorito eliminado + Reset all settings to default? + Guardar + Nueva ventana + Activar ubicación + Añadir + Vie + Bloquear ventanas emergentes + Sí + URL + Privacidad + Eliminar acceso a ubicación + Hace %d semanas + Favoritos + Dirección no válida + No History \nAfter you load pages, the history will be shown. + Historial + Dom + Mostrar advertencias de seguridad + Editar Favorito + Página actual + Compartir mediante mensajes + Inicio + Manual + Eliminar datos de formularios + Mar + Oct. + Jue + No se han encontrado resultados + Eliminar historial + Feb. + Failed to save Image + diff --git a/res/srp-RS.xml b/res/srp-RS.xml new file mode 100644 index 0000000..e5efc9e --- /dev/null +++ b/res/srp-RS.xml @@ -0,0 +1,134 @@ + + + + Izaberi sve + Nov. + Najposećeniji sajtovi + Close all + Zatvori + Veličina fonta + Dec. + Obeleživač već postoji + Prihvataj kolačiće + Izbrisati istorije pretraživača? + Obrisati lokalno keširan sadržaj i baze podataka? + Obriši sve kolačiće + Pon + Ne + Poništi + Podeli putem Twitter-a + Zadnji mesec + Sub + Obeleživač dodat + Dodaj u obeleživače + Uvek pitaj + Prazna strana + Jun + Automatski + Jul + Kopiraj + Zapamti šifre + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Sačuvani podaci + Apr. + Edit Folder + Maj + Nađi na strani + Kopiraj sliku + Obrisano + Mar. + Yahoo + Pretraživač + Pretraži + Podeli + Traži ili unesi URL + No Recently Visited Sites. + Podeli sliku + Obriši + Izbrisati sve kolačiće? + Nema obeleživača + Sre + Nema istorija + Jan. + Podešavanja sajta + Privatnost i bezbednost + Gotovo + Više prozora + Earlier this month + Kolačići + Podrazumevani prikaz + Sep. + Šifra + Avg. + Podešav. sadržaja strane + Čitljivo + Obriši šifre + Zalepi + Sačuvaj sliku + Naver + Zapamti podatke obrazaca + Izmeni + Internet + Prikaži slike + Danas + Izaberi reč + Juče + Naslov + Korisnička početna stranica + Podesi prema širini + Označeno + Osvetljenje + Podešavanja + Obriši keš memoriju + about: blank + Kreiraj folder + Bookmark-ovi + Prikaži sliku + Podeli putem e-pošte + Pokreni JavaScript + Resetuj na podrazumevano + Unesi naziv obeleživača + Lokacija + Zadnja nedelja + Podeli putem Facebook-a + Folder + Novi folder + Obeleživač je uklonjen + Reset all settings to default? + Sačuvaj + Novi prozor + Omogući lociranje + Dodaj + Pet + Blokiraj iskačuće prozore + Da + URL + Privatnost + Obriši pristup lokaciji + Pre %d nedelja + Obeleživač + Neispravna adresa + No History \nAfter you load pages, the history will be shown. + Istorija + Ned + Prikazuj bezbednosna upozorenja + Izmeni obeleživač + Trenutna strana + Podeli putem poruke + Početna strana + Ručno + Obriši podatke iz obrasca + Uto + Okt. + Čet + Nema rezultata + Obriši istoriju + Feb. + Failed to save Image + diff --git a/res/swe-SE.xml b/res/swe-SE.xml new file mode 100644 index 0000000..dff71ac --- /dev/null +++ b/res/swe-SE.xml @@ -0,0 +1,134 @@ + + + + Välj alla + Nov + Mest besökta webbplatser + Close all + Stäng + Teckenstorlek + Dec + Bokmärket finns redan + Acceptera cookies + Ta bort webbläsarhistorik? + Ta bort lokalt cachat innehåll och lokala cachade databaser? + Rensa all cookie-data + Mån + Nej + Avbryt + Dela via Twitter + Senaste månaden + Lör + Bokmärke har lagts till + Lägg till i Bokmärken + Fråga alltid + Tom sida + Jun + Auto + Jul + Kopiera + Kom ihåg lösenord + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Formulärdata + Apr + Edit Folder + maj + Sök på sidan + Kopiera bild + Raderad + Mar + Yahoo + Sökmotor + Sök + Dela + Sök eller ange URL + No Recently Visited Sites. + Dela bild + Radera + Radera alla cookies? + Inga bokmärken + Ons + Inga berättelser + Jan + Webbplatsinställningar + Sekretess och säkerhet + Klar + Flera fönster + Earlier this month + Cookie + Standardvy + Sept + Lösenord + Aug + Sidinnehållsinställningar + Läsbart + Rensa lösenord + Klistra in + Spara bild + Naver + Kom ihåg data + Redigera + Internet + Visa bilder + Idag + Välj ord + Igår + Rubrik + Användarens startsida + Anpassa till bredd + Markerade + Ljusstyrka + Inställningar + Töm cache + about: blank + Skapa mapp + Bokmärken + Visa bild + Dela via e-post + Kör JavaScript + Återställ till standard + Ange bokmärkesnamn + Plats + Förra veckan + Dela via Facebook + Mapp + Ny mapp + Bokmärket har tagits bort + Reset all settings to default? + Spara + Nytt fönster + Aktivera plats + Lägg till + Fre + Blockera popuper + Ja + URL + Privat + Rensa platsåtkomst + %d veckor sedan + Bokmärke + Ogiltig adress + No History \nAfter you load pages, the history will be shown. + Tidigare + Sön + Visa säkerhetsvarningar + Redigera bokmärke + Denna sida + Dela via meddelanden + Startsida + Manuellt + Ta bort formulärdata + Tis + Okt + Tor + Inga resultat hittades + Rensa historik + Feb + Failed to save Image + diff --git a/res/tur-TR.xml b/res/tur-TR.xml new file mode 100644 index 0000000..e8c606a --- /dev/null +++ b/res/tur-TR.xml @@ -0,0 +1,134 @@ + + + + Hepsini seç + Kas. + En çok ziyaret edilen siteler + Close all + Kapat + Yazı tipi boyutu + Ara. + Yer imi zaten mevcut + Çerezleri kabul et + Tarayıcı geçmişi silinsin mi? + Yerel olarak ön belleğe alınmış içerik ve veritabanları silinsin mi? + Tüm çerez verilerini sil + Pts + Hayır + İptal + Twitter ile paylaş + Geçen ay + Cts + Yer imi eklendi + Yer imlerine ekle + Her zaman sor + Boş sayfa + Haz. + Otomatik + Tem. + Kopyala + Şifreleri hatırlayın + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Form verileri + Nis. + Edit Folder + Mayıs + Sayfada bul + Resmi kopyala + Silindi + Mar. + Yahoo + Arama motoru + Buluyor + Paylaşıma aç + Ara veya URL gir + No Recently Visited Sites. + Resim paylaş + Sil + Tüm tanımlama bilgileri silinsin mi? + Yer imi yok + Çar + Geçmiş yok + Oca. + Websitesi ayarları + Gizlilik ve güvenlik + Kaydet + Çoklu Pencere + Earlier this month + Tanımlama bilgileri + Varsayılan görünüm + Eyl. + Şifre + Ağu. + Sayfa içeriği ayarları + Okunabilir + Şifreleri sil + Yapıştır + Resmi kaydet + Naver + Veriden hatırla + Düzenle + İnternet + Resimleri göster + Bugün + Kelime seç + Dün + Başlık + Kullanıcı ana sayfası + Genişliğe sığdır + Seçili + Parlaklık + Ayarlar + Önbelleği sil + about: blank + Klasör oluştur + Yer imleri + Resmi görüntüle + E-posta ile paylaş + JavaScript'i çalıştır + Varsayılan olarak sıfırla + Yer imi adı girin + Konum + son hafta + Facebook ile paylaş + Klasör + Yeni klasör + Yer imi kaldırıldı + Reset all settings to default? + Kaydet + Yeni pencere + Konumu etkinleştir + Ekle + Cum + Açılır pencereleri engelle + Evet + URL + Gizlilik + Konum erişimini sil + %d hafta önce + Yer İmi + Geçersiz adres + No History \nAfter you load pages, the history will be shown. + Geçmiş + Paz + Güvenlik uyarılarını göster + Yer imini düzelt + Geçerli sayfa + Mesajlar ile paylaş + Ana sayfa + Manuel + Veri formunu sil + Sal + Eki. + Per + Sonuç bulunamadı + Geçmişi sil + Şub. + Failed to save Image + diff --git a/res/ukr-UA.xml b/res/ukr-UA.xml new file mode 100644 index 0000000..413b5d8 --- /dev/null +++ b/res/ukr-UA.xml @@ -0,0 +1,134 @@ + + + + Вибрати всі + Лис + Найбільш відвідувані сайти + Close all + Закрити + Розмір шрифту + Гру + Закладка вже існує + Приймати файли cookies + Видалити історію браузера? + Видалити локальний вміст кеша та бази даних? + Очистити всі дані файлів cookie + Пн + Ні + Скасувати + Спільний доступ через Twitter + Останній місяць + Сб + Закладку додано + Додати до закладок + Завжди запитувати + Пуста сторінка + Чер + Авто + Лип + Копіювати + Запам’ятати паролі + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Дані форми + Кві + Edit Folder + Трав. + Знайти на стор. + Копіювати зображення + Видалено + бер + Yahoo + Система веб-пошуку + Пошук + Надіслати + Знайдіть або введіть URL-адресу + No Recently Visited Sites. + Передати зобр + Вида-\nлити + Видалити всі файли cookie? + Немає закладок + Ср + Немає історій + Січ + Установки веб-сайта + Конфіденційність і безпека + Готово + Декілька вікон + Earlier this month + Файли cookie + Стандартний режим перегляду + Вер + Пароль + Сер + Установки вмісту сторінки + Чітко + Очистити паролі + Вставити + Зберегти зображення + Naver + Запам’ятати дані форми + Редагув. + Браузер + Показати зображення + Сьогодні + Виберіть слово + Вчора + Назва + Домашня сторінка користувача + За шириною + Вибране + Яскравість + Установки + Очистити кеш + about: blank + Створити папку + Закладки + Перегл. зображ. + Спільний доступ через Email + Запуск JavaScript + Скинути на стандартні + Введіть ім’я закладки + Розташування + Останній тиждень + Спільний доступ через Facebook + Папка + Ручний + Закладку видалено + Reset all settings to default? + Зберегти + Нове вікно + Увімкнути розташування + Додати + Пт + Блокувати спливаючі вікна + Так + URL + Конфіденційність + Очистити доступ до розташування + %d тижнів тому + Закладка + Хибна адреса + No History \nAfter you load pages, the history will be shown. + Історія + Нд + Показувати попередження системи безпеки + Редагувати закладку + Поточна сторінка + Спільний доступ через повідомлення + Домашня сторінка + Вручну + Очистити дані форми + Вт + Жов + Чт + Результатів не знайдено + Очистити журнал + Лют + Failed to save Image + diff --git a/res/uzb-UZ.xml b/res/uzb-UZ.xml new file mode 100644 index 0000000..69f3282 --- /dev/null +++ b/res/uzb-UZ.xml @@ -0,0 +1,134 @@ + + + + Barchasini tanlash + Noy. + Eng ko‘p kirilgan saytlar + Close all + Yopish + Shrift o‘lchami + Dek. + Veb-hujjat avvaldan mavjud + Cookie-fayllarni qabul qilish + Brauzer jurnali o'chirilsinmi? + Mahalliy keshlangan tarkib va ma'lumot bazalari o'chirilsinmi? + Barcha cookie ma’lumotlarini o'chirish + Du. + Yo‘q + Bekor q. + Twitter orqali ulashish + Oxirgi oy + Sha + Saqlangan veb-hujjat qo‘shildi + Saqlangan veb-hujjatlarga qo‘shish + Har doim so‘ralsin + Bo‘sh sahifa + Iyn. + Avtomatik + Iyl. + Nusxa olish + Parollarni eslab qolish + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + Shakl ma’lumoti + Apr. + Edit Folder + May + Sahifada topish + Suratdan nusxa olish + O'chirildi + Mar. + Yahoo + Qidirish mexanizmi + Qidirish + Ulashish + URL-manzilni qidirish yoki kiritish + No Recently Visited Sites. + Tasvir ulash. + O'chr + Barcha cookie-fayllar yo‘q qilinsinmi? + Veb-hujjatlar yo‘q + Cho + Jurnallar yo‘q + Yan. + Veb-sayt parametrlari + Maxfiylik va xavfsizlik + Bajarildi + Ko‘p oynali + Earlier this month + Cookie-fayllar + Ilk ko‘rinish + Sen. + Parol + Avg. + Sahifa tarkibi parametri + O‘qish mumkin bo‘lgan + Parollarni tozalash + Qo‘shib qo‘yish + Tasvirni saqlash + Naver + Ma’lumotdan eslab qolish + Tahrirl. + Internet + Tasvirlarni aks ettirish + Bugun + So‘z tanlang + Kecha + Sarlavha + Foydalanuvchi asosiy sahifasi + Kenglikka moslash + Tanlangan + Ravshanlik + Parametrlar + Keshni o'chirish + about: blank + Jild yaratish + Veb-hujjatlar + Rasmni ko‘rish + E-pochta orqali ulashish + JavaScriptni ishga tushirish + Birlamchi o'rnatilgan holatiga tiklash + Veb-hujjat nomini kiriting + Joylashuv + Oxirgi hafta + Facebook orqali ulashish + Jild + Yangi jild + Veb-hujjat olib tashlandi + Reset all settings to default? + Saqlash + Yangi oyna + Joylashuvni yoqish + Qo‘shish + Jum. + Qalqib chiquvchi oyna bloki + Ha + URL-manzil + Maxfiylik + Joylashuvga kirishni tozalash + %d hafta avval + Saqlangan veb-hujjat + Noto‘g‘ri manzil + No History \nAfter you load pages, the history will be shown. + Jurnal + Yak + Xavfsizlik ogohlantirishlarini ko‘rsatish + Veb-hujjatni tahrirlash + Joriy sahifa + Xabarlar orqali ulashish + Asosiy sahifa + Qo‘lda + Ma’lumotdan o'chirib tashlash + Sesh + Okt. + Pay + Natijalar topilmadi + Jurnalni tozalash + Fev. + Failed to save Image + diff --git a/res/zho-CN.xml b/res/zho-CN.xml new file mode 100644 index 0000000..1028595 --- /dev/null +++ b/res/zho-CN.xml @@ -0,0 +1,134 @@ + + + + 全选 + 11 月 + 访问最多的站点 + Close all + 关闭 + 字体大小 + 12 月 + 书签已存在 + 接受 Cookies + 是否删除浏览器历史记录? + 是否删除本地缓存的内容和数据库? + 清除所有 Cookie 数据 + 星期一 + 否 + 取消 + 通过 Twitter 共享 + 上个月 + 星期六 + 已添加书签 + 添加到书签 + 总是询问 + 空白页面 + 6 月 + 自动 + 7 月 + 复制 + 记住密码 + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 格式数据 + 4 月 + Edit Folder + 5月 + 在页面上查找 + 复制图像 + 已删除 + 3 月 + Yahoo + 搜索引擎 + 搜索 + 共享 + 搜索或输入网址 + No Recently Visited Sites. + 共享图像 + 删除 + 删除所有 Cookies 吗? + 无书签 + 星期三 + 没有历史记录 + 1 月 + 网站设置 + 隐私和安全 + 完成 + 多窗口 + Earlier this month + Cookies + 默认视图 + 9月 + 密码 + 8 月 + 页面内容设置 + 方便阅读 + 清除密码 + 粘贴 + 保存图像 + Naver + 记住表单数据 + 编辑 + 互联网 + 显示图片 + 今天 + 选择单词 + 昨天 + 标题 + 用户主页 + 适合宽度 + 已选择 + 亮度 + 设定 + 清除缓存 + about: blank + 新文件夹 + 书签 + 查看图像 + 通过电子邮件共享 + 运行 Java 脚本 + 重置为默认值 + 输入书签名称 + 位置 + 最后一周 + 通过 Facebook 共享 + 文件夹 + 新文件夹 + 书签已移除 + Reset all settings to default? + 保存 + 新窗口 + 启用定位功能 + 添加 + 星期五 + 阻止弹出窗口 + 是 + 网址 + 隐私权 + 取消定位权限 + %d 周前 + 书签 + 地址无效 + No History \nAfter you load pages, the history will be shown. + 历史记录 + 星期日 + 显示安全警告 + 编辑书签 + 当前页面 + 通过信息共享 + 主页 + 手动 + 清除表单数据 + 星期二 + 10 月 + 星期四 + 未找到结果 + 清除历史记录 + 2 月 + Failed to save Image + diff --git a/res/zho-HK.xml b/res/zho-HK.xml new file mode 100644 index 0000000..5e331fb --- /dev/null +++ b/res/zho-HK.xml @@ -0,0 +1,134 @@ + + + + 選擇全部 + 11 月 + 最常瀏覽網站 + Close all + 關閉 + 字體大小 + 12 月 + 書籤已存在 + 接受 Cookies + 刪除瀏覽器紀錄嗎? + 刪除本機緩存的內容和數據庫嗎? + 清除全部 Cookie 數據 + 週一 + 否 + 取消 + 透過 Twitter 分享 + 上個月 + 週六 + 已加入書籤 + 加到書籤 + 總是詢問 + 空白頁面 + 6 月 + 自動 + 7 月 + 複製 + 記住密碼 + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 表格數據 + 4 月 + Edit Folder + 5 月 + 在頁面上尋找 + 複製圖像 + 已刪除 + 3 月 + Yahoo + 搜尋引擎 + 搜尋 + 分享 + 搜尋或輸入網址 + No Recently Visited Sites. + 共享圖像 + 刪除 + 要刪除全部 Cookie 嗎? + 無書籤 + 週三 + 無歷史記錄 + 1 月 + 網址設定 + 私隱和安全 + 完成 + 多重視窗 + Earlier this month + Cookies + 預設檢視 + 9 月 + 密碼 + 8 月 + 頁面內容設定 + 可讀取 + 清除密碼 + 貼上 + 儲存圖像 + Naver + 記住表格數據 + 編輯 + 瀏覽器 + 顯示圖像 + 今天 + 擇擇字詞 + 昨天 + 標題 + 用戶首頁 + 符合寬度 + 已選擇 + 亮度 + 設定 + 清除緩存 + about: blank + 建立資料夾 + 書籤 + 檢視圖像 + 透過電子郵件分享 + 執行 JavaScript + 重設為預設 + 輸入書籤名稱 + 位置 + 最後一週 + 透過 Facebook 分享 + 資料夾 + 新資料夾 + 已移除書籤 + Reset all settings to default? + 儲存 + 新視窗 + 啟用定位功能 + 加入 + 週五 + 封鎖彈出視窗 + 是 + 網址 + 私隱 + 清除位置資訊存取權 + %d 個星期前 + 書籤 + 位址無效 + No History \nAfter you load pages, the history will be shown. + 歷程記錄 + 週日 + 顯示安全性警告 + 編輯書籤 + 目前頁面 + 透過訊息共享 + 首頁 + 手動 + 清除表格數據 + 週二 + 10 月 + 週四 + 找不到結果 + 清除歷程記錄 + 2 月 + Failed to save Image + diff --git a/res/zho-SG.xml b/res/zho-SG.xml new file mode 100644 index 0000000..4633ae1 --- /dev/null +++ b/res/zho-SG.xml @@ -0,0 +1,134 @@ + + + + 全选 + 11月 + 访问最多的站点 + Close all + 关闭 + 字体大小 + 12月 + 书签已存在 + 接受 Cookies + 是否删除浏览器历史? + 是否删除本地缓存的内容和数据库? + 清除所有 Cookie 数据 + 周一 + 否 + 取消 + 通过 Twitter 共享 + 上个月 + 周六 + 已添加书签 + 添加到书签 + 始终询问 + 空白页面 + 6月 + 自动 + 7月 + 复制 + 记住密码 + 谷歌 + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 格式数据 + 4月 + Edit Folder + 5月 + 在页面上查找 + 复制图像 + 已删除 + 3月 + Yahoo + 搜索引擎 + 搜寻 + 共享 + 搜索或输入URL + No Recently Visited Sites. + 共享图像 + 删除 + 删除所有 Cookie 吗? + 无书签 + 周三 + 没有历史记录 + 1月 + 网络设置 + 隐私和安全 + 已完成 + 多窗口 + Earlier this month + Cookies + 预置视图 + 9月 + 密码 + 8月 + 页面内容设置 + 方便阅读 + 清除密码 + 粘贴 + 保存图像 + Naver + 记住表单数据 + 编辑 + 网络 + 显示图片 + 今天 + 选择字词 + 昨天 + 标题 + 用户主页 + 适合宽度 + 已选定 + 亮度 + 设定 + 清除缓存 + about: blank + 创建文件夹 + 书签 + 查看图像 + 通过电子邮件共享 + 运行Java脚本 + Reset to default + 输入书签名称 + 地址 + 最后一周 + 通过 Facebook 共享 + 文件夹 + 新文件夹 + 书签已移除 + Reset all settings to default? + 储存 + 新窗口 + 启动位置 + 添加 + 周五 + 阻止弹出窗口 + 是 + 网址 + 隐私 + 清除位置接入? + %d 周前 + 已添加书签 + 地址无效 + No History \nAfter you load pages, the history will be shown. + 历史记录 + 周日 + 显示安全警告 + 编辑书签 + 当前页面 + 通过信息共享 + 主页 + 手动 + 清除表单数据 + 周二 + 10月 + 周四 + 未找到结果 + 清除历史记录 + 2月 + Failed to save Image + diff --git a/res/zho-TW.xml b/res/zho-TW.xml new file mode 100644 index 0000000..5fc32be --- /dev/null +++ b/res/zho-TW.xml @@ -0,0 +1,135 @@ + + + + 全選 + 11 月 + 訪客最多的網站 + Close all + 關閉 + 字型大小 + 12 月 + 書籤已存在 + 接受 Cookie + 刪除瀏覽器紀錄嗎? + 刪除本機快取的內容與資料庫嗎? + 清除所有 Cookie 資料 + 週一 + 否 + 取消 + 透過 Twitter 分享 + 最近1個月 + 週六 + 增加書籤 + 加至書籤 + 每次詢問 + 空白頁面 + 6 月 + 自動 + 7 月 + 複製 + 記住密碼 + Google + Older + Searched items + No Bookmarks \nAdd favorite sites bookmark to access easily + Close all windows? + 表單資料 + 4 月 + Edit Folder + 5 月 + 在頁面中尋找 + 複製圖像 + 已刪除 + 3 月 + Yahoo + 搜尋引擎 + 搜尋 + 分享 + 搜尋或輸入網址 + No Recently Visited Sites. + 圖像分享 + 刪除 + 刪除所有 Cookie? + 無書籤 + 週三 + 無歷史記錄 + 1 月 + 網站設定 + 隱私權與安全性 + 完成 + 多重視窗 + Earlier this month + Cookies + 預設檢視 + 9 月 + 密碼 + 8 月 + 頁面內容設置 + 可讀取 + 清除密碼 + 貼上 + 儲存圖像 + Naver + 記住表單資料 + 編輯 + 網際網路 + 顯示影像 + 今天 + 選擇字詞 + 昨天 + 標題 + 使用者首頁 + 符合寬度 + 已選擇 + 亮度 + 設定 + 清除快取 + about: blank + 建立資料夾 + 書籤 + 檢視圖像 + 透過電子郵件分享 + 執行 JavaScript + 重設為預設值 + 輸入書籤名稱 + 位置 + 上一週 + 透過 Facebook 分享 + 資料夾 + 新資料夾 + 已移除書籤 + Reset all settings to default? + 儲存 + 新視窗 + 啟用定位功能 + 新增 + 週五 + 封鎖彈出視窗 + 是 + URL + 隱私設定 + 清除位置存取 + %d 週前 + 書籤 + 地址無效 + No History \nAfter you load pages, the history will be shown. + 歷程記錄 + 週日 + 顯示安全性警告 + 編輯書籤 + 目前頁面 + 經由訊息分享 + 首頁 + 手動模式 + 清除表單資料 + 週二 + 10 月 + 週四 + 找不到結果 + 清除記錄 + 2 月 + Failed to save Image + + diff --git a/shared/data/nofile.dummy b/shared/data/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/shared/res/screen-density-xhigh/mainmenu.png b/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..07d3b712f6ee1324b82272985ce86f3579628526 GIT binary patch literal 20874 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 literal 0 HcmV?d00001 diff --git a/shared/trusted/nofile.dummy b/shared/trusted/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/src/IntAddBookmarkForm.cpp b/src/IntAddBookmarkForm.cpp new file mode 100644 index 0000000..e595eb9 --- /dev/null +++ b/src/IntAddBookmarkForm.cpp @@ -0,0 +1,1126 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: AddBookmarkForm.cpp + *@brief: This header file contains the definitions of the AddBookmarkForm class. + * + */ + +#include +#include + +#include "IntAddBookmarkForm.h" +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntDropDownCustomItem.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntRadioCustomItem.h" +#include "IntSceneRegister.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int LIST_ITEM_HEIGHT = 112; +static const int H_ITEM_HEIGHT = 128; +static const wchar_t* IDB_LIST_LEFT_SIDE = L"ListLeftSide.png"; + +const int AddBookmarkForm::IDA_CREATE_BOOKMARK_FOLDER = 101; +const int AddBookmarkForm::IDA_BUTTON_DONE = 102; +const int AddBookmarkForm::IDA_BUTTON_CANCEL = 103; +const int AddBookmarkForm::IDA_LIST_LEFT_SIDE_MARGIN = 104; +const int AddBookmarkForm::IDA_LIST_LEFT_SIDE_MARGIN_DROPDOWN = 105; + +AddBookmarkForm::AddBookmarkForm(void) +:__folderCount(0) +,__folderName(CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS")) +,__listHeight(H_ITEM_HEIGHT) +, __oldFolderCount(0) +, __pBookmark(null) +, __pEditFieldTitle(null) +, __pEditFieldUrl(null) +,__pList(null) +, __pListPanel(null) +, __previousScene(null) +, __pScrollPanel(null) +, __pWindowInfo(null) +, __selectedIndex(0) +, __showFolderList(false) +,__titleOnViewDeactivated(L"") +, __view(L"") +,__urlOnViewDeactivated(L"") + +{ + +} + +AddBookmarkForm::~AddBookmarkForm(void) +{ + // RemoveAllControls(); +} + +bool +AddBookmarkForm::Initialize(void) +{ + Construct(L"IDL_ADD_BOOKMARK"); + + return true; +} + +result +AddBookmarkForm::OnInitializing(void) +{ + result r = E_SUCCESS; + Header* pHeader = null; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return E_FAILURE; + } + pSceneManager->AddSceneEventListener(IDSCN_ADD_BOOKMARK, *this); + + pHeader = GetHeader(); + + if (pHeader != null) + { + pHeader->AddActionEventListener(*this); + } + + // Main Panel which is a Scroll Panel + __pScrollPanel = static_cast< ScrollPanel* >(GetControl(L"IDC_SCROLLPANEL2")); + + if (__pScrollPanel == null) + { + return E_FAILURE; + } + + __pLabel1 = static_cast< Label* >(__pScrollPanel->GetControl(L"IDC_LABEL1")); + + if (__pLabel1 == null) + { + return E_FAILURE; + } + + // Title EditField added on the Scroll Panel + __pEditFieldTitle = static_cast< EditField* >(__pScrollPanel->GetControl(L"IDC_EDITFIELD1")); + + if (__pEditFieldTitle == null) + { + return E_FAILURE; + } + + __pEditFieldTitle->SetGuideText(CommonUtil::GetString(L"IDS_BR_POP_ENTER_BOOKMARK_NAME")); + __pEditFieldTitle->AddTextEventListener(*this); + __pEditFieldTitle->AddKeypadEventListener(*this); + __pEditFieldTitle->SetOverlayKeypadCommandButtonVisible(false); + + // Url Editfield added on the Scroll Panel + __pEditFieldUrl = static_cast< EditField* >(__pScrollPanel->GetControl(L"IDC_EDITFIELD2")); + + if (__pEditFieldUrl == null) + { + return E_FAILURE; + } + + __pEditFieldUrl->SetGuideText(CommonUtil::GetString(L"IDS_BR_BODY_SEARCH_OR_ENTER_URL")); + __pEditFieldUrl->AddTextEventListener(*this); + __pEditFieldUrl->AddKeypadEventListener(*this); + __pEditFieldUrl->SetOverlayKeypadCommandButtonVisible(false); + + __pList = static_cast< ListView* >(__pScrollPanel->GetControl(L"IDC_LISTVIEW1")); + + if (__pList == null) + { + return E_FAILURE; + } + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + AddOrientationEventListener(*this); + + __pScrollPanel->SetSize(GetClientAreaBounds().width, GetClientAreaBounds().height); + r = __pScrollPanel->SetClientAreaHeight(__pList->GetY() + __listHeight); + ScrollPanelScrollDirection direction = __pScrollPanel->GetScrollDirection(); + AppLogDebug("ScrollDirection = %d SetClientAreaHeight ret = %s value = %d autoresize = %d",direction,GetErrorMessage(r),__pScrollPanel->GetClientAreaBounds().height,__pScrollPanel->IsScrollAreaAutoResizingEnabled()); + r = E_SUCCESS; + + return r; +} + +result +AddBookmarkForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +AddBookmarkForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLog("AddBookmarkForm::OnActionPerformed entered actionId %d",actionId); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return ; + } + + switch (actionId) + { + case IDA_CREATE_BOOKMARK_FOLDER: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_CREATE_BOOKMARK_FOLDER, SCENE_TRANSITION_ANIMATION_TYPE_LEFT)); + } + break; + + case IDA_BUTTON_DONE: + { + // Code to save the Bookmark + String title = L""; + String Url = L""; + String bookMarkID = L""; + String folderTitle = L""; + ArrayList folderList; + result r= E_SUCCESS; + int count = 0; + bool exist = false; + bool ret = false; + bool flag = false; + bool valid = false; + + + String firstPattern(L"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)"); + String secondPattern(L"^[A-Za-z0-9\.\+-:#@%/;$~?]+\\.[A-Za-z0-9\+-=:#@%/;$~()_?\\\.&]{2,}$"); // Url of type abc.com (i.e without protocol in front of it) + + RegularExpression firstRegex; + RegularExpression secondRegex; + + firstRegex.Construct(firstPattern, REGEX_CASELESS); + secondRegex.Construct(secondPattern, REGEX_CASELESS); + + title = __pEditFieldTitle->GetText(); + Url = __pEditFieldUrl->GetText(); + + // Match + ret = firstRegex.Match(Url, false); // This returns true value + flag = secondRegex.Match(Url, false); // Checks whether Url typed is of type abc.com (i.e without protocol in front of it) + + if (ret == true) + { + valid = true ; + } + else + { + String tempUrl = L"http://"; + tempUrl.Append(Url); + + if (flag == true) + { + valid = true; + Url= tempUrl ; + } + } + + if (valid == false) + { + String msg = CommonUtil::GetString(L"IDS_BR_POP_INVALIDADDRESS"); + CreateMessage(msg); + } + else + { + if (__view == CommonUtil::GetString(L"IDS_BR_SK_EDIT")) + { + String tempUrl ; + String tempTitle; + String tempParentId; + + tempUrl = __pBookmark->GetUrl(); + tempTitle = __pBookmark->GetBookmarkTitle(); + tempParentId = __pBookmark->GetParentId(); + + + + r = BookmarkPresentationModel::GetInstance()->GetFolder("-1", 0, __folderCount, folderList); + TryCatch(r == E_SUCCESS,,"Failed to intitialize GetFolder %s",GetErrorMessage(r)); + + for (count = 0; count < __folderCount; count++) + { + BookmarkData* pBookmark = null; + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + if (pBookmark == NULL) + { + return; + } + folderTitle = pBookmark->GetBookmarkTitle(); + + if (folderTitle == __folderName) + { + bookMarkID = pBookmark->GetBookmarkId(); + break; + } + } + + + + + if(bookMarkID.GetLength() == 0) + { + bookMarkID = L"-1"; + } + + AppLog("IDA_BUTTON_DONE tempParentId ID is %S",tempParentId.GetPointer()); + AppLog("IDA_BUTTON_DONE bookMarkID ID is %S",bookMarkID.GetPointer()); + + if (bookMarkID.CompareTo(tempParentId) == 0 && __pEditFieldUrl->GetText().CompareTo(tempUrl) == 0 && __pEditFieldTitle->GetText().CompareTo(tempTitle) == 0) + { + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + return; + } + + if(tempUrl != __pEditFieldUrl->GetText() || tempParentId != bookMarkID) + { + r = BookmarkPresentationModel::GetInstance()->DoesBookmarkExist(Url,exist, bookMarkID, true); + TryCatch( r == E_SUCCESS,,"Failed to intitialize GetFolder %s",GetErrorMessage(r)); + } + + + if ( exist == true) + { + String msg = CommonUtil::GetString(L"IDS_BR_POP_BOOKMARK_ALREADY_EXISTS"); + CreateMessage(msg); + + AppLogDebug("Bookmark already exists"); + } + else + { + __pBookmark->SetUrl(Url); + __pBookmark->SetBookmarkTitle(title); + + if (bookMarkID == L"") + { + __pBookmark->SetParentId(L"-1"); + } + else + { + __pBookmark->SetParentId(bookMarkID); + } + + r = BookmarkPresentationModel::GetInstance()->SaveBookmark(*__pBookmark); + AppLogDebug("ID_BUTTON_DONE SaveBookmark = %s", GetErrorMessage(r)); + AppLogDebug("parent id = %ls",__pBookmark->GetParentId().GetPointer()); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + } + } + else + { + AppLog("AddBookmarkForm::OnActionPerformed does url exist 1"); + + r = BookmarkPresentationModel::GetInstance()->GetFolder(L"-1", 0, __folderCount, folderList); + TryCatch(r == E_SUCCESS,,"Failed to intitialize GetFolder %s",GetErrorMessage(r)); + + for (count = 0; count < __folderCount; count++) + { + BookmarkData* pBookmark = null; + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + if (pBookmark == NULL) + { + return; + } + folderTitle = pBookmark->GetBookmarkTitle(); + + if (folderTitle == __folderName) + { + bookMarkID = pBookmark->GetBookmarkId(); + break; + } + } + if(bookMarkID.GetLength() == 0) + { + bookMarkID = L"-1"; + } + r = BookmarkPresentationModel::GetInstance()->DoesBookmarkExist(Url,exist, bookMarkID, true); + + TryCatch( r == E_SUCCESS,,"Failed to intitialize GetFolder %s",GetErrorMessage(r)); + AppLog("AddBookmarkForm::OnActionPerformed does url exist 2"); + if ( exist == true) + { + String msg = CommonUtil::GetString(L"IDS_BR_POP_BOOKMARK_ALREADY_EXISTS"); + CreateMessage(msg); + + AppLogDebug("Bookmark already exists"); + } + else + { + + r = BookmarkPresentationModel::GetInstance()->GetFolder("-1", 0, __folderCount, folderList); + TryCatch( r == E_SUCCESS,,"Failed to intitialize GetFolder %s",GetErrorMessage(r)); + + for (count = 0; count < __folderCount; count++) + { + BookmarkData* pBookmark = null; + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + if( pBookmark == NULL ) + { + return; + } + folderTitle = pBookmark->GetBookmarkTitle(); + + if (folderTitle == __folderName) + { + bookMarkID = pBookmark->GetBookmarkId(); + break; + } + } + BookmarkData bookmark; + + if (__folderName != CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS")) + { + bookmark.SetParentId(bookMarkID); + } + + bookmark.SetBookmarkTitle(title); + bookmark.SetUrl(Url); + if (__pBookmark != null) + { + bookmark.SetFaviconId(__pBookmark->GetFaviconId()); + } + BookmarkPresentationModel::GetInstance()->SaveBookmark(bookmark); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + } + } + } + + folderList.RemoveAll(true); + } + break; + + case IDA_BUTTON_CANCEL: + { + if (__pEditFieldTitle != NULL) + { + __pEditFieldTitle->Clear(); + } + + if (__pEditFieldUrl != NULL) + { + __pEditFieldUrl->Clear(); + } + + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + + } + break; + + default: + break; + } + + CATCH: return; +} + +void +AddBookmarkForm::OnListViewItemLongPressed(ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + return; +} + +void +AddBookmarkForm::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status) +{ + if (__pEditFieldTitle != NULL) + { + __pEditFieldTitle->HideKeypad(); + } + + if (__pEditFieldUrl != NULL) + { + __pEditFieldUrl->HideKeypad(); + } + if (index == 0) + { + if (__showFolderList == false) + { + AppLog("AddBookmarkForm::OnListViewItemStateChanged false"); + __showFolderList = true; + __pList->UpdateList(); + __listHeight = __pList->GetItemCount() * H_ITEM_HEIGHT; + __pLabel1->SetShowState(false); + + } + else + { + AppLog("AddBookmarkForm::OnListViewItemStateChanged true"); + __showFolderList = false; + __pList->UpdateList(); + __listHeight = __pList->GetItemCount() * H_ITEM_HEIGHT; + __pLabel1->SetShowState(true); + + } + + } + else + { + __selectedIndex = index; + if (index > 1 && __pList->GetItemCount() != index +1) + { + String parentID = "-1"; + ArrayList folderList; + BookmarkData* pBookmark = null; + BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, __folderCount, folderList); + + pBookmark = static_cast(folderList.GetAt(index-2)); + __folderName = pBookmark->GetBookmarkTitle(); + } + else if(index == 1) + { + __folderName = CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS") ; + } + __listHeight = __pList->GetItemCount() * H_ITEM_HEIGHT; + if (__pList->GetItemCount() == index +1) + { + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_CREATE_BOOKMARK_FOLDER, SCENE_TRANSITION_ANIMATION_TYPE_LEFT)); + return; + } + + __pList->UpdateList(); + // __pList->RefreshList(0, LIST_REFRESH_TYPE_ITEM_MODIFY); + + } + + __pLabel1->SetBounds(__pLabel1->GetX(),__pList->GetY()+ __listHeight + 2,__pLabel1->GetWidth(),__pLabel1->GetHeight()); + __pLabel1->Invalidate(true); + result r = __pList->SetBounds(Rectangle(__pList->GetX(), __pList->GetY(), __pList->GetWidth(), __listHeight)); + //__pList->Invalidate(true); + Invalidate(true); + AppLog("the result is %s", GetErrorMessage(r)); + AppLog("the list height is %d", __pList->GetHeight()); + return; +} + +void +AddBookmarkForm::OnListViewItemSwept(ListView& listView, int index, SweepDirection direction) +{ + __pList->RefreshList(0, LIST_REFRESH_TYPE_ITEM_MODIFY); + return; +} + +void +AddBookmarkForm::OnListViewContextItemStateChanged(ListView& listView, int index, int elementId, ListContextItemStatus state) +{ + return; +} + +int +AddBookmarkForm::GetItemCount(void) +{ + AppLogDebug("AddBookmarkForm::GetItemCount"); + int count = 0; + ArrayList folderList; + String parentID = "-1"; + BookmarkData* pBookmark = null; + BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, __folderCount, folderList); + + if (__selectedIndex == 0 && __view == CommonUtil::GetString(L"IDS_BR_SK_EDIT")) + { + for(int count = 0; count < __folderCount; count++) + { + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + + if (__pBookmark != null && pBookmark != NULL && __pBookmark->GetParentId() == pBookmark->GetBookmarkId()) + { + __selectedIndex = count + 2; + __folderName = pBookmark->GetBookmarkTitle(); + break; + } + else + { + __selectedIndex = 1; + } + } + } + + folderList.RemoveAll(true); + + if (__showFolderList == false) + { + return 1; + } + else + { + result r = BookmarkPresentationModel::GetInstance()->GetFolderCount(L"-1",count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetBookmarkCount query failed %s",GetErrorMessage(r)); + AppLog("count = %d", count); + return count + 3; + CATCH: + return E_FAILURE; + } + +} + +ListItemBase* +AddBookmarkForm::CreateItem(int index, int itemWidth) +{ + AppLog("AddBookmarkForm::CreateItem index = %d itemWidth %d list width = %d",index,itemWidth,__pList->GetWidth()); + result r = E_FAILURE; + String folderTitle = L""; + RadioCustomItem* radioItem = null; + DropDownCustomItem* pItem = null; + Bitmap* pBitmap = null; + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_LIST_LEFT_SIDE); + if(itemWidth == 0) + { + itemWidth = __pList->GetWidth(); + } + if (index == 0) + { + pItem = new(std::nothrow) DropDownCustomItem(); + r = pItem->Construct(itemWidth); + + if (IsFailed(r)) + { + AppLog("Create Item Failed with error %s", GetErrorMessage(r)); + delete pItem; + delete pBitmap; + return null; + } + + if ( __showFolderList == true ) + { + pItem->SetCurState(DROP_DOWN_ITEM_STATE_OPENED); + } + else + { + pItem->SetCurState(DROP_DOWN__ITEM_STATE_CLOSED); + } + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + pItem->SetMainText(CommonUtil::GetString(L"IDS_BR_BODY_FOLDER")); + pItem->SetSubText(__folderName); + pItem->Make(); + if (pBitmap != null) + { + //pItem->AddElement(Rectangle(0, 0, 10, H_ITEM_HEIGHT), IDA_LIST_LEFT_SIDE_MARGIN_DROPDOWN, *pBitmap, null); + delete pBitmap; + } + return pItem; + } + else + { + String parentID = "-1"; + ArrayList folderList; + + BookmarkData* pBookmark = null; + r = BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, __folderCount, folderList); + + if (index == 1) + { + radioItem = new(std::nothrow) RadioCustomItem(); + // r = radioItem->Construct(GetClientAreaBounds().width, LIST_ITEM_HEIGHT); + r = radioItem->Construct(itemWidth, LIST_ITEM_HEIGHT); + if (IsFailed(r)) + { + AppLog("Create Item Failed with error %s", GetErrorMessage(r)); + delete radioItem; + delete pBitmap; + return null; + } + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + folderTitle = CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS") ; + radioItem->SetText(folderTitle); + } + else if (index <= __folderCount + 1) + { + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(index - 2)); + if (pBookmark != null) + { + folderTitle = pBookmark->GetBookmarkTitle(); + } + radioItem = new(std::nothrow) RadioCustomItem(); + // r = radioItem->Construct(GetClientAreaBounds().width, LIST_ITEM_HEIGHT); + r = radioItem->Construct(itemWidth, LIST_ITEM_HEIGHT); + if (IsFailed(r)) + { + AppLog("Create Item Failed with error %s", GetErrorMessage(r)); + delete radioItem; + delete pBitmap; + return null; + } + + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetText(folderTitle); + } + else + { + radioItem = new(std::nothrow) RadioCustomItem(); + // r = radioItem->Construct(GetClientAreaBounds().width, LIST_ITEM_HEIGHT); + r = radioItem->Construct(itemWidth, LIST_ITEM_HEIGHT); + if (IsFailed(r)) + { + AppLog("Create Item Failed with error %s", GetErrorMessage(r)); + delete radioItem; + delete pBitmap; + return null; + } + //radioItem->AddElement(Rectangle(MARGIN_X, 0, __pList->GetBounds().width, LIST_ITEM_HEIGHT), IDA_FORMAT_STRING1, CommonUtil::GetString(L"IDS_CREATE_NEW_FOLDER"), textsize, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + folderTitle = CommonUtil::GetString(L"IDS_BR_OPT_NEW_FOLDER"); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND); + radioItem->SetText(folderTitle); + + } + + if (__selectedIndex == index) + { + radioItem->SetSelected(true); + } + else + { + radioItem->SetSelected(false); + } + + if(__selectedIndex == 0 && index == 1) + radioItem->SetSelected(true); + if (radioItem->GetSelected() == true) + { + __folderName = radioItem->GetText(); + } + + if (pBitmap != null) + { + //radioItem->AddElement(Rectangle(0, 0, 10, LIST_ITEM_HEIGHT), IDA_LIST_LEFT_SIDE_MARGIN, *pBitmap, null); + delete pBitmap; + } + + folderList.RemoveAll(true); + radioItem->Make(); + return radioItem; + } +} + +bool +AddBookmarkForm::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + if (pItem != null) + { + delete pItem; + pItem = null; + } + + return true; +} + +void +AddBookmarkForm::OnKeypadActionPerformed(Control& source, KeypadAction keypadAction) +{ + return; +} + +void +AddBookmarkForm::OnKeypadClosed(Control& source) +{ + + AppLog("the client area height is %d",GetClientAreaBounds().height); + + __pScrollPanel->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height)); + __pScrollPanel->Invalidate(true); + + Invalidate(true); + return; +} + +void +AddBookmarkForm::OnKeypadOpened(Control& source) +{ + AppLog("the client area height is %d",GetClientAreaBounds().height); + + // __pScrollPanel->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height)); + + // __pScrollPanel->Invalidate(true); + // __pScrollPanel->SetScrollPosition(source.GetY()-48,false); + __pScrollPanel->SetSize(GetClientAreaBounds().width,GetClientAreaBounds().height); + __pScrollPanel->SetClientAreaWidth(__pScrollPanel->GetWidth()); + __pScrollPanel->SetClientAreaHeight(__pList->GetY()+__listHeight); + Invalidate(true); + AppLog("the scroll panel height is Rect(%d,%d,%d,%d) ClientHeight = %d",__pScrollPanel->GetX(),__pScrollPanel->GetY(),__pScrollPanel->GetWidth(),__pScrollPanel->GetHeight(),__pScrollPanel->GetClientAreaBounds().height); + return; +} + +void +AddBookmarkForm::OnKeypadWillOpen(Control& source) +{ + return; +} + +void +AddBookmarkForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + + // Code to handle events when the AddBookmarkForm is activated. + String str = "-1"; + String pageTitle = L""; + String pageUrl = L"http://"; + String title = L""; + String url = L""; + result r = E_FAILURE; + Header* pHeader = GetHeader(); + + r = BookmarkPresentationModel::GetInstance()->GetFolderCount(str, __folderCount); + TryCatch( r == E_SUCCESS, ,"Failed to intitialize GETFOLDERCOUNT %s",GetErrorMessage(r)); + + if ( pHeader == NULL ) + { + return ; + } + if ( previousSceneId != IDSCN_CREATE_BOOKMARK_FOLDER ) + { + // check first argument of pargs 0 for Add, 1 - for Edit + String* firstValue = NULL; + if(pArgs) + { + firstValue = dynamic_cast(pArgs->GetAt(0)); + } + + if( firstValue == NULL || pArgs == NULL) + { + return ; + } + if (firstValue->CompareTo(L"1") == 0) + { + __view = CommonUtil::GetString(L"IDS_BR_SK_EDIT"); + + pHeader->SetTitleText(CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_BOOKMARK")); + + if (__pBookmark != NULL && pArgs != NULL) + { + delete __pBookmark; + __pBookmark = null; + } + + if (__pBookmark == NULL && pArgs != NULL) + { + __pBookmark = dynamic_cast(pArgs->GetAt(1)); + } + + if (__pBookmark) + { + pageTitle = __pBookmark->GetBookmarkTitle(); + pageUrl = __pBookmark->GetUrl(); + } + } + else if (firstValue->CompareTo(L"0") == 0) + { + __view = CommonUtil::GetString(L"IDS_COM_SK_ADD"); + pHeader->SetTitleText(CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_BOOKMARK")); + + WindowInfo* pWindowInfo = MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo(); + + if( pWindowInfo == NULL ) + { + return; + } + + pageTitle = pWindowInfo->pageTitle; + if(pWindowInfo->pageUrl.IsEmpty() == false) + { + pageUrl = pWindowInfo->pageUrl; + } + String* parentID = dynamic_cast(pArgs->GetAt(1)); + + ArrayList folderList; + + BookmarkData* pBookmark = null; + BookmarkPresentationModel::GetInstance()->GetFolder(L"-1", 0, __folderCount, folderList); + for(int count = 0; count < folderList.GetCount(); count++) + { + pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + + if ( pBookmark == null ) + { + return ; + } + + if (parentID != NULL && pBookmark->GetBookmarkId().CompareTo(parentID->GetPointer()) == 0) + { + __selectedIndex = count + 2; + __folderName = pBookmark->GetBookmarkTitle(); + break; + } + else + { + __selectedIndex = 1 ; + __folderName = CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS") ; + } + + } + + if (__folderCount == 0) + { + __selectedIndex = 1 ; + __folderName = CommonUtil::GetString(L"IDS_BR_TAB_BOOKMARKS") ; + } + + folderList.RemoveAll(true); + } + } + + if ( previousSceneId == IDSCN_CREATE_BOOKMARK_FOLDER ) + { + pageTitle = __titleOnViewDeactivated; + pageUrl = __urlOnViewDeactivated; + } + + if (__pEditFieldTitle != NULL) + { + __pEditFieldTitle->SetText(pageTitle); + __pEditFieldTitle->ShowKeypad(); + } + if (__pEditFieldUrl != NULL) + { + __pEditFieldUrl->SetText(pageUrl); + __pEditFieldUrl->HideKeypad(); + } + + if (__view == CommonUtil::GetString(L"IDS_BR_SK_EDIT") && previousSceneId == IDSCN_CREATE_BOOKMARK_FOLDER ) + { + if (__oldFolderCount == 0) + { + if (__folderCount == 1) + { + __selectedIndex = 2; + } + } + else if (__oldFolderCount != __folderCount) + { + __selectedIndex = __folderCount + 1; + } + + } + + + if (__view == CommonUtil::GetString(L"IDS_COM_SK_ADD") && previousSceneId == IDSCN_CREATE_BOOKMARK_FOLDER) + { + + if (__oldFolderCount == 0) + { + if (__folderCount == 1) + { + __selectedIndex = 2; + } + } + else if (__oldFolderCount != __folderCount) + { + __selectedIndex = __folderCount + 1; + if(__selectedIndex > 1) + { + String parentID = L"-1"; + ArrayList folderList; + BookmarkData* pBookmark = null; + BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, __folderCount, folderList); + pBookmark = static_cast(folderList.GetAt(__selectedIndex-2)); + __folderName = pBookmark->GetBookmarkTitle(); + } + } + else if (__oldFolderCount == __folderCount ) + { + __selectedIndex = __folderCount + 1; + } + } + if (__pEditFieldTitle != NULL) + { + title = __pEditFieldTitle->GetText(); + title.Trim(); + } + + if (__pEditFieldUrl != NULL) + { + url = __pEditFieldUrl->GetText(); + url.Trim(); + } + + // To disable done button if either of the Title or Url field is empty + if (title.GetLength() == 0 || url.GetLength() == 0) + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, false); + pHeader->Invalidate(true); + } + else + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, true); + pHeader->Invalidate(true); + } + + if(__pList != null) + { + + __pList->UpdateList(); + __listHeight = __pList->GetItemCount() * H_ITEM_HEIGHT; + __pList->SetBounds(__pList->GetX(),__pList->GetY(),__pList->GetWidth(),__listHeight); + } + // __pList->RefreshList(0, LIST_REFRESH_TYPE_ITEM_MODIFY); + CATCH : return; +} + +void +AddBookmarkForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + // Add code to handle events when the AddBookmarkForm is Deactivated. + if ( __pEditFieldTitle != NULL) + { + __titleOnViewDeactivated = __pEditFieldTitle->GetText(); + } + + if ( __pEditFieldUrl != NULL) + { + __urlOnViewDeactivated = __pEditFieldUrl->GetText(); + } + + __oldFolderCount = __folderCount; + + if (__view == CommonUtil::GetString(L"IDS_BR_SK_EDIT") ) + { + __selectedIndex = 0; + } + return; +} + +void +AddBookmarkForm::OnTextValueChanged(const Control& source) +{ + String title = L""; + String url = L""; + Header* pHeader = GetHeader(); + if (pHeader == NULL) + { + return; + } + + if (__pEditFieldTitle == NULL || __pEditFieldUrl == NULL) + { + return; + } + + title = __pEditFieldTitle->GetText(); + url = __pEditFieldUrl->GetText(); + title.Trim(); + url.Trim(); + + // To disable done button if either of the Title or Url field is empty + if (title.GetLength() == 0 || url.GetLength() == 0) + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, false); + pHeader->Invalidate(true); + } + else + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, true); + pHeader->Invalidate(true); + } + + return; +} + +void +AddBookmarkForm::OnTextValueChangeCanceled(const Control& source) +{ + return; +} + +void +AddBookmarkForm::CreateMessage(String& str) +{ + Tizen::Ui::Controls::MessageBox* pMsgBox = null; // Message Box to display alert if folder with same name already exists + int __modalMsgBoxResult; + + pMsgBox = new(std::nothrow) MessageBox; + if (pMsgBox != null) + { + pMsgBox->Construct(str, L"", MSGBOX_STYLE_OK, 3000); + pMsgBox->ShowAndWait(__modalMsgBoxResult); + delete pMsgBox; + pMsgBox = null; + __modalMsgBoxResult = 0; + } + + return; +} + +void +AddBookmarkForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + // if (__pEditFieldTitle != NULL) + // { + // __pEditFieldTitle->HideKeypad(); + // } + // if (__pEditFieldUrl != NULL) + // { + // __pEditFieldUrl->HideKeypad(); + // } + + if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE) + { + if (__pScrollPanel != null) + { + __pScrollPanel->ScrollToTop(); + __pScrollPanel->SetClientAreaHeight(__pList->GetY()+__listHeight); + } + } + + //__pScrollPanel->Invalidate(true); + + if(__showFolderList == false) + { + if(__pLabel1 != null) + { + __pLabel1->SetShowState(true); + } + } + else + { + if(__pLabel1 != null) + { + __pLabel1->SetShowState(false); + } + } + + if (__pLabel1 != null) + { + __pLabel1->SetBounds(__pLabel1->GetX(),__pList->GetY()+ __listHeight + 2,__pLabel1->GetWidth(),__pLabel1->GetHeight()); + __pLabel1->Invalidate(true); + } + + if (__pList != null) + { + __pList->SetBounds(__pList->GetX(),__pList->GetY(),__pList->GetWidth(),__listHeight); + __pList->UpdateList(); + } + Invalidate(true); +} diff --git a/src/IntAddressbar.cpp b/src/IntAddressbar.cpp new file mode 100644 index 0000000..51637e0 --- /dev/null +++ b/src/IntAddressbar.cpp @@ -0,0 +1,853 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntAddressbar + *@brief: This class defines common behaviour of Addressbar control. + * + */ + +#include "IntAddressbar.h" +#include "IntCommonLib.h" +#include "IntTypes.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSettingPresentationModel.h" +#include "IntMultipleWindowPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Graphics; + +static const wchar_t* IDB_SEARCH_INPUT_FIELD_BG = L"I01_toolbar_input_field.9.png"; +static const wchar_t* IDB_TITLE_PROGRESS_BAR_BG = L"I01_title_progress_bar_bg.png"; +static const wchar_t* IDB_TITLE_PROGRESS_BAR = L"I01_title_progress_bar.png"; +static const wchar_t* IDB_ICON_PRIVATE = L"I01_icon_private.png"; + +//Action IDs +const int Addressbar::IDA_REFRESH_BTN_CLICKED = 101; +const int Addressbar::IDA_READER_BTN_CLICKED = 102; +const int Addressbar::IDA_STOP_BTN_CLICKED = 103; +const int Addressbar::IDA_GO_BACK = 104; +const int Addressbar::IDA_GO_FORWARD = 105; +const int Addressbar::IDA_CANCEL = 106; +const int Addressbar::IDA_CLEAR_URL = 107; + +Addressbar::Addressbar(void) +{ + __currentAddMode = ADDRESSBAR_MODE_LOADING_COMPLETE; + __displayUrl = L""; + __editTextUrl = L""; + __isLoadingData = false; + __isLoadingCompleted = false; + __progressPercentage = 0; + __pAddressbarBg = null; + __pBgPanel = null; + __pCancelBtn = null; + __pClearBtn = null; + __pFavIcon = FaviconManager::GetInstance()->GetDefaultFaviconN(); + __pFaviconLabel = null; + __pGoBackBtn = null; + __pGoForwardBtn = null; + __pLabelPrivateOn = null; + __pListener = null; + __pPrivateIconLabel = null; + __pProgressbarLabel = null; + __pPrivateIconLabel = null ; + __pReaderBtn = null; + __pRefreshBtn = null; + __pStopBtn = null; + __pClearBtn = null ; + __pSearchLabel = null; + __pUrlField = null; +} + +Addressbar::~Addressbar(void) +{ + if (__pFavIcon != null) + { + delete __pFavIcon; + __pFavIcon = null; + } +} + +result +Addressbar::Initialize(const Rectangle& rect) +{ + result r = E_SUCCESS; + + AppLogDebug("Addressbar::Initialize entered"); + //Construct the base first + r = Construct(L"IDL_ADDRESSBAR"); + + //Add background label + Label* pBgLabel = static_cast (GetControl(L"IDC_BG_LABEL",true)); + if (pBgLabel == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + //Add inner panel for border + __pBgPanel = static_cast (GetControl(L"IDC_BG_PANEL",true)); + if (__pBgPanel == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pLabelPrivateOn = static_cast (GetControl(L"IDC_LABEL_PRIVATE_ON",true)); + + if (__pLabelPrivateOn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pLabelPrivateOn->SetShowState(false); + + __pAddressbarBg = static_cast (GetControl(L"IDC_ADDRESSBAR_BG_LABEL",true)); + if (__pAddressbarBg == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pBgPanel->SetBackgroundColor(CUSTOM_COLOR_TRANSPARENT); + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_SEARCH_INPUT_FIELD_BG, __pAddressbarBg->GetWidth(), __pAddressbarBg->GetHeight()); + if (pBitmap != null) + { + __pAddressbarBg->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + + //Add the backround label for displaying progressbar + __pProgressbarLabel = static_cast (GetControl(L"IDC_PROGRESS_BAR_LABEL",true)); + if (__pProgressbarLabel == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pProgressbarLabel->SetShowState(false); + + //Add the go Back Button + __pGoBackBtn = static_cast (GetControl(L"IDC_BACKWARD_BUTTON",true)); + if (__pGoBackBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pGoBackBtn->SetActionId(IDA_GO_BACK); + __pGoBackBtn->AddActionEventListener(*this); + __pGoBackBtn->SetEnabled(false); + + //Add the go forward Button + __pGoForwardBtn = static_cast (GetControl(L"IDC_FORWARD_BUTTON",true)); + if (__pGoForwardBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pGoForwardBtn->SetActionId(IDA_GO_FORWARD); + __pGoForwardBtn->AddActionEventListener(*this); + __pGoForwardBtn->SetEnabled(false); + + + //Add the favicon + __pFaviconLabel = static_cast (GetControl(L"IDC_FAVICON_BUTTON",true)); + if (__pFaviconLabel == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pFaviconLabel->SetShowState(false); + + //Add the search icon + __pSearchLabel = static_cast (GetControl(L"IDC_SEARCH_BUTTON",true)); + if (__pSearchLabel == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pSearchLabel->SetShowState(true); + + //Add the refresh button + __pRefreshBtn = static_cast (GetControl(L"IDC_REFRESH_BUTTON",true)); + if (__pRefreshBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pRefreshBtn->SetActionId(IDA_REFRESH_BTN_CLICKED); + __pRefreshBtn->AddActionEventListener(*this); + __pRefreshBtn->SetShowState(true); + + + //Add the stop button + __pStopBtn = static_cast (GetControl(L"IDC_STOP_BUTTON",true)); + if (__pStopBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pStopBtn->SetActionId(IDA_STOP_BTN_CLICKED); + __pStopBtn->AddActionEventListener(*this); + __pStopBtn->SetShowState(false); + + + //Add the reader button + __pReaderBtn = static_cast (GetControl(L"IDC_READER_BUTTON",true)); + if (__pReaderBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pReaderBtn->SetActionId(IDA_READER_BTN_CLICKED); + __pReaderBtn->AddActionEventListener(*this); + __pReaderBtn->SetShowState(false); + + __pClearBtn = static_cast (GetControl(L"IDC_CLEAR_BUTTON",true)); + if (__pClearBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pClearBtn->SetActionId(IDA_CLEAR_URL); + __pClearBtn->AddActionEventListener(*this); + __pClearBtn->SetShowState(false); + + //Add the editfield for url + __pUrlField = static_cast (GetControl(L"IDC_URL_EDITFIELD",true)); + if (__pUrlField == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + + __pUrlField->SetOverlayKeypadCommandButtonVisible(false); + __pUrlField->SetKeypadAction(KEYPAD_ACTION_GO); + + //Add the Cancel Button + __pCancelBtn = static_cast (GetControl(L"IDC_CANCEL_BUTTON",true)); + if (__pCancelBtn == NULL) + { + AppLogDebug("Control not found returning E_INVALID_KEY"); + return E_INVALID_KEY; + } + __pCancelBtn->SetActionId(IDA_CANCEL); + __pCancelBtn->AddActionEventListener(*this); + __pCancelBtn->SetShowState(false); + // Added to get the favorite url if not set then address bar is about blank + + if (SettingPresentationModel::GetInstance()->GetHomepage().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + __pUrlField->SetGuideText(CommonUtil::GetString(L"IDS_BR_BODY_SEARCH_OR_ENTER_URL")); + } + else if (SettingPresentationModel::GetInstance()->GetHomepage().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")) == 0) + { + __pUrlField->SetGuideText(CommonUtil::GetString(L"IDS_BR_BODY_ABOUT_C_BLANK")); + } + else + { + //__pUrlField->SetText(SettingPresentationModel::GetInstance()->GetFavoriteURL()); + __pUrlField->SetGuideText(CommonUtil::GetString(L"IDS_BR_BODY_SEARCH_OR_ENTER_URL")); + } + __pUrlField->AddKeypadEventListener(*this); + + AppLogDebug("Addressbar::Initialize exit"); + return r; +} + +void +Addressbar::UpdateProgressBitmap(void) +{ + result r = E_SUCCESS; + if (__pProgressbarLabel == null) + return; + int w = __pProgressbarLabel->GetWidth(); + int h = __pProgressbarLabel->GetHeight(); + Canvas canvas; + int progressWidth = 0; + Bitmap* pRetBitmap = null; + + if (__progressPercentage == 0 || __progressPercentage == 100) + { + __pProgressbarLabel->SetShowState(false); + __pProgressbarLabel->Invalidate(false); + return; + } + else + { + __pProgressbarLabel->SetShowState(true); + __pProgressbarLabel->Invalidate(false); + } + + r = canvas.Construct(Rectangle(0, 0, w, h)); + + if (r != E_SUCCESS) + { + AppLogException("Canvas construction failed with %s", GetErrorMessage(r)); + return; + } + + canvas.Clear(); + Bitmap *pBgBmp = AppResource::GetInstance()->GetBitmapN(IDB_TITLE_PROGRESS_BAR_BG); + + if (pBgBmp != null) + { + pBgBmp->Scale(Dimension(w, h)); + canvas.DrawBitmap(Point(0,0), *pBgBmp); + delete pBgBmp; + } + + progressWidth = (double) (w) * __progressPercentage / 100; + AppLogDebug("progressWidth: %d", progressWidth); + Bitmap *pProgressBmp = AppResource::GetInstance()->GetBitmapN(IDB_TITLE_PROGRESS_BAR); + + if (pProgressBmp != null) + { + pProgressBmp->Scale(Dimension(progressWidth, h)); + canvas.DrawBitmap(Point(0,0), *pProgressBmp); + delete pProgressBmp; + } + + pRetBitmap = new (std::nothrow) Bitmap(); + + if (pRetBitmap == null) + { + AppLogException("Bitmap creation failed with %s", GetErrorMessage(r)); + return; + } + + pRetBitmap->Construct(canvas, canvas.GetBounds()); + + if (__pProgressbarLabel != null && pRetBitmap != null) + { + __pProgressbarLabel->SetBackgroundBitmap(*pRetBitmap); + __pProgressbarLabel->Invalidate(false); + } + + + if (pRetBitmap != null) + { + delete pRetBitmap; + pRetBitmap = null; + } + return; +} + +void +Addressbar::SetUrl(const String& url) +{ + __displayUrl = url; + String updatedDisplayUrl; + updatedDisplayUrl.Clear(); + + if (__pUrlField != NULL) + { + String removedHttpUrl = RemoveHttpTextFromDisplayURL(); + if (removedHttpUrl.IsEmpty() == false) + { + __pUrlField->SetText(removedHttpUrl); + } + else + { + __pUrlField->SetText(__displayUrl); + } + + __pUrlField->Invalidate(false); + __pUrlField->SetCursorPosition(0); + } +} + +String +Addressbar::GetUrl(void) +{ + return __displayUrl; +} + +AddressBarMode +Addressbar::GetAddressbarMode(void) +{ + return __currentAddMode; +} + +void +Addressbar::SetAddressbarMode(AddressBarMode addMode) +{ + AppLogDebug("AddressBar::setAddressbarMode to %d",addMode); + + __currentAddMode = addMode; + + switch(addMode) + { + case ADDRESSBAR_MODE_INVALID: + { + // do nothing + } + break; + case ADDRESSBAR_MODE_READER: + { + __pBgPanel->SetPosition(__pGoBackBtn->GetPosition().x + 2* __pGoBackBtn->GetWidth() + 13,__pBgPanel->GetPosition().y); + __pSearchLabel->SetShowState(false); + __pFaviconLabel->SetShowState(true); + __pCancelBtn->SetShowState(false); + __pRefreshBtn->SetShowState(false); + __pStopBtn->SetShowState(false); + __pReaderBtn->SetShowState(true); + __pReaderBtn->Invalidate(true); + __pGoForwardBtn->SetShowState(true); + __pGoBackBtn->SetShowState(true); + __pClearBtn->SetShowState(false); + + } + break; + + case ADDRESSBAR_MODE_LOADING: + { + __pBgPanel->SetPosition(__pGoBackBtn->GetPosition().x + 2* __pGoBackBtn->GetWidth() + 13,__pBgPanel->GetPosition().y); + __pSearchLabel->SetShowState(false); + __pFaviconLabel->SetShowState(true); + __pCancelBtn->SetShowState(false); + __pRefreshBtn->SetShowState(false); + __pStopBtn->SetShowState(true); + __pReaderBtn->SetShowState(false); + __pGoForwardBtn->SetShowState(true); + __pGoBackBtn->SetShowState(true); + __pClearBtn->SetShowState(false); + + } + break; + + case ADDRESSBAR_MODE_LOADING_COMPLETE: + { + __pBgPanel->SetPosition(__pGoBackBtn->GetPosition().x + 2* __pGoBackBtn->GetWidth() + 13,__pBgPanel->GetPosition().y); + __pCancelBtn->SetShowState(false); + + if (__pUrlField && __pUrlField->GetText().IsEmpty() == false) + { + + __pSearchLabel->SetShowState(false); + __pFaviconLabel->SetShowState(true); + } + else + { + __pSearchLabel->SetShowState(true); + __pFaviconLabel->SetShowState(false); + } + + if (__pUrlField != NULL) + { + __pUrlField->SetText(__displayUrl); + __pUrlField->HideKeypad(); + } + + __pRefreshBtn->SetShowState(true); + __pStopBtn->SetShowState(false); + __pReaderBtn->SetShowState(false); + __pGoForwardBtn->SetShowState(true); + __pGoBackBtn->SetShowState(true); + __pClearBtn->SetShowState(false); + } + break; + case ADDRESSBAR_MODE_EDIT: + { + __pBgPanel->SetPosition(__pGoBackBtn->GetPosition().x,__pBgPanel->GetPosition().y); + __pCancelBtn->SetShowState(true); + __pRefreshBtn->SetShowState(false); + __pStopBtn->SetShowState(false); + __pReaderBtn->SetShowState(false); + __pGoForwardBtn->SetShowState(false); + __pGoBackBtn->SetShowState(false); + __pClearBtn->SetShowState(true); + if (__pUrlField && __pUrlField->GetText().IsEmpty() == true) + { + __pSearchLabel->SetShowState(true); + __pFaviconLabel->SetShowState(false); + } + else + { + __pSearchLabel->SetShowState(false); + __pFaviconLabel->SetShowState(true); + } + if (__pUrlField != NULL) + { + __pUrlField->SetCursorPosition(__pUrlField->GetTextLength()); + } + + } + break; + } + + if (__pAddressbarBg->GetWidth() != __pBgPanel->GetWidth()) + { + __pAddressbarBg->SetBounds(Rectangle(0, 0, __pBgPanel->GetWidth(), __pBgPanel->GetHeight())); + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_search_input_field_bg.9.png", __pAddressbarBg->GetWidth(), __pAddressbarBg->GetHeight()); + if (pBitmap != null) + { + __pAddressbarBg->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + } + + Invalidate(true); + + if (__pListener != null) + { + __pListener->OnAddressBarModeChanged(*this); + } +} + +void +Addressbar::SetFaviconBitmap(const Tizen::Graphics::Bitmap& favicon) +{ + + String url =__pUrlField->GetText(); + String secureSiteText = "https://"; + bool flag = false; + flag = url.StartsWith(secureSiteText,0); + + if (__pFavIcon != null) + { + delete __pFavIcon; + } + + __pFavIcon = new(std::nothrow) Bitmap(); + __pFavIcon->Construct(favicon,Rectangle(0,0,favicon.GetWidth(),favicon.GetHeight())); + + if (flag == true) + { + Bitmap* pButtonImage = GetLockedImageN(); + + if (pButtonImage != null) + { + __pFaviconLabel->SetBackgroundBitmap(*pButtonImage); + __pFaviconLabel->Invalidate(true); + delete pButtonImage; + } + } + else + { + if (__pFaviconLabel != null) + { + __pFaviconLabel->SetBackgroundBitmap(*__pFavIcon); + __pFaviconLabel->Invalidate(true); + } + } +} + +void Addressbar::SaveAddressbarEditText() +{ + __editTextUrl = __pUrlField->GetText(); +} + +void +Addressbar::UpdateFaviconBitmap(bool isPrivateOn) +{ + + String url =__pUrlField->GetText(); + String secureSiteText = "https://"; + bool flag = false; + flag = url.StartsWith(secureSiteText,0); + + if (isPrivateOn == true) + { + __pUrlField->SetBounds(__pLabelPrivateOn->GetBounds().x + __pLabelPrivateOn->GetBounds().width,__pUrlField->GetBounds().y , __pAddressbarBg->GetBounds().width - __pLabelPrivateOn->GetBounds().width - __pRefreshBtn->GetBounds().width - __pSearchLabel->GetBounds().width,__pUrlField->GetBounds().height ); + __pLabelPrivateOn->SetShowState(true); + + } + else + { + __pUrlField->SetBounds(__pLabelPrivateOn->GetBounds().x ,__pUrlField->GetBounds().y , __pAddressbarBg->GetBounds().width - __pRefreshBtn->GetBounds().width - __pSearchLabel->GetBounds().width,__pUrlField->GetBounds().height ); + __pLabelPrivateOn->SetShowState(false); + } + + + if (flag == true) + { + Bitmap* pButtonImage = GetLockedImageN(); + + if (pButtonImage != null) + { + __pFaviconLabel->SetBackgroundBitmap(*pButtonImage); + __pFaviconLabel->Invalidate(true); + delete pButtonImage; + } + } + else + { + if (__pFaviconLabel != null) + { + __pFaviconLabel->SetBackgroundBitmap(*__pFavIcon); + __pFaviconLabel->Invalidate(true); + } + } + + + __pAddressbarBg->Invalidate(true); +} + +void +Addressbar::SetForwardButtonEnabled(bool isEnabled) +{ + __pGoForwardBtn->SetEnabled(isEnabled); + __pGoBackBtn->Invalidate(true); +} + +void +Addressbar::SetBackButtonEnabled(bool isEnabled) +{ + __pGoBackBtn->SetEnabled(isEnabled); + __pGoBackBtn->Invalidate(true); +} + +void +Addressbar::SetAddressbarEventListener(IAddressbarEventListener* plistener) +{ + __pListener = plistener; +} + +void +Addressbar::UpdateProgress(int percentage) +{ + __progressPercentage = percentage; + if (percentage == 0 || percentage == 100) + { + __isLoadingData = false; + if (percentage == 100) + { + __isLoadingCompleted = true; + __progressPercentage = 0; + } + else + { + __isLoadingCompleted = false; + } + } + else + { + __isLoadingData = true; + } + UpdateProgressBitmap(); +} + +int +Addressbar::GetProgress(void) +{ + return __progressPercentage; +} + +void +Addressbar::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("Addressbar::OnActionPerformed action %d",actionId); + + switch (actionId) + { + case IDA_REFRESH_BTN_CLICKED: + __isLoadingCompleted = false; + __isLoadingData = true; + __progressPercentage = 0; + __pUrlField->HideKeypad(); + __displayUrl = __pUrlField->GetText(); + + if (__pListener != NULL) + { + __pListener->OnUrlSubmitted(*this); + } + + UpdateProgressBitmap(); + break; + + case IDA_STOP_BTN_CLICKED: + __isLoadingCompleted = false; + __isLoadingData = false; + __progressPercentage = 0; + __pUrlField->HideKeypad(); + __displayUrl = __pUrlField->GetText(); + + if (__pListener != NULL) + { + __pListener->OnStopClicked(*this); + } + + UpdateProgressBitmap(); + break; + case IDA_READER_BTN_CLICKED: + __pUrlField->HideKeypad(); + __displayUrl = __pUrlField->GetText(); + + if (__pListener != NULL) + { + __pListener->OnReaderClicked(*this); + } + + break; + + case IDA_GO_BACK: + { + if (__pListener != NULL) + { + __pListener->OnBackClicked(*this); + + } + } + break; + + case IDA_GO_FORWARD: + { + if (__pListener != NULL ) + __pListener->OnForwardClicked(*this); + } + break; + + case IDA_CANCEL: + { + __pListener->OnAddressCancelledClicked(*this); + __pUrlField->SetText(__displayUrl); + __editTextUrl = L""; + __pUrlField->HideKeypad(); + SetAddressbarMode(ADDRESSBAR_MODE_LOADING_COMPLETE); + } + break; + + case IDA_CLEAR_URL: + { + if (__pUrlField->GetText().IsEmpty() == false) + { + //__displayUrl = __pUrlField->GetText(); + __pUrlField->Clear(); + __pUrlField->Invalidate(true); + } + } + break; + default: + break; + } +} + +void +Addressbar::OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction) +{ + AppLog("Addressbar::OnKeypadActionPerformed keypadAction %d",keypadAction); + switch (keypadAction) + { + case KEYPAD_ACTION_GO: + case KEYPAD_ACTION_ENTER: + case KEYPAD_ACTION_SEND: + { + if (__pUrlField->GetText().IsEmpty() == false) + { + SetAddressbarMode(ADDRESSBAR_MODE_LOADING); + __displayUrl = __pUrlField->GetText(); + + __isLoadingCompleted = false; + __isLoadingData = true; + __progressPercentage = 0; + __pUrlField->HideKeypad(); + + if (__pListener != NULL) + { + __pListener->OnUrlSubmitted(*this); + } + UpdateProgressBitmap(); + + } + } + break; + + default: + break; + } +} + +void +Addressbar::OnKeypadClosed(Tizen::Ui::Control& source) +{ + __pListener->OnAddressBarKeypadClosed(*this); +} + +void +Addressbar::OnKeypadOpened(Tizen::Ui::Control& source) +{ +// __pListener->OnAddressBarKeypadOpened(*this); + __pListener->OnAddressBarKeypadOpened(*this); +} + +void +Addressbar::OnKeypadWillOpen(Tizen::Ui::Control& source) +{ + SetAddressbarMode(ADDRESSBAR_MODE_EDIT); + // SetAddressbarMode(__prevAddMode); + if(__pListener != null) + { + __pListener->OnAddressBarKeypadWillOpen(*this); + } +} +void +Addressbar::OrientationChanged(void) +{ + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_SEARCH_INPUT_FIELD_BG, __pAddressbarBg->GetWidth(), __pAddressbarBg->GetHeight()); + if (pBitmap != null) + { + __pAddressbarBg->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + Invalidate(true); +} + +String +Addressbar::RemoveHttpTextFromDisplayURL(void) +{ + bool isHttpText = __displayUrl.Contains(L"http://"); + String updatedDisplayUrl; + updatedDisplayUrl.Clear(); + + if (isHttpText == true) + { + __displayUrl.SubString(7,updatedDisplayUrl); + } + return updatedDisplayUrl; +} + +Bitmap* +Addressbar::GetLockedImageN(void) +{ + Bitmap* pIconImage = null; + + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + if (pAppResource) + { + pIconImage = pAppResource->GetBitmapN(IDB_ICON_PRIVATE); + } + + Bitmap* pLockImage = new (std::nothrow) Bitmap(); + + Canvas* pCanvas = new (std::nothrow) Canvas(); + pCanvas->Construct(Rectangle(0,0,__pFaviconLabel->GetWidth(),__pFaviconLabel->GetHeight())); + pCanvas->Clear(); + pCanvas->DrawBitmap(Rectangle(0,0,__pFaviconLabel->GetWidth(),__pFaviconLabel->GetHeight()),*__pFavIcon); + pCanvas->DrawBitmap(Rectangle(__pFaviconLabel->GetWidth()/2,__pFaviconLabel->GetHeight()/2,__pFaviconLabel->GetWidth()/2,__pFaviconLabel->GetHeight()/2),*pIconImage); + pLockImage->Construct(*pCanvas,Rectangle(0,0,__pFaviconLabel->GetWidth(),__pFaviconLabel->GetHeight())); + + delete pCanvas; + return pLockImage; +} + + diff --git a/src/IntBookmarkData.cpp b/src/IntBookmarkData.cpp new file mode 100644 index 0000000..e496f4f --- /dev/null +++ b/src/IntBookmarkData.cpp @@ -0,0 +1,177 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntBookmark.cpp + *@brief: Used to define bookmark + */ + +#include "IntBookmarkData.h" + +using namespace Tizen::Base; + +BookmarkData::BookmarkData(void) + : __bookmarkId("") + , __bookmarkType(BOOKMARK_TYPE_URL) + , __bookmarkTitle("") + , __bookmarkUrl("") + , __parentId("-1") + , __iconPath("") + , __faviconId("") +{ + __createdTime.SetValue(0, 0, 0); + __modifiedTime.SetValue(0, 0, 0); +} + +BookmarkData::BookmarkData(const BookmarkData& bookmark) +{ + __bookmarkId = bookmark.__bookmarkId; + __bookmarkType = bookmark.__bookmarkType; + __bookmarkTitle = bookmark.__bookmarkTitle; + __bookmarkUrl = bookmark.__bookmarkUrl; + __parentId = bookmark.__parentId; + __iconPath=bookmark.__iconPath; + __faviconId=bookmark.__faviconId; +} + +BookmarkData::~BookmarkData(void) +{ + +} + +BookmarkData& +BookmarkData::operator =(const BookmarkData& rhs) +{ + if (this != &rhs) + { + __bookmarkId = rhs.__bookmarkId; + __bookmarkType = rhs.__bookmarkType; + __bookmarkTitle = rhs.__bookmarkTitle; + __bookmarkUrl = rhs.__bookmarkUrl; + __parentId = rhs.__parentId; + __iconPath = rhs.__iconPath; + __faviconId = rhs.__faviconId; + } + return *this; +} + +String +BookmarkData::GetBookmarkId(void) +{ + return __bookmarkId; +} + +type +BookmarkData::GetBookmarkType(void) +{ + if (__bookmarkUrl.GetLength() > 0) + __bookmarkType = BOOKMARK_TYPE_URL; + else + __bookmarkType = BOOKMARK_TYPE_FOLDER; + return __bookmarkType; +} + +String +BookmarkData::GetBookmarkTitle(void) +{ + return __bookmarkTitle; +} + +String +BookmarkData::GetUrl(void) +{ + return __bookmarkUrl; +} + +String +BookmarkData::GetParentId(void) +{ + return __parentId; +} + +DateTime +BookmarkData::GetCreatedTime(void) +{ + return __createdTime; +} + +DateTime +BookmarkData::GetModifiedTime(void) +{ + return __modifiedTime; +} + +String +BookmarkData::GetIconPath(void) +{ + return __iconPath; +} + +String +BookmarkData::GetFaviconId(void) +{ + return __faviconId; +} + +void +BookmarkData::SetBookmarkId(const String& strBookmarkId) +{ + __bookmarkId = strBookmarkId; +} + +void +BookmarkData::SetBookmarkTitle(String& strTitle) +{ + strTitle.Trim(); + __bookmarkTitle = strTitle; +} + +void +BookmarkData::SetUrl(const String& strUrl) +{ + __bookmarkUrl = strUrl; +} + +void +BookmarkData::SetParentId(const String& strParentID) +{ + __parentId = strParentID; +} + +void +BookmarkData::SetCreatedTime(const DateTime& strCreatedTime) +{ + __createdTime = strCreatedTime; +} + +void +BookmarkData::SetModifiedTime(const DateTime& strModifiedTime) +{ + __modifiedTime = strModifiedTime; +} + +void +BookmarkData::SetIconPath(const String& strFilePath) +{ + __iconPath = strFilePath; +} + +void +BookmarkData::SetFaviconId(const String& strFaviconId) +{ + __faviconId = strFaviconId; +} diff --git a/src/IntBookmarkListForm.cpp b/src/IntBookmarkListForm.cpp new file mode 100644 index 0000000..c30e429 --- /dev/null +++ b/src/IntBookmarkListForm.cpp @@ -0,0 +1,1095 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntBookmarkListForm + *@brief: This class defines BookmarkListForm + * + */ + +#include +#include "IntBookmarkData.h" +#include "IntBookmarkListForm.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntConfirmationPopup.h" +#include "IntFaviconManager.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" +#include "IntTypes.h" + + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const wchar_t* DEFAULT_VALUE_PARENTID = L"-1"; +static const wchar_t* IDB_TAB_ICON_BOOKMARK = L"I01_tab_icon_bookmarks.png"; +static const wchar_t* IDB_TAB_ICON_HISTORY = L"I01_tab_icon_history.png"; +static const wchar_t* IDB_NO_CONTENT_BOOKMARK = L"I01_Nocontents_Bookmarks.png"; +static const wchar_t* IDB_ICON_FOLDER_OPEN = L"I01_icon_folder_open.png"; + +const int BookmarkListForm::IDA_TABBAR_ITEM_1 = 101; +const int BookmarkListForm::IDA_TABBAR_ITEM_2 = 102; +const int BookmarkListForm::IDA_FOOTER_ITEM1 = 103; +const int BookmarkListForm::IDA_FOOTER_ITEM2 = 104; +const int BookmarkListForm::IDA_FOOTER_ITEM_ADDBOOKMARK = 105; +const int BookmarkListForm::IDA_FORMAT_FOLDER = 106; +const int BookmarkListForm::IDA_FORMAT_SITE = 107; +const int BookmarkListForm::IDA_CONTEXT_ITEM_FOLDER_EDIT = 108; +const int BookmarkListForm::IDA_CONTEXT_ITEM_FOLDER_DELETE = 109; +const int BookmarkListForm::IDA_CONTEXT_ITEM_EDIT = 110; +const int BookmarkListForm::IDA_CONTEXT_ITEM_SHARE = 111; +const int BookmarkListForm::IDA_CONTEXT_ITEM_DELETE = 112; +const int BookmarkListForm::IDA_FORMAT_ICON = 113; +const int BookmarkListForm::IDA_FORMAT_URL = 114; + +//const int BookmarkListForm::IDA_CONFIRMATION_NO = 1000; +//const int BookmarkListForm::IDA_CONFIRMATION_YES = 1001; + +BookmarkListForm::BookmarkListForm(void) +{ + __pItemContextFolder = null ; + __pItemContextSite = null ; + __pListview = null; + __pData = null; + __pSearchListView = null; + __pSearchBar = null; + __searchBookmark = false; + __parentID = DEFAULT_VALUE_PARENTID; + __noBookmarks = true; + __selectedindex = 0; +} + +BookmarkListForm::~BookmarkListForm(void) +{ + + if (__pData != null) + { + __pData->RemoveAll(true); + delete __pData; + __pData = NULL; + } + + if (__pItemContextFolder != null) + { + delete __pItemContextFolder; + } + + if (__pItemContextSite != null) + { + delete __pItemContextSite; + } +} + +result +BookmarkListForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + if (__pData != null) + { + __pData->RemoveAll(true); + delete __pData; + __pData = NULL; + } + + return r; +} + + +bool +BookmarkListForm::Initialize(void) +{ + Construct(L"IDL_BOOKMARK_LIST"); + return true; +} + +result +BookmarkListForm::OnInitializing(void) +{ + result r = E_SUCCESS; + HeaderItem bookmark; + HeaderItem history; + Bitmap *pBitmapNormal = null; + Bitmap *pBitmapPressed = null; + Header *pHeader = GetHeader(); + Bitmap *pIconBitmap = null; + AppResource* pAppResource = UiApp::GetInstance()->GetAppResource(); + int bookmarkCount = 0; + const int WIDTH_CONTEXT_MENU_TWO_BUTTON = 336; + const int WIDTH_CONTEXT_MENU_THREE_BUTTON = 160; + const int HEIGHT_CONTEXT_MENU_BUTTON = 72; + + // Setup back event listener + SetFormBackEventListener(this); + AddOrientationEventListener(*this); + + SceneManager::GetInstance()->AddSceneEventListener(IDSCN_BOOKMARK_VIEW, *this); + GetHeader()->AddActionEventListener(*this); + GetFooter()->AddActionEventListener(*this); + + if ( pAppResource == NULL ) + { + return E_FAILURE; + } + + __pItemContextFolder = new(std::nothrow) ListContextItem(); + __pItemContextFolder->Construct(); + __pItemContextFolder->AddElement(IDA_CONTEXT_ITEM_FOLDER_EDIT, CommonUtil::GetString(L"IDS_BR_SK_EDIT")); + pBitmapNormal = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete.9.png", WIDTH_CONTEXT_MENU_TWO_BUTTON, HEIGHT_CONTEXT_MENU_BUTTON); + pBitmapPressed = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete_press.9.png", WIDTH_CONTEXT_MENU_TWO_BUTTON, HEIGHT_CONTEXT_MENU_BUTTON); + + if (pBitmapNormal != null && pBitmapPressed != null) + { + __pItemContextFolder->AddElement(IDA_CONTEXT_ITEM_FOLDER_DELETE, CommonUtil::GetString(L"IDS_BR_SK_DELETE_ABB"), *pBitmapNormal, *pBitmapPressed, pBitmapPressed); + } + + if (pBitmapNormal != null) + { + delete pBitmapNormal; + } + + if (pBitmapPressed != null) + { + delete pBitmapPressed; + } + + __pItemContextSite = new(std::nothrow) ListContextItem(); + __pItemContextSite->Construct(); + __pItemContextSite->AddElement(IDA_CONTEXT_ITEM_EDIT, CommonUtil::GetString(L"IDS_BR_SK_EDIT")); + __pItemContextSite->AddElement(IDA_CONTEXT_ITEM_SHARE, CommonUtil::GetString(L"IDS_BR_OPT_SHARE")); + pBitmapNormal = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete.9.png", WIDTH_CONTEXT_MENU_THREE_BUTTON, HEIGHT_CONTEXT_MENU_BUTTON); + pBitmapPressed = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete_press.9.png", WIDTH_CONTEXT_MENU_THREE_BUTTON, HEIGHT_CONTEXT_MENU_BUTTON); + + if (pBitmapNormal != null && pBitmapPressed != null) + { + __pItemContextSite->AddElement(IDA_CONTEXT_ITEM_DELETE, CommonUtil::GetString(L"IDS_BR_SK_DELETE_ABB"), *pBitmapNormal, *pBitmapPressed, pBitmapPressed); + } + + if (pBitmapNormal != null) + { + delete pBitmapNormal; + } + + if (pBitmapPressed != null) + { + delete pBitmapPressed; + } + __pListview = static_cast< ListView* >(GetControl("IDC_LISTVIEW1")); + + if (__pListview == null) + { + return E_FAILURE; + } + __pSearchBar = static_cast< SearchBar* >(GetControl(L"IDC_SEARCHBAR1")); + + if (__pSearchBar == null) + { + return E_FAILURE; + } + + if (__pListview != null) + { + // __pListview->SetBounds(__pListview->GetX(), __pListview->GetY(), GetClientAreaBounds().width, GetClientAreaBounds().height); + __pListview->AddFastScrollListener(*this); + __pListview->AddListViewItemEventListener(*this); + __pListview->SetItemProvider(*this); + __pListview->UpdateList(); + } + + __pPopUp = new(std::nothrow) SharePopup(); + + if (__pPopUp != null) + { + __pPopUp->Initialize(); + AddControl(*__pPopUp); + } + + __pSearchListView = new(std::nothrow) ListView(); + + if (__pSearchListView == null) + { + return E_FAILURE; + } + + r = __pSearchListView->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height -72 - 30), true, false); + TryCatch( !IsFailed(r),,"BookmarkListForm::OnSearchBarModeChanged Update list failed %s",GetErrorMessage(r)); + + __pSearchListView->SetItemProvider(*this); + __pSearchListView->SetTextOfEmptyList(CommonUtil::GetString(L"IDS_BR_BODY_NO_RESULTS_FOUND")); + __pSearchListView->SetTextColorOfEmptyList(Color::GetColor(COLOR_ID_BLACK)); + __pSearchListView->SetShowState(false); + __pSearchListView->AddListViewItemEventListener(*this); + + __pSearchBar->AddSearchBarEventListener(*this); + __pSearchBar->AddKeypadEventListener(*this); + __pSearchBar->SetContent(__pSearchListView); + + BookmarkPresentationModel::GetInstance()->GetFolderBookmarkCount(__parentID, bookmarkCount); + if(bookmarkCount <= 0) + { + __pSearchBar->SetShowState(false); + //__pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetY(),__pSearchBar->GetWidth(),GetClientAreaBounds().height - __pSearchBar->GetPosition().y); + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetY(),__pListview->GetWidth(),GetClientAreaBounds().height); + } + else + { + __pSearchBar->SetShowState(true); + } + + + if (pHeader != null) + { + pHeader->SetStyle(HEADER_STYLE_TAB); + bookmark.Construct(IDA_TABBAR_ITEM_1); + String strbookmark; + pAppResource->GetString(L"IDS_BR_TAB_BOOKMARKS", strbookmark); + bookmark.SetText(strbookmark); + pIconBitmap = pAppResource->GetBitmapN(IDB_TAB_ICON_BOOKMARK); + bookmark.SetIcon(HEADER_ITEM_STATUS_NORMAL, pIconBitmap); + bookmark.SetIcon(HEADER_ITEM_STATUS_PRESSED, pIconBitmap); + pHeader->AddItem(bookmark); + + if (pIconBitmap != NULL) + { + delete pIconBitmap; + } + + history.Construct(IDA_TABBAR_ITEM_2); + String strhistory; + pAppResource->GetString(L"IDS_BR_TAB_HISTORY", strhistory); + history.SetText(strhistory); + pIconBitmap = pAppResource->GetBitmapN(IDB_TAB_ICON_HISTORY); + history.SetIcon(HEADER_ITEM_STATUS_NORMAL, pIconBitmap); + history.SetIcon(HEADER_ITEM_STATUS_PRESSED, pIconBitmap); + pHeader->AddItem(history); + pHeader->SetItemSelected(0); + + if (pIconBitmap != NULL) + { + delete pIconBitmap; + } + } + + + CATCH:return r; +} + +void +BookmarkListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("BookmarkListForm::OnActionPerformed actionId = %d",actionId); + String bookmarkId; + int id = 0; + BookmarkData* pBookMark = null; + + switch (actionId) + { + case IDA_FOOTER_ITEM1: + { + GetHeader()->SetItemSelected(0); + GetHeader()->Invalidate(true); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(__selectedindex)); + + if ( pBookMark == NULL ) + { + return; + } + + ArrayList* pArgList = null; + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) String(pBookMark->GetParentId())); + } + //pArgList->Add(*new(std::nothrow) String(pBookmark->); + if (pSceneManager != null) + { + if(pSceneManager->GoForward(ForwardSceneTransition(IDSCN_EDIT_BOOKMARK_LIST),pArgList) != E_SUCCESS) + { + AppLogDebug("BookmarkListForm::OnActionPerformed GoForward failed"); + pArgList->RemoveAll(true); + delete pArgList; + pArgList = null; + return; + } + } + + if ( pArgList != NULL) + { + pArgList->RemoveAll(true); + delete pArgList; + } + } + + break; + case IDA_TABBAR_ITEM_2: + { + GetHeader()->SetItemSelected(0); + GetHeader()->Invalidate(true); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager != null) + { + if(pSceneManager->GoForward(ForwardSceneTransition(IDSCN_HISTORY_LIST, SCENE_TRANSITION_ANIMATION_TYPE_LEFT)) != E_SUCCESS) + { + AppLogDebug("BookmarkListForm::OnActionPerformed GoForward failed"); + return; + } + } + } + break; + case IDA_FOOTER_ITEM2: + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager) + { + if(pSceneManager->GoForward(ForwardSceneTransition(IDSCN_CREATE_BOOKMARK_FOLDER)) != E_SUCCESS) + { + AppLogDebug("BookmarkListForm::OnActionPerformed GoForward failed"); + return; + } + } + } + break; + case IDA_FOOTER_ITEM_ADDBOOKMARK: + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + + // send array list 0-for add, 1 for edit with parent ID + ArrayList* pArgList = null; + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) String(L"0")); + pArgList->Add(*new(std::nothrow) String(__parentID)); + } + + if (pSceneManager) + { + if(pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ADD_BOOKMARK),pArgList) != E_SUCCESS) + { + AppLogDebug("BookmarkListForm::OnActionPerformed GoForward failed"); + pArgList->RemoveAll(true); + delete pArgList; + return; + } + } + + if (pArgList != null) + { + pArgList->RemoveAll(true); + delete pArgList; + } + + } + break; + case IDA_BUTTON_NO: + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + break; + case IDA_BUTTON_YES: + pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(__selectedindex)); + if ( pBookMark== null) + return; + bookmarkId=pBookMark->GetBookmarkId(); + Integer::Parse(bookmarkId,id); + if (pBookMark->GetBookmarkType() == BOOKMARK_TYPE_FOLDER) + BookmarkPresentationModel::GetInstance()->DeleteFolder(id); + else + BookmarkPresentationModel::GetInstance()->DeleteBookmark(id); + if (__pListview == null) + { + return; + } + AppLogDebug("__pListview GetBounds %d,%d,%d,%d",__pListview->GetBounds().x,__pListview->GetBounds().y,__pListview->GetBounds().width,__pListview->GetBounds().height); + __pSearchListView->UpdateList(); + __pListview->UpdateList(); + + if (__pListview->GetItemCount() == 0) + { + GetFooter()->SetItemEnabled(1,false); + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + } + + if (__noBookmarks == true) + { + Bitmap* emptyListBmp = AppResource::GetInstance()->GetBitmapN(IDB_NO_CONTENT_BOOKMARK); + GetFooter()->SetItemEnabled(1,false); + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + // __pListview->SetBounds(__pSearchBar->GetPosition().x,__pSearchBar->GetPosition().y,__pSearchBar->GetWidth() ,GetClientAreaBounds().height); + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetPosition().y,__pSearchBar->GetWidth() ,GetClientAreaBounds().height); + __pListview->SetBitmapOfEmptyList(emptyListBmp); + if (emptyListBmp) + { + delete emptyListBmp; + emptyListBmp = null; + } + __pListview->UpdateList(); + + } + else + { + GetFooter()->SetItemEnabled(1,true); + + if (__parentID.CompareTo(L"-1") == 0) + { + __pSearchBar->SetShowState(true); + __pSearchBar->Invalidate(true); + } + } + + GetFooter()->Invalidate(true); + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + + break; + default: + break; + } +} + +void +BookmarkListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("BrowserApplicationForm::OnFormBackRequested"); + + UiApp* pApp = UiApp::GetInstance(); + if (pApp == null) + { + return; + } + + if (__parentID != DEFAULT_VALUE_PARENTID) + { + __parentID = DEFAULT_VALUE_PARENTID; + __pSearchBar->SetShowState(true); + __pListview->SetBounds(__pListview->GetX() ,__pSearchBar->GetPosition().y + __pSearchBar->GetHeight(),__pListview->GetWidth(),GetClientAreaBounds().height - (__pSearchBar->GetY() + __pSearchBar->GetHeight())); + __pListview->UpdateList(); + __pFooter = GetFooter(); + GetFooter()->SetItemEnabled(2,true); + GetFooter()->Invalidate(true); + } + else + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + } + + if (__noBookmarks == true) + { + GetFooter()->SetItemEnabled(1,false); + } + else + { + GetFooter()->SetItemEnabled(1,true); + } +} + +Tizen::Ui::Controls::ListItemBase* +BookmarkListForm::CreateItem(int index, int itemWidth) +{ + AppLog("BookmarkListForm::CreateItem index %d , itemWidth %d",index, itemWidth); + AppLog("listviewwidth %d",__pListview->GetWidth()); + result r = E_FAILURE; + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + CustomItem* pItem = new(std::nothrow) CustomItem(); + BookmarkData* pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + Bitmap* pBitmap = null; + + const int x_Margin_Icon = 16; // local as there used only in this function + const int y_Margin_Icon = 28; + const int height_Icon = 72; + const int width_Icon = 72 ; + const int x_Margin_Title = 104 ; + const int y_Margin_Title = 10; + const int width_Title = GetClientAreaBounds().width - 108 - 52 - 30; + const int x_Margin_Url = 104 ; + const int y_Margin_Url = 70 ; + const int width_Url = GetClientAreaBounds().width - 108 - 52 ; + const int height_Url = 48; + const int itemHeight = 128; + const int textSize = 32; + String bitmapId; + + if( pBookMark == NULL ) + { + delete pItem; + pItem = null; + return NULL; + } + if ( pBookMark->GetBookmarkType() == BOOKMARK_TYPE_FOLDER ) + { + r = pItem->Construct(Tizen::Graphics::Dimension(itemWidth,112), LIST_ANNEX_STYLE_DETAILED); + TryCatch(!IsFailed(r),,"BookmarkListForm::CreateItem Construct failed %s",GetErrorMessage(r)); + + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_FOLDER_OPEN); + if (pBitmap != null) + { + pItem->AddElement(Rectangle(x_Margin_Icon, 20, width_Icon, height_Icon), IDA_FORMAT_ICON, *pBitmap, null); + delete pBitmap; + } + + pItem->AddElement(Rectangle(x_Margin_Title, 26, width_Title, 60), IDA_FORMAT_FOLDER, pBookMark->GetBookmarkTitle(), true); + + if ( __pItemContextFolder != NULL) + { + pItem->SetContextItem(__pItemContextFolder); + } + } + else + { + r = pItem->Construct(Tizen::Graphics::Dimension(itemWidth, itemHeight), style); + TryCatch( !IsFailed(r),,"BookmarkListForm::CreateItem Construct failed %s",GetErrorMessage(r)); + + AppLogDebug("BookmarkListForm::faviconid %ls",pBookMark->GetFaviconId().GetPointer()); + bitmapId = pBookMark->GetFaviconId(); + + pBitmap = FaviconManager::GetInstance()->GetFaviconN(bitmapId); + if (pBitmap == null) + { + AppLogDebug("BookmarkListForm::CreateItem bitmap is null"); + pBitmap = FaviconManager::GetInstance()->GetDefaultFaviconN(); + } + pItem->AddElement(Rectangle(x_Margin_Icon, y_Margin_Icon, width_Icon, height_Icon), IDA_FORMAT_ICON, *pBitmap, null); + pItem->AddElement(Rectangle(x_Margin_Title, 0, width_Title, itemHeight - height_Url), IDA_FORMAT_SITE, pBookMark->GetBookmarkTitle(),44,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,true); + if(__pSearchBar->GetMode() == SEARCH_BAR_MODE_INPUT) + pItem->AddElement(Rectangle(x_Margin_Url, y_Margin_Url, width_Url, height_Url), IDA_FORMAT_URL, pBookMark->GetUrl(),textSize,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,true); + else + pItem->AddElement(Rectangle(x_Margin_Url, y_Margin_Url, width_Url, height_Url), IDA_FORMAT_URL, pBookMark->GetUrl(),textSize,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,true); + + if (pBitmap != null) + { + delete pBitmap; + } + if ( __pItemContextSite != NULL) + { + pItem->SetContextItem(__pItemContextSite); + } + } + + return pItem; + + CATCH: + delete pItem; + pItem = null; + return null; + +} + +bool +BookmarkListForm::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +int +BookmarkListForm::GetItemCount(void) +{ + int count = 0; + + if (__pData != NULL ) + { + __pData->RemoveAll(true); + delete __pData; + __pData = null; + } + __pData = new(std::nothrow) Collection::ArrayList(); + __pData->Construct(); + + if (__searchBookmark == false) + { + BookmarkPresentationModel::GetInstance()->GetFolderBookmarkCount(__parentID, count); + BookmarkPresentationModel::GetInstance()->GetFoldersBookmarks(__parentID, 0, count, *__pData); + } + else + { + String searchBarText = __pSearchBar->GetText(); + BookmarkPresentationModel::GetInstance()->GetSearchFolderBookmarkCount(count,searchBarText); + BookmarkPresentationModel::GetInstance()->GetSearchFoldersBookmarks(0, count, *__pData, searchBarText); + } + + AppLogDebug("Count = %d parentId = %ls", count, __parentID.GetPointer()); + + if (count <= 0) + { + __noBookmarks = true; + GetFooter()->SetItemEnabled(1,false); + } + else + { + __noBookmarks = false; + GetFooter()->SetItemEnabled(1,true); + } + + AppLogDebug("Result: %s", GetErrorMessage(GetLastResult())); + GetFooter()->Invalidate(true); + if (__pData != null && __pData->GetCount() >= 1) + { + // __pSearchBar->SetMode(SEARCH_BAR_MODE_NORMAL); + __pSearchBar->SetShowState(true); + __pSearchBar->Invalidate(true); + } + else if (__searchBookmark == false) + { + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + } + + if (__parentID.CompareTo(L"-1") != 0) + { + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + } + if (__noBookmarks == true) + { + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetPosition().y,__pSearchBar->GetWidth() ,GetClientAreaBounds().height); + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_NO_CONTENT_BOOKMARK); + + if ( pBitmap != NULL) + { + __pListview->SetBitmapOfEmptyList(pBitmap); + delete pBitmap; + } + } + else + { + if (__parentID.CompareTo(L"-1") == 0) + { + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetHeight(),GetClientAreaBounds().width ,GetClientAreaBounds().height - __pSearchBar->GetY() - __pSearchBar->GetHeight()); + } + else + { + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetY(),__pSearchBar->GetWidth() ,GetClientAreaBounds().height); + + } + + } + __pListview->Invalidate(true); + return count; + +} + +void +BookmarkListForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status) +{ + AppLogDebug("BookmarkListForm::OnListViewContextItemStateChanged int index %d, int elementId %d, Tizen::Ui::Controls::ListContextItemStatus status %d",index,elementId,status); + + String deleteText = CommonUtil::GetString(L"IDS_BR_SK_DELETE_ABB"); + deleteText.Append(L"? "); + int timeOut = 25000; + result r = E_SUCCESS; + + switch(elementId) + { + case IDA_CONTEXT_ITEM_FOLDER_EDIT: + { + ArrayList* pArgList = null; + String* pEdit = null; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + BookmarkData* pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + if (pBookMark != null && pBookMark->GetBookmarkType() == BOOKMARK_TYPE_FOLDER) + { + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + pEdit= new(std::nothrow) String(CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_FOLDER")); + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) BookmarkData(*pBookMark)); + pArgList->Add(*pEdit); + if ( pSceneManager != null) + { + result r; + r = pSceneManager->GoForward(ForwardSceneTransition(IDSCN_CREATE_BOOKMARK_FOLDER), pArgList); + } + + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("BookmarkListForm::OnListViewContextItemStateChanged GoForward failed %s",GetErrorMessage(r)); + return; + } + } + } + + } + break; + + case IDA_CONTEXT_ITEM_FOLDER_DELETE: + case IDA_CONTEXT_ITEM_DELETE: + { + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(deleteText); + __pConfirmationPopup->Show(); + __selectedindex = index; + } + break; + + case IDA_CONTEXT_ITEM_EDIT: + { + ArrayList* pArgList = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + BookmarkData* pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + if (pBookMark!= null && pBookMark->GetBookmarkType() == BOOKMARK_TYPE_URL) + { + AppLogDebug("ID_CONTEXT_ITEM_SITE_1 BOOKMARK_TYPE_URL"); + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) String(L"1")); + pArgList->Add(*new(std::nothrow) BookmarkData(*pBookMark)); + if ( pSceneManager != null) + { + result r; + r = pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ADD_BOOKMARK), pArgList); + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("BookmarkListForm::OnListViewContextItemStateChanged GoForward failed %s",GetErrorMessage(r)); + return; + } + } + } + } + } + break; + case IDA_CONTEXT_ITEM_SHARE: + { + AppLogDebug("OnListViewContextItemStateChanged Share"); + + BookmarkData* pBookmark = dynamic_cast(__pData->GetAt(index)); + if (pBookmark != null) + { + ShareInfo* pShareInfo = new(std::nothrow) ShareInfo(); + pShareInfo->SetPageTitle(pBookmark->GetBookmarkTitle()); + pShareInfo->SetPageUrl(pBookmark->GetUrl()); + pShareInfo->SetImageAttached(false); + __pPopUp->RemoveAllShareInfo(); + __pPopUp->AddShareInfo(pShareInfo); + } + + if (__pPopUp != null) + { + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + } + break; + default: + break; + } + +} + +void +BookmarkListForm::OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + +} + +void +BookmarkListForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + AppLogDebug("BookmarkListForm::OnListViewItemStateChanged"); + + result r = E_FAILURE; + ArrayList *pArgList = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + BookmarkData* pBookmark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + + if ( pBookmark == NULL ) + { + return; + } + + switch (pBookmark->GetBookmarkType()) + { + case BOOKMARK_TYPE_FOLDER: + + __parentID = pBookmark->GetBookmarkId(); + AppLogDebug("BOOKMARK_TYPE_FOLDER parent ID is %ls",__parentID.GetPointer()); + + listView.UpdateList(); + if (listView.GetItemCount() == 0) + { + GetFooter()->SetItemEnabled(1,false); + } + else + { + GetFooter()->SetItemEnabled(1,true); + } + GetFooter()->SetItemEnabled(2,false); + GetFooter()->Invalidate(true); + __pSearchBar->HideKeypad(); + __pSearchBar->SetMode(SEARCH_BAR_MODE_NORMAL); + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetY(),__pListview->GetWidth() ,GetClientAreaBounds().height); + break; + + case BOOKMARK_TYPE_URL: + + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + r = pArgList->Construct(); + TryCatch(!IsFailed(r), L"BookmarkListForm::OnListViewItemStateChanged pArgList Construct failed %s", GetErrorMessage(r)); + + AppLogDebug("bookmark url = %ls",pBookmark->GetUrl().GetPointer()); + r = pArgList->Add(*MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo()); + pArgList->Add(*new(std::nothrow) String(pBookmark->GetUrl())); + + if (pSceneManager != null) + { + AppLogDebug("pSceneManager exists"); + String prevSceneId; + MultipleWindowPresentationModel::GetInstance()->GetCurrentSceneId(prevSceneId); + r = pSceneManager->GoBackward(BackwardSceneTransition(prevSceneId), pArgList); + TryCatch(!IsFailed(r), L"BookmarkListForm::OnListViewItemStateChanged pArgList Construct failed %s", GetErrorMessage(r)); + } + delete pArgList; + } + break; + + default: + break; + } + + return; + CATCH: + if(pArgList) + { + pArgList->RemoveAll(true); + delete pArgList; + } + +} + +void +BookmarkListForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ + + +} + +void +BookmarkListForm::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + +} + +void +BookmarkListForm::OnSearchBarModeChanged(Tizen::Ui::Controls::SearchBar& source, Tizen::Ui::Controls::SearchBarMode mode) +{ + result r = E_FAILURE; + if (mode == SEARCH_BAR_MODE_NORMAL) + { + __pSearchListView->SetShowState(false); + __pListview->SetShowState(true); + Invalidate(true); + __searchBookmark = false; + r = __pListview->UpdateList(); + TryCatch( !IsFailed(r),,"BookmarkListForm::OnSearchBarModeChanged Update list failed %s",GetErrorMessage(r)); + CATCH:return; + } + else + { + __pSearchListView->SetShowState(true); + __pSearchListView->SetEnabled(false); + __pListview->SetShowState(false); + if(__pSearchBar) + { + __pSearchBar->SetContentAreaSize(Dimension(__pSearchListView->GetWidth(), __pSearchListView->GetHeight())); + __pSearchBar->SetText(L""); + } + r = __pListview->UpdateList(); + __pSearchListView->UpdateList(); + } +} + +void +BookmarkListForm::OnKeypadWillOpen(Tizen::Ui::Control& source) +{ + Footer* pFooter = GetFooter(); + pFooter->SetShowState(false); + __pSearchListView->SetEnabled(false); +} + +void +BookmarkListForm::OnKeypadOpened(Tizen::Ui::Control& source) +{ + +} + +void +BookmarkListForm::OnKeypadClosed(Tizen::Ui::Control& source) +{ + if ( Clipboard::GetInstance()->IsPopupVisible() == false && __searchBookmark == false) + { + + __pSearchListView->SetEnabled(true); + } + GetFooter()->SetShowState(true); + Invalidate(true); +} + +void +BookmarkListForm::OnKeypadActionPerformed(Tizen::Ui::Control& source, Tizen::Ui::KeypadAction keypadAction) +{ + AppLog("BookmarkListForm::OnKeypadActionPerformed %d",keypadAction); + if (__pSearchBar != null) + { + __pSearchBar->HideKeypad(); + } + + if ( __pSearchBar != null && keypadAction == KEYPAD_ACTION_SEARCH) + { + if (__pSearchBar->GetText().GetLength() == 0) + { + return; + } + __searchBookmark = true; + __pListview->SetShowState(false); + __pSearchListView->SetEnabled(true); + __pSearchListView->SetShowState(true); + __pSearchListView->UpdateList(); + + } + Invalidate(true); +} + +void +BookmarkListForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("BookmarkListForm::OnSceneActivatedN called"); + + __searchBookmark = false; + + GetHeader()->SetItemSelected(0); + GetHeader()->Invalidate(true); + + /* if (previousSceneId != IDSCN_HISTORY_LIST && previousSceneId != IDSCN_CREATE_BOOKMARK_FOLDER && previousSceneId != IDSCN_EDIT_BOOKMARK_LIST) + { + __previousSceneId = previousSceneId; + }*/ + + if (__pListview != null) + { + __pListview->UpdateList(); + } + + return; +} + +void +BookmarkListForm::OnOrientationChanged (const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLog("BookmarkListForm::OnOrientationChanged start"); + + if (__pListview) + { + if(__pSearchBar->GetShowState()) + { + __pListview->SetBounds(__pListview->GetX(),__pSearchBar->GetHeight(),GetClientAreaBounds().width ,GetClientAreaBounds().height - __pSearchBar->GetY() - __pSearchBar->GetHeight()); + } + else + { + __pListview->SetBounds(__pListview->GetX(),0,GetClientAreaBounds().width ,GetClientAreaBounds().height); + } + __pListview->UpdateList(); + } + + if (__pSearchListView && __pListview) + { + AppLog("__pListview->GetBounds() %d, %d, %d, %d",__pListview->GetBounds().x,__pListview->GetBounds().y,__pListview->GetBounds().width,__pListview->GetBounds().height); + __pSearchListView->SetBounds(0,0,GetClientAreaBounds().width,GetClientAreaBounds().height -__pSearchBar->GetHeight()); + + if( __searchBookmark == false) + { + __pSearchListView->UpdateList(); + } + + } + + if (__pSearchListView && __pData != null ) + { + if (__parentID != DEFAULT_VALUE_PARENTID) + { + AppLog("BookmarkListForm::OnOrientationChanged parent id true"); + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + } + else + { + AppLog("BookmarkListForm::OnOrientationChanged parent id false1"); + if(__pSearchBar->GetShowState() == false) + { + AppLog("BookmarkListForm::OnOrientationChanged parent id false2"); + __pSearchBar->SetShowState(true); + __pSearchBar->Invalidate(true); + } + } + __pSearchBar->SetContentAreaSize(Dimension(__pSearchListView->GetWidth(), __pSearchListView->GetHeight())); + } + + + Invalidate(true); +} + +void +BookmarkListForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + if (__pData != null) + { + __pData->RemoveAll(true); + delete __pData; + __pData = null; + } + __pSearchBar->SetMode(SEARCH_BAR_MODE_NORMAL); + return; +} + diff --git a/src/IntBookmarkPresentationModel.cpp b/src/IntBookmarkPresentationModel.cpp new file mode 100644 index 0000000..3c8c772 --- /dev/null +++ b/src/IntBookmarkPresentationModel.cpp @@ -0,0 +1,1031 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntBookmarkPresentationModel.cpp + *@brief: Used to define BookmarkPresentationModel + */ + +#include +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Io; +using namespace Tizen::Locales; +using namespace Tizen::System; + +extern const wchar_t* BOOKMARK_URL_TABLE; +extern const wchar_t* BOOKMARK_FOLDER_TABLE; +extern const wchar_t* DEFAULT_VALUE_PARENTID ; + +BookmarkPresentationModel* BookmarkPresentationModel::__pBookmarkPresentationModel = null; + +BookmarkPresentationModel::BookmarkPresentationModel(void) +{ + +} + +BookmarkPresentationModel::~BookmarkPresentationModel(void) +{ + +} + +BookmarkPresentationModel::BookmarkPresentationModel(const BookmarkPresentationModel& settingModelObj) +{ + +} + +BookmarkPresentationModel& BookmarkPresentationModel::operator=(const BookmarkPresentationModel& settingModelObj) +{ + return *this; +} + +result +BookmarkPresentationModel::Construct(void) +{ + result r = E_SUCCESS; + r = PresentationModelBase::Initialize(); + TryCatch( !IsFailed(r),,"Failed to intitialize bookmarkPresentation Model %s",GetErrorMessage(r)); + CATCH: return r; +} + +void +BookmarkPresentationModel::CreateInstance(void) +{ + if (__pBookmarkPresentationModel == null) + __pBookmarkPresentationModel = new(std::nothrow) BookmarkPresentationModel(); + result r = __pBookmarkPresentationModel->Construct(); + if (IsFailed(r)) + { + delete __pBookmarkPresentationModel; + __pBookmarkPresentationModel = null; + return; + } + std::atexit(DestroyInstance); +} + + +void BookmarkPresentationModel::DestroyInstance(void) +{ + if (__pBookmarkPresentationModel) + { + delete __pBookmarkPresentationModel; + __pBookmarkPresentationModel = null; + } +} + + +BookmarkPresentationModel* +BookmarkPresentationModel::GetInstance(void) +{ + if(__pBookmarkPresentationModel == null) + { + CreateInstance(); + } + return __pBookmarkPresentationModel; +} + +result +BookmarkPresentationModel::SaveFolder(BookmarkData& bookmark) +{ + result r = E_FAILURE; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + String query; + String columnNames; + int resultCount = -1; + int rowId = -1; + DateTime dt; + String bookmarkId; + String bookmarkTitle = bookmark.GetBookmarkTitle(); + bookmarkTitle.Replace(L"'", L"''"); + + PresentationModelBase::GetCurrentDateTime(dt); + if (bookmark.GetBookmarkId() == "") + { + columnNames.Append(L"TITLE, "); + columnNames.Append(L"CREATED_TIME, "); + columnNames.Append(L"MODIFIED_TIME"); + + query.Append(L"INSERT INTO "); + query.Append(bookmarkFolderTable); + query.Append("("); + query.Append(columnNames); + query.Append(") "); + query.Append("VALUES("); + query.Append("'"); + query.Append(bookmarkTitle); + query.Append("', "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("', "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("')"); + } + else + { + query.Append(L"UPDATE "); + query.Append(bookmarkFolderTable); + query.Append(" SET TITLE = "); + query.Append("'"); + query.Append(bookmarkTitle); + query.Append("'"); + query.Append(", MODIFIED_TIME = "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("'"); + query.Append(" WHERE ID = "); + query.Append(bookmark.GetBookmarkId()); + } + + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::SaveFolder query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + r = GetLastInsertedId(bookmarkFolderTable, rowId); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::SaveFolder GetLastInsertedId failed %s",GetErrorMessage(r)); + + if (rowId < 0) + return E_FAILURE; + + bookmarkId.Append(rowId); + + //Set the generated ID to Bookmark + bookmark.SetBookmarkId(bookmarkId); + + CATCH: return r; +} + +result +BookmarkPresentationModel::SaveBookmark(BookmarkData& bookmark) +{ + + result r = E_FAILURE; + String bookmarkTable(BOOKMARK_URL_TABLE); + String query; + String columnNames; + String attachment; + int resultCount = -1; + int rowId = -1; + DateTime dt; + String bookmarkId; + String bookmarkTitle = bookmark.GetBookmarkTitle(); + bookmarkTitle.Replace(L"'", L"''"); + String bookmarkUrl = bookmark.GetUrl(); + bookmarkUrl.Replace(L"'", L"''"); + + + PresentationModelBase::GetCurrentDateTime(dt); + if (bookmark.GetBookmarkId() == "") + { + columnNames.Append(L"TITLE, "); + columnNames.Append(L"URL, "); + columnNames.Append(L"PARENT_BOOKMARK_ID, "); + columnNames.Append(L"CREATED_TIME, "); + columnNames.Append(L"MODIFIED_TIME, "); + columnNames.Append(L"ICON_PATH, "); + columnNames.Append(L"FAVICON_ID"); + + query.Append(L"INSERT INTO "); + query.Append(bookmarkTable); + query.Append("("); + query.Append(columnNames); + query.Append(") "); + query.Append("VALUES("); + query.Append("'"); + query.Append(bookmarkTitle); + query.Append("', "); + query.Append("'"); + query.Append(bookmarkUrl); + query.Append("', "); + query.Append(bookmark.GetParentId()); + query.Append(", "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("', "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("', "); + query.Append("'"); + query.Append(bookmark.GetIconPath()); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(bookmark.GetFaviconId()); + query.Append("'"); + query.Append(")"); + } + else + { + query.Append(L"UPDATE "); + query.Append(bookmarkTable); + query.Append(" SET TITLE = "); + query.Append("'"); + query.Append(bookmarkTitle); + query.Append("'"); + query.Append(", URL = "); + query.Append("'"); + query.Append(bookmarkUrl); + query.Append("'"); + query.Append(", PARENT_BOOKMARK_ID = "); + query.Append(bookmark.GetParentId()); + query.Append(", MODIFIED_TIME = "); + query.Append("'"); + query.Append(dt.ToString()); + query.Append("'"); + query.Append(", ICON_PATH = "); + query.Append("'"); + query.Append(bookmark.GetIconPath()); + query.Append("'"); + query.Append(", FAVICON_ID = "); + query.Append("'"); + query.Append(bookmark.GetFaviconId()); + query.Append("'"); + query.Append(" WHERE ID = "); + query.Append(bookmark.GetBookmarkId()); + } + + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::SaveBookmark query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + r = GetLastInsertedId(bookmarkTable, rowId); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::SaveBookmark GetLastInsertedId failed %s",GetErrorMessage(r)); + + if (rowId < 0) + return E_FAILURE; + + bookmarkId.Append(rowId); + + //Set the generated ID to Bookmark + bookmark.SetBookmarkId(bookmarkId); + + CATCH: return r; +} + +result +BookmarkPresentationModel::DeleteFolder(int folderId) +{ + result r = E_SUCCESS; + String query; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + int resultCount = -1; + + if (folderId < 1) + { + return E_INVALID_ARG; + } + + //strQuery.Format(MAX_DB_QUERY_SIZE, L"DELETE FROM %ls WHERE ID = %d", strBookmarkTable.GetPointer(), bookmarkId); + query.Append(L"DELETE FROM "); + query.Append(bookmarkFolderTable); + query.Append(" WHERE ID = "); + query.Append(folderId); + + r = BookmarkPresentationModel::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteBookmark query failed %s",GetErrorMessage(r)); + r = BookmarkPresentationModel::CommitDb(); + DeleteBookmarkByFolderId(folderId); + + CATCH: return r; +} + +result +BookmarkPresentationModel::DeleteBookmark(int bookmarkId) +{ + result r = E_SUCCESS; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + int resultCount = -1; + + if (bookmarkId < 1) + { + return E_INVALID_ARG; + } + + //strQuery.Format(MAX_DB_QUERY_SIZE, L"DELETE FROM %ls WHERE ID = %d", strBookmarkTable.GetPointer(), bookmarkId); + query.Append(L"DELETE FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE ID = "); + query.Append(bookmarkId); + + r = BookmarkPresentationModel::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteBookmark query failed %s",GetErrorMessage(r)); + r = BookmarkPresentationModel::CommitDb(); + + CATCH: return r; +} + +result +BookmarkPresentationModel::DeleteBookmarkByFolderId(int folderId) +{ + result r = E_SUCCESS; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + int resultCount = -1; + + if (folderId < 1) + { + return E_INVALID_ARG; + } + + //strQuery.Format(MAX_DB_QUERY_SIZE, L"DELETE FROM %ls WHERE ID = %d", strBookmarkTable.GetPointer(), bookmarkId); + query.Append(L"DELETE FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE PARENT_BOOKMARK_ID = "); + query.Append(folderId); + + r = BookmarkPresentationModel::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteBookmark query failed %s",GetErrorMessage(r)); + r = BookmarkPresentationModel::CommitDb(); + + CATCH: return r; +} + + +result +BookmarkPresentationModel::GetFolderBookmarkCount(const String& parentID, int& Count) +{ + result r = E_SUCCESS; + int bookmarkCount = 0; + int folderCount = 0; + r = GetBookmarkCount(parentID,bookmarkCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetBookmarkCount query failed %s",GetErrorMessage(r)); + + r = GetFolderCount(parentID,folderCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetBookmarkCount query failed %s",GetErrorMessage(r)); + Count = folderCount+ bookmarkCount; + return E_SUCCESS; + CATCH: + return r; +} + +result +BookmarkPresentationModel::GetBookmarkCount(const String& parentID, int& bookmarkCount) +{ + int count = -1; + int intVal = -1; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + //query.Format(MAX_DB_QUERY_SIZE, L"SELECT COUNT(ID) FROM %ls WHERE PARENT_ID = %ls", strTable.GetPointer(),notebookId.GetPointer()); + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE PARENT_BOOKMARK_ID = "); + query.Append(parentID); + + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetBookmarkCount query failed %s",GetErrorMessage(r)); + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DbIsNextRowPresent query failed %s",GetErrorMessage(r)); + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + if (IsFailed(r)) + { + AppLogDebug("Error:BookmarkPresentationModel::GetColumn:%s", GetErrorMessage(r)); + return r; + } + } + bookmarkCount = intVal; + AppLog("Count:%d", bookmarkCount); + + CATCH: return r; +} + +result +BookmarkPresentationModel::GetFolderCount(const String& parentID, int& folderCount) +{ + int count = -1; + int intVal = -1; + String query; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + if (parentID.CompareTo(DEFAULT_VALUE_PARENTID) != 0) + { + folderCount = 0; + return E_SUCCESS; + } + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(bookmarkFolderTable); + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetFolderCount query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + } + folderCount = intVal; + + CATCH: return r; +} + +result +BookmarkPresentationModel::GetFoldersBookmarks(const String& parentID, int startIndex, int limit, ArrayList& pBookmarkList) +{ + ArrayList arrayList; + arrayList.Construct(); + GetFolder(parentID,startIndex,limit,arrayList); + for(int index = arrayList.GetCount()-1; index >= 0; index--) + { + pBookmarkList.Add(*arrayList.GetAt(index)); + } + arrayList.RemoveAll(false); + GetBookmark(parentID,startIndex,limit,arrayList); + for(int index = arrayList.GetCount()-1; index >= 0; index--) + { + pBookmarkList.Add(*arrayList.GetAt(index)); + } + return E_SUCCESS; +} + +result +BookmarkPresentationModel::GetBookmark(const String& parentID, int startIndex, int limit, ArrayList& pBookmarkList) +{ + int count = -1; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + result r = E_FAILURE; + + query.Append(L"SELECT * FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE PARENT_BOOKMARK_ID = "); + query.Append(parentID); + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetBookmark query failed %s",GetErrorMessage(r)); + + r = CreateBookmarkList(count, pBookmarkList); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::CreateBookmarkList failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +result +BookmarkPresentationModel::GetFolder(const String& parentID, int startIndex, int limit, ArrayList& folderList) +{ + int count = -1; + String query; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + result r = E_FAILURE; + + if (parentID.CompareTo(DEFAULT_VALUE_PARENTID ) != 0) + { + return E_SUCCESS; + } + query.Append(L"SELECT * FROM "); + query.Append(bookmarkFolderTable); + + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetFolder query failed %s",GetErrorMessage(r)); + + r = CreateFolderList(count, folderList); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::CreateBookmarkList failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +result +BookmarkPresentationModel::GetSearchFolderBookmarkCount(int& searchBookmarkCount, String& text) +{ + int searchUrlCount = 0; + int searchFolderCount = 0; + GetSearchBookmarkCount(searchUrlCount,text); + GetSearchFolderCount(searchFolderCount,text); + searchBookmarkCount = searchUrlCount + searchFolderCount; + return E_SUCCESS; +} + +result +BookmarkPresentationModel::GetSearchBookmarkCount(int& searchBookmarkCount, String& text) +{ + + int count = -1; + int intVal = -1; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + text.Replace(L"'", L"''"); + + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(bookmarkTable); + query.Append(L" WHERE (TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + query.Append(" OR "); + query.Append(L"(URL LIKE '%"); + query.Append(text); + query.Append("%')"); + + r = BookmarkPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchBookmarkCount query failed %s",GetErrorMessage(r)); + + r = BookmarkPresentationModel::DbIsNextRowPresent(nextRowPresent); + + if (nextRowPresent == true) + { + r = BookmarkPresentationModel::GetColumn(0, intVal); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetColumn failed %s",GetErrorMessage(r)); + } + searchBookmarkCount = intVal; + + CATCH: return r; +} + + +result +BookmarkPresentationModel::GetSearchFolderCount(int& searchFolderCount, String& text) +{ + + int count = -1; + int intVal = -1; + String query; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + text.Replace(L"'", L"''"); + + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(bookmarkFolderTable); + query.Append(L" WHERE (TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + + r = BookmarkPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchBookmarkCount query failed %s",GetErrorMessage(r)); + + r = BookmarkPresentationModel::DbIsNextRowPresent(nextRowPresent); + + if (nextRowPresent == true) + { + r = BookmarkPresentationModel::GetColumn(0, intVal); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetColumn failed %s",GetErrorMessage(r)); + } + searchFolderCount = intVal; + + CATCH: return r; +} + + +result +BookmarkPresentationModel::GetSearchFoldersBookmarks(int startIndex, int limit, ArrayList& pFolderList, String& text) +{ + ArrayList arrayList; + arrayList.Construct(); + GetSearchFolder(startIndex, limit, arrayList,text); + for(int index = arrayList.GetCount()-1; index >= 0; index--) + { + pFolderList.Add(*arrayList.GetAt(index)); + } + arrayList.RemoveAll(false); + GetSearchBookmark(startIndex, limit, arrayList,text); + for(int index = arrayList.GetCount()-1; index >= 0; index--) + { + pFolderList.Add(*arrayList.GetAt(index)); + } + return E_SUCCESS; +} + +result +BookmarkPresentationModel::GetSearchBookmark(int startIndex, int limit, ArrayList& pBookmarkList, String& text) +{ + int count = -1; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + result r = E_FAILURE; + + text.Replace(L"'", L"''"); + query.Append(L"SELECT * FROM "); + query.Append(bookmarkTable); + query.Append(L" WHERE (TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + query.Append(" OR "); + query.Append(L"(URL LIKE '%"); + query.Append(text); + query.Append("%')"); + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = BookmarkPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchBookmark query failed %s",GetErrorMessage(r)); + + r = CreateBookmarkList(count, pBookmarkList); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::CreateBookmarkList failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +result +BookmarkPresentationModel::GetSearchFolder(int startIndex, int limit, ArrayList& pFolderList, String& text) +{ + int count = -1; + String query; + String bookmarkFolderTable(BOOKMARK_FOLDER_TABLE); + result r = E_FAILURE; + text.Replace(L"'", L"''"); + + query.Append(L"SELECT * FROM "); + query.Append(bookmarkFolderTable); + query.Append(L" WHERE (TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = BookmarkPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchBookmark query failed %s",GetErrorMessage(r)); + + r = CreateFolderList(count, pFolderList); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::CreateBookmarkList failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +result +BookmarkPresentationModel::CreateFolderList(int bookmarkCount, ArrayList& folderList) +{ + BookmarkData* pBookmark = null; + int intVal = -1; + String value; + DateTime dateValue; + result r = E_FAILURE; + String bookmarkId; + String parentId; + String faviconId; + DateTime createdTime; + DateTime modifiedTime; + String iconPath; + bool nextRowPresent = false; + + if (bookmarkCount < 1) + { + return E_SUCCESS; + } + + for (int l_bookmarkCount = 0; l_bookmarkCount < bookmarkCount; l_bookmarkCount++) + { + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r)) + return r; + if (nextRowPresent == true) + { + pBookmark = new(std::nothrow) BookmarkData; + if (pBookmark) + { + for (int columnCount = 0; columnCount < MAX_NOTE_TABLE_COLUMN; columnCount++) + { + + switch (columnCount) + { + case 0: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + bookmarkId.Clear(); + bookmarkId.Append(intVal); + if (bookmarkId.GetLength() > 0) + pBookmark->SetBookmarkId(bookmarkId); + } + + } + break; + + case 1: + r = PresentationModelBase::GetColumn(columnCount, value); + if (!IsFailed(r)) + { + pBookmark->SetBookmarkTitle(value); + } + break; + + case 2: + r = PresentationModelBase::GetColumn(columnCount, dateValue); + if (!IsFailed(r)) + { + createdTime = dateValue; + pBookmark->SetCreatedTime(createdTime); + } + break; + + case 3: + r = PresentationModelBase::GetColumn(columnCount, dateValue); + if (!IsFailed(r)) + { + modifiedTime = dateValue; + pBookmark->SetModifiedTime(modifiedTime); + } + break; + default: + break; + } + + } + + r = folderList.Add(*pBookmark); + if (IsFailed(r)) + { + delete pBookmark; + return r; + } + } + } + } + return r; +} + +result +BookmarkPresentationModel::CreateBookmarkList(int bookmarkCount, ArrayList& bookmarkList) +{ + BookmarkData* pBookmark = null; + int intVal = -1; + String value; + DateTime dateValue; + result r = E_FAILURE; + String bookmarkId; + String parentId; + String faviconId; + DateTime createdTime; + DateTime modifiedTime; + String iconPath; + bool nextRowPresent = false; + + if (bookmarkCount < 1) + { + return E_SUCCESS; + } + + for (int l_bookmarkCount = 0; l_bookmarkCount < bookmarkCount; l_bookmarkCount++) + { + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r)) + return r; + if (nextRowPresent == true) + { + pBookmark = new(std::nothrow) BookmarkData; + if (pBookmark) + { + for (int columnCount = 0; columnCount < MAX_NOTE_TABLE_COLUMN; columnCount++) + { + + switch (columnCount) + { + case 0: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + bookmarkId.Clear(); + bookmarkId.Append(intVal); + if (bookmarkId.GetLength() > 0) + pBookmark->SetBookmarkId(bookmarkId); + } + + } + break; + + case 1: + r = PresentationModelBase::GetColumn(columnCount, value); + if (!IsFailed(r)) + { + pBookmark->SetBookmarkTitle(value); + } + break; + + case 2: + r = PresentationModelBase::GetColumn(columnCount, value); + if (!IsFailed(r)) + { + pBookmark->SetUrl(value); + } + break; + + case 3: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + parentId.Clear(); + parentId.Append(intVal); + if (parentId.GetLength() > 0) + pBookmark->SetParentId(parentId); + } + } + break; + + case 4: + r = PresentationModelBase::GetColumn(columnCount, dateValue); + if (!IsFailed(r)) + { + createdTime = dateValue; + pBookmark->SetCreatedTime(createdTime); + } + break; + + case 5: + r = PresentationModelBase::GetColumn(columnCount, dateValue); + if (!IsFailed(r)) + { + modifiedTime = dateValue; + pBookmark->SetModifiedTime(modifiedTime); + } + break; + + case 6: + r = PresentationModelBase::GetColumn(columnCount, value); + if (!IsFailed(r)) + { + iconPath = value; + pBookmark->SetIconPath(iconPath); + } + break; + case 7: + + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal >= 0) + { + faviconId.Clear(); + faviconId.Append(intVal); + if (faviconId.GetLength() > 0) + { + pBookmark->SetFaviconId(faviconId); + } + } + } + break; + + default: + break; + } + + } + + r = bookmarkList.Add(*pBookmark); + if (IsFailed(r)) + { + delete pBookmark; + return r; + } + } + } + } + return r; +} + +result +BookmarkPresentationModel::DoesBookmarkExist(const Tizen::Base::String& Url, bool &exist, const String& parentId, bool checkParentId) +{ + int bookmarkCount = -1; + int intVal = -1; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + int count = 0; + + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE URL = '"); + query.Append(Url); + if(checkParentId == true) + { + query.Append(L"' AND PARENT_BOOKMARK_ID = '"); + query.Append(parentId); + } + query.Append("'"); + + AppLog("BookmarkPresentationModel::DoesBookmarkExist query is %S",query.GetPointer()); + + r = PresentationModelBase::ExecuteQuery(query, bookmarkCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DoesBookmarkExist query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + } + count = intVal; + + if (count == 0) + { + exist = false; + } + else + { + exist = true ; + } + + CATCH: return r; +} + +result +BookmarkPresentationModel::DeleteBookmark(const Tizen::Base::String& url) +{ + result r = E_SUCCESS; + String query; + String bookmarkTable(BOOKMARK_URL_TABLE); + int resultCount = -1; + + query.Append(L"DELETE FROM "); + query.Append(bookmarkTable); + query.Append(" WHERE URL = '"); + query.Append(url); + query.Append(L"'"); + + r = BookmarkPresentationModel::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteBookmark query failed %s",GetErrorMessage(r)); + + r = BookmarkPresentationModel::CommitDb(); + + CATCH: return r; +} diff --git a/src/IntBrightnessForm.cpp b/src/IntBrightnessForm.cpp new file mode 100644 index 0000000..ed02f4d --- /dev/null +++ b/src/IntBrightnessForm.cpp @@ -0,0 +1,290 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet IntBrightness class +/*@file: IntBrightness.cpp + *@brief: This class defines IntBrightness used to change the brightness + * + */ + +#include +#include +#include +#include "IntBrightnessForm.h" +#include "IntCommonLib.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const int IDA_AUTOBTN_CLICKED = 101; +const int IDA_MANUALBTN_CLICKED = 102; + +BrightnessForm::BrightnessForm(void) +{ + __manualBrightness = true; + __pBrightnessSlider = null; + __pLabel = null; +} + +BrightnessForm::~BrightnessForm(void) +{ + +} + +bool +BrightnessForm::Initialize() +{ + Form::Construct(L"IDL_BRIGHTNESS"); + + return true; +} + +result +BrightnessForm::OnInitializing(void) +{ + result r = E_FAILURE; + WindowInfo* pWindowInfo = null; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + r = pSceneManager->AddSceneEventListener(IDSCN_BRIGHTNESS, *this); + if (IsFailed(r)) + { + AppLogException("OnInitialized failed with %s", GetErrorMessage(r)); + return r; + } + } + AddOrientationEventListener(*this); + SetFormBackEventListener(this); + + __pLabel = static_cast< Label* >(GetControl(L"IDC_LABEL", true)); + + pWindowInfo = MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo(); + if (pWindowInfo != null && pWindowInfo->pWebCanvasBitmap != null && __pLabel != null) + { + int labelWidth = __pLabel->GetWidth(); + int labelHeigth = __pLabel->GetHeight(); + + if(GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + labelWidth = pWindowInfo->pWebCanvasBitmap->GetWidth() * labelHeigth / pWindowInfo->pWebCanvasBitmap->GetHeight(); + __pLabel->SetBounds(__pLabel->GetX() + (__pLabel->GetWidth() - labelWidth)/2, __pLabel->GetY(), labelWidth, labelHeigth); + } + else + { + labelHeigth = pWindowInfo->pWebCanvasBitmap->GetHeight() * labelWidth / pWindowInfo->pWebCanvasBitmap->GetWidth(); + __pLabel->SetBounds(__pLabel->GetX(), __pLabel->GetY() + (__pLabel->GetHeight() - labelHeigth)/2, labelWidth, labelHeigth); + } + __pLabel->SetBackgroundBitmap(*pWindowInfo->pWebCanvasBitmap); + } + + AppRegistry* pAppRegistry = App::GetInstance()->GetAppRegistry(); + String sliderKey("SliderValue"); + String tabKey("TabButton"); + int sliderValue = 10; + int tabValue = 1; + + r = pAppRegistry->Get(sliderKey, sliderValue); + if (r == E_KEY_NOT_FOUND) + { + pAppRegistry->Add(sliderKey, sliderValue); + pAppRegistry->Set(sliderKey,sliderValue); + } + + r = pAppRegistry->Get(tabKey, tabValue); + if (r == E_KEY_NOT_FOUND) + { + pAppRegistry->Add(tabKey, tabValue); + pAppRegistry->Set(tabKey,tabValue); + } + r = pAppRegistry->Save(); + if (IsFailed(r)) + { + // Failed to save data to registry + AppLogDebug("OnInitialized failed to save data to registry with %s", GetErrorMessage(r)); + return E_FAILURE; + } + + + __pBrightnessSlider = static_cast< Slider* >(GetControl(L"IDC_FONT_SLIDER", true)); + if (__pBrightnessSlider == null) + { + return E_FAILURE; + } + __pBrightnessSlider->SetRange(1,10); + __pBrightnessSlider->AddSliderEventListener(*this); + + GetFooter()->AddActionEventListener(*this); + return r; +} + +void +BrightnessForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + result r = E_FAILURE; + AppRegistry* pAppRegistry = App::GetInstance()->GetAppRegistry(); + String sliderKey("SliderValue"); + String tabKey("TabButton"); + int sliderValue = 0; + int tabValue = 0; + + r = pAppRegistry->Get(sliderKey, sliderValue); + r = pAppRegistry->Get(tabKey, tabValue); + + AppLog("BrightnessForm tab value is %d",tabValue); + AppLog("BrightnessForm slider value is %d",sliderValue); + + if(tabValue == 0) + { + __pBrightnessSlider->SetEnabled(false); + __pBrightnessSlider->Invalidate(true); + } + else + { + __pBrightnessSlider->SetEnabled(true); + AppLog("BatteryLvl %d",PowerManager::GetScreenBrightness()); + __pBrightnessSlider->SetValue(PowerManager::GetScreenBrightness()); + __pBrightnessSlider->Invalidate(true); + } + + GetFooter()->SetItemSelected(tabValue); + + __pBrightnessSlider->SetRange(1,10); +// __pBrightnessSlider->SetValue(sliderValue); + + + AppLog("slider value is %d",PowerManager::GetScreenBrightness()); + + Invalidate(true); + +} + +void +BrightnessForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLog("slider value is %d",PowerManager::GetScreenBrightness()); + __pBrightnessSlider->SetValue(PowerManager::GetScreenBrightness()); + Invalidate(true); +} + +void +BrightnessForm::OnSliderBarMoved(Slider& source, int value) +{ + AppLog("coming to OnSliderBarMoved"); + if (__manualBrightness == true) + { + PowerManager::SetScreenBrightness(value); + } +} + +void +BrightnessForm::OnFormBackRequested(Form& source) +{ + + result r = E_FAILURE; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + // save the slider value + // save the tab button + AppRegistry* pAppRegistry = App::GetInstance()->GetAppRegistry(); + String sliderKey("SliderValue"); + String tabKey("TabButton"); + int sliderValue = __pBrightnessSlider->GetValue(); + r = pAppRegistry->Set(sliderKey,sliderValue); + FooterItemStatus footerStatus; + GetFooter()->GetItemStatus(0,footerStatus); + if (footerStatus == FOOTER_ITEM_STATUS_SELECTED) + { + r = pAppRegistry->Set(tabKey,0); + } + else + { + r = pAppRegistry->Set(tabKey,1); + } + pAppRegistry->Save(); + r = pSceneManager->GoBackward(BackwardSceneTransition()); + if(IsFailed(r)) + { + AppLogException("OnFormBackRequested failed with %s", GetErrorMessage(r)); + } + } + +} + +void +BrightnessForm::OnActionPerformed(const Control& source, int actionId) +{ + switch (actionId) + { + case IDA_AUTOBTN_CLICKED: + __manualBrightness = false; +// __pBrightnessSlider->SetValue(6); +// __pBrightnessSlider->SetShowState(false); + PowerManager::SetScreenBrightness(6); + __pBrightnessSlider->SetEnabled(false); + __pBrightnessSlider->Invalidate(true); + break; + case IDA_MANUALBTN_CLICKED: + PowerManager::SetScreenBrightness(__pBrightnessSlider->GetValue()); + //__pBrightnessSlider->SetValue(__pBrightnessSlider->GetValue()); + __pBrightnessSlider->SetEnabled(true); + __pBrightnessSlider->SetShowState(true); + __pBrightnessSlider->Invalidate(true); + + __manualBrightness = true; + break; + default: + break; + } +} + +void +BrightnessForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + WindowInfo* pWindowInfo = MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo(); + + if (pWindowInfo != null) + { + if(pWindowInfo->pWebCanvasBitmap != null) + { + int labelWidth = __pLabel->GetWidth(); + int labelHeigth = __pLabel->GetHeight(); + + if(orientationStatus == ORIENTATION_STATUS_LANDSCAPE || orientationStatus == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + labelWidth = pWindowInfo->pWebCanvasBitmap->GetWidth() * labelHeigth / pWindowInfo->pWebCanvasBitmap->GetHeight(); + __pLabel->SetBounds(__pLabel->GetX() + (__pLabel->GetWidth() - labelWidth)/2, __pLabel->GetY(), labelWidth, labelHeigth); + } + else + { + labelHeigth = pWindowInfo->pWebCanvasBitmap->GetHeight() * labelWidth / pWindowInfo->pWebCanvasBitmap->GetWidth(); + __pLabel->SetBounds(__pLabel->GetX(), __pLabel->GetY() + (__pLabel->GetHeight() - labelHeigth)/2, labelWidth, labelHeigth); + } + Invalidate(true); + } + } +} diff --git a/src/IntCommonLib.cpp b/src/IntCommonLib.cpp new file mode 100644 index 0000000..e8ca548 --- /dev/null +++ b/src/IntCommonLib.cpp @@ -0,0 +1,197 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntCommonUtil.cpp + *@brief: To define the common method of Internet application + */ + +#include +#include +#include "IntCommonLib.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Media; + +CommonBitmapTable CommonUtil::__commonBitmapTable[] = { + + // -------- End of table ----------------------------------------------------- + { + NULL, 0, L"", -1, -1 + } // DO NOT REPLACE THIS LINE +}; + +String +CommonUtil::GetString(const String& resourceId) +{ + + result r = E_SUCCESS; + String tmpString; + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + + if (!pAppResource) + { + tmpString = "(Error)"; + return tmpString; + } + + r = pAppResource->GetString(resourceId, tmpString); + + TryCatch( !IsFailed(r),,"CommonUtil::GetString ,pAppResource->GetString Failed %s",GetErrorMessage(r)); + return tmpString; + + CATCH: + tmpString = "(Error)"; + return tmpString; +} + +Bitmap* +CommonUtil::GetBitmapN(const String& path, const int width, const int height) +{ + Bitmap* pBitmap = null; + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + + if (pAppResource == null) + { + return null; + } + + if (path == null) + { + return null; + } + + if (width <= 0 || height <= 0) + { + return null; + } + + AppLogDebug("Calling Decode method for image %ls", path.GetPointer()); + pBitmap = pAppResource->GetBitmapN(path, BITMAP_PIXEL_FORMAT_ARGB8888); + AppLogDebug("Image Decoded successfully"); + + if (pBitmap == null) + { + return null; + } + + if (width > 0 && height > 0) + { + pBitmap->Scale(Dimension(width, height)); + } + + return pBitmap; +} + + +Bitmap* +CommonUtil::GetBitmap(uint id) +{ + AppLogDebug("CommonUtil::GetBitmap entered"); + + Bitmap* pBitmap = null; + + if (__commonBitmapTable[id].ptr) + { + pBitmap = __commonBitmapTable[id].ptr; + AppLogDebug("found already used bitmap pointer"); + } + else + { + AppLogDebug("Not found #%d bitmap data in cache. Start loading...\n", (int) id); + pBitmap = GetBitmapN(__commonBitmapTable[id].filename, + __commonBitmapTable[id].width, + __commonBitmapTable[id].height); + if (pBitmap == NULL) + { + AppLogDebug("Error: Failed to load #%d bitmap.\n", (int) id); + return null; + } + + __commonBitmapTable[id].ptr = pBitmap; + } + + __commonBitmapTable[id].refcount++; + AppLogDebug("CommonUtil::GetBitmap exit"); + return pBitmap; +} + +Bitmap* +CommonUtil::GetNinepatchedBitmapN(const String& strPath, const int width, const int height) +{ + Bitmap* pBmp = UiApp::GetInstance()->GetAppResource()->GetBitmapN(strPath); + + if (pBmp == NULL) + { + AppLogDebug("Couldn't create bitmap %ls error(%s)",strPath.GetPointer(),GetErrorMessage(GetLastResult())); + return null; + } + + Bitmap* pBitmap = null; + result r = E_SUCCESS; + + Canvas* pCanvas = new(std::nothrow) Canvas(); + TryCatch(pCanvas != null, , "Canvas new Fail."); + r = pCanvas->Construct(Rectangle(0,0,width, height)); + TryCatch(r == E_SUCCESS, , "Canvas Construct Fail."); + + r = pCanvas->DrawNinePatchedBitmap(Rectangle(0,0,width, height), *pBmp); + + if (r != E_SUCCESS) + { + AppLogDebug("DrawNinePatchedBitmap Error %ls", GetErrorMessage(r)); + pCanvas->DrawBitmap(Rectangle(0,0,width, height), *pBmp); + } + + pBitmap = new(std::nothrow) Bitmap(); + TryCatch(pBitmap != null, , "Bitmap new Fail."); + + r = pBitmap->Construct(*pCanvas, Rectangle(0,0,width, height)); + TryCatch(r == E_SUCCESS, , "Bitmap Construct Fail."); + + if ( pBmp != NULL) + { + delete pBmp; + } + + if (pCanvas != NULL) + { + delete pCanvas; + } + + return pBitmap; + + CATCH: + if (pBmp != NULL) + { + delete pBmp; + } + + if (pCanvas != NULL) + { + delete pCanvas; + } + + if (pBitmap != NULL) + { + delete pBitmap; + } + + return null; +} diff --git a/src/IntConfirmationPopup.cpp b/src/IntConfirmationPopup.cpp new file mode 100644 index 0000000..659d3f6 --- /dev/null +++ b/src/IntConfirmationPopup.cpp @@ -0,0 +1,109 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +/* + * IntConfirmationPopup.cpp + *@file: IntConfirmationPopup.cpp + *@brief: Common popup to show delete confirmation + */ + +#include +#include + +#include "IntCommonLib.h" +#include "IntConfirmationPopup.h" +#include "IntHistoryPresentationModel.h" +#include "IntSettingPresentationModel.h" + + +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui; +// +//static const int IDA_BUTTON_NO = 1000; +//static const int IDA_BUTTON_YES = 1001; + + +ConfirmationPopup::ConfirmationPopup(void) +{ + __pPopupText = null; + __pYesButton = null; + __pNoButton = null; +} + +ConfirmationPopup::~ConfirmationPopup(void) +{ + +} + +bool +ConfirmationPopup::Initialize(void) +{ + Button* pYesButton = null; + Button* pNoButton = null; + Popup::Construct(L"IDL_CONFIRMATION_POPUP"); + + __pYesButton = static_cast< Button* >(GetControl(L"IDC_BOTTOM_BUTTON1", true)); + if (__pYesButton) + { + __pYesButton->SetActionId(IDA_BUTTON_YES); + } + + __pNoButton = static_cast< Button* >(GetControl(L"IDC_BOTTOM_BUTTON2", true)); + if (__pNoButton) + { + __pNoButton->SetActionId(IDA_BUTTON_NO); + } + + __pPopupText = static_cast< Label* >(GetControl(L"IDC_CONFIRMATION_LABEL", true)); + + return true; +} + +result +ConfirmationPopup::OnTerminating(void) +{ + return E_SUCCESS; +} + +void +ConfirmationPopup::setMessage(String& str) +{ + __message = str; + __pPopupText->SetText(str); +} + +String +ConfirmationPopup::GetMessage(void) +{ + return __message; +} + +void +ConfirmationPopup::AddActionListener(IActionEventListener& listener) +{ + __pYesButton->AddActionEventListener(listener); + __pNoButton->AddActionEventListener(listener); +} + +void +ConfirmationPopup::RemoveActionListener(IActionEventListener& listener) +{ + __pYesButton->RemoveActionEventListener(listener); + __pNoButton->RemoveActionEventListener(listener); +} diff --git a/src/IntCreateBookmarkFolderForm.cpp b/src/IntCreateBookmarkFolderForm.cpp new file mode 100644 index 0000000..957ec7b --- /dev/null +++ b/src/IntCreateBookmarkFolderForm.cpp @@ -0,0 +1,478 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntCreateBookmarkFolderForm + *@brief: This class creates Bookmark folder + * + */ + +#include +#include +#include "IntBookmarkPresentationModel.h" +#include "IntBookmarkData.h" +#include "IntCommonLib.h" +#include "IntCreateBookmarkFolderForm.h" +#include "IntSceneRegister.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +const int CreateBookmarkFolderForm::IDA_BUTTON_DONE = 101; +const int CreateBookmarkFolderForm::IDA_BUTTON_CANCEL = 102; + +CreateBookmarkFolderForm::CreateBookmarkFolderForm(void) +: __pFolderTitle(null) +, __pMsgBox(null) +, __modalMsgBoxResult(0) +, __pBookmark(null) +, __ret(false) +{ + +} + +CreateBookmarkFolderForm::~CreateBookmarkFolderForm(void) +{ + +} + +bool +CreateBookmarkFolderForm::Initialize(void) +{ + result r = Construct(L"IDL_CREATE_BOOKMARK_FOLDER"); + AppLogDebug("CreateBookmarkFolderForm Construct returned %s",GetErrorMessage(r)); + return true; +} + +result +CreateBookmarkFolderForm::OnInitializing(void) +{ + // Add your initialization code here + + result r = E_SUCCESS; + Header* pHeader = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->AddSceneEventListener(IDSCN_CREATE_BOOKMARK_FOLDER, *this); + + __pFolderTitle = static_cast< EditField* >(GetControl(L"IDC_EDITFIELD_FOLDER_TITLE")); + + if (__pFolderTitle == null) + { + return E_FAILURE; + } + + __pFolderTitle->AddKeypadEventListener(*this); + __pFolderTitle->AddTextEventListener(*this); + __pFolderTitle->SetOverlayKeypadCommandButtonVisible(false); + + pHeader = GetHeader(); + + if (pHeader != NULL) + { + pHeader->AddActionEventListener(*this); + } + + return r; +} + +result +CreateBookmarkFolderForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +CreateBookmarkFolderForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("CreateBookmarkFolderForm::OnSceneActivatedN"); + + result r = E_SUCCESS; + __previousScene = previousSceneId; + bool flag = false; + ArrayList folderList; + String parentID = "-1"; + String title ; + String folderTitle ; + int count = 0; + int foldercount = 0; + int counter = 0; + __ret = false; + + String pStr = CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_FOLDER"); + + String folder01 = CommonUtil::GetString(L"IDS_BR_BODY_FOLDER"); + folder01.Append(L"_"); + + String* pEvent = null; + if (pArgs != NULL) + { + pEvent = dynamic_cast(pArgs->GetAt(1)); + } + + if (pEvent != null) + { + if (pEvent->CompareTo(pStr) == 0) + { + __ret = true; + } + delete pEvent; + } + + Header* pHeader = GetHeader(); + + if (pHeader != null) + { + if (previousSceneId ==IDSCN_EDIT_BOOKMARK_LIST || __ret == true) + { + pHeader->SetTitleText(CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_FOLDER")); + } + else + { + pHeader->SetTitleText(CommonUtil::GetString(L"IDS_BR_SK3_CREATE_FOLDER")); + } + } + + if (__pFolderTitle == NULL) + { + return; + } + + if (previousSceneId == IDSCN_EDIT_BOOKMARK_LIST || __ret == true) + { + if (__pBookmark != NULL ) + { + delete __pBookmark; + __pBookmark = null; + } + + if ( pArgs != NULL ) + { + __pBookmark = dynamic_cast(pArgs->GetAt(0)); + } + + if (__pBookmark != null) + { + __pFolderTitle->SetText(__pBookmark->GetBookmarkTitle()); + __pFolderTitle->SetFocus(); + __pFolderTitle->ShowKeypad(); + } + } + else + { + __pFolderTitle->SetText(folder01); + __pFolderTitle->SetFocus(); + __pFolderTitle->ShowKeypad(); + + r = BookmarkPresentationModel::GetInstance()->GetFolderCount(parentID, foldercount); // to get count of existing folders + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetInstance()->GetFolderCount failed %s",GetErrorMessage(r)); + + r = BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, foldercount, folderList); // to get list of existing folders + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetInstance()->GetFolder failed %s",GetErrorMessage(r)); + + while (true) // to provide user with unique folder title when he creates a new(std::nothrow) folder + { // to generate folder with default name of type Folder_## + flag = false ; + title = L""; + count = 0; + counter++; + title.Append(folder01); + + if (counter/10 == 0) + { + title.Append(0); + } + + title.Append(counter); + + for (count = 0;count < foldercount ; count++) + { + BookmarkData* pBookmark = dynamic_cast(folderList.GetAt(count)); + folderTitle = L""; + if ( pBookmark != NULL) + { + folderTitle = pBookmark->GetBookmarkTitle(); + } + + if (title.Equals(folderTitle,false) == true) + { + flag = true; // if flag is true folder title already exists + break; // break from for loop + } + + } // end of for loop + + if ( flag == false) + { + __pFolderTitle->SetText(title); // if flag is false folder title is unique + break; // break from while loop + } + + } // end of while loop + } + + CATCH: + + folderList.RemoveAll(true); + return; +} + +void +CreateBookmarkFolderForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + if (__pBookmark) + { + delete __pBookmark; + __pBookmark= null; + } +} + +void +CreateBookmarkFolderForm::OnActionPerformed(const Control& source, int actionId) +{ + int count = 0; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return; + } + + switch (actionId) + { + case IDA_BUTTON_CANCEL: + { + result r; + if (__pFolderTitle != NULL) + { + __pFolderTitle->Clear(); + __pFolderTitle->HideKeypad(); + } + + r = pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + AppLogDebug("SCENE_ADD_BOOKMARK error = %s",GetErrorMessage(r)); + TryCatch(!IsFailed(r),L"BookmarkPresentationModel::GetFolderCount failed %s",GetErrorMessage(r)); + + } + break; + + case IDA_BUTTON_DONE: + { + result r = E_SUCCESS; + bool flag = false; + ArrayList folderList; + String parentID = "-1"; + int foldercount = 0; + String title; + String folderTitle; + folderTitle = __pFolderTitle->GetText(); + folderTitle.Trim(); + + r = BookmarkPresentationModel::GetInstance()->GetFolderCount(parentID, foldercount); + TryCatch( !IsFailed(r),,"BookmarkPresentationModel::GetInstance()->GetFolderCount failed %s",GetErrorMessage(r)); + + r = BookmarkPresentationModel::GetInstance()->GetFolder(parentID, 0, foldercount, folderList); + TryCatch( !IsFailed(r),,"BookmarkPresentationModel::GetInstance()->GetFolder failed %s",GetErrorMessage(r)); + + // To check if folder with same name exists + for (count = 0; count < foldercount; count++) + { + BookmarkData* pBookmark = dynamic_cast< BookmarkData* >(folderList.GetAt(count)); + if ( pBookmark == NULL ) + { + return; + } + title = pBookmark->GetBookmarkTitle(); + title.Trim(); + + if (folderTitle.Equals(title, false) == true) + { + flag = true; + break; + } + } + + if (flag == true && ( __ret == true || __previousScene == IDSCN_EDIT_BOOKMARK_LIST)) + { + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + folderList.RemoveAll(true); + return; + } + + if (flag == true) + { + String message = " Folder already exists "; + CreateMessage(message); // Message alert saying Folder already exists + } + else + { + if (__previousScene == IDSCN_EDIT_BOOKMARK_LIST || __ret == true ) + { + __pBookmark->SetBookmarkTitle(folderTitle); + BookmarkPresentationModel::GetInstance()->SaveFolder(*__pBookmark); + + r = SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + AppLogDebug("SCENE_ADD_BOOKMARK error = %s",GetErrorMessage(r)); + + } + else + { + ArrayList* pArgList = null; + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) String(L"2")); + } + + BookmarkData bookmark; + bookmark.SetBookmarkTitle(folderTitle); + BookmarkPresentationModel::GetInstance()->SaveFolder(bookmark); + result r = pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT),pArgList); + AppLogDebug("SCENE_ADD_BOOKMARK error = %s",GetErrorMessage(r)); + if (pArgList != null) + { + pArgList->RemoveAll(true); + delete pArgList; + } + TryCatch( !IsFailed(r),L"BookmarkPresentationModel::GetFolder failed %s",GetErrorMessage(r)); + } + + } + + folderList.RemoveAll(true); + } + break; + + default: + break; + } + + CATCH: return; +} + +void +CreateBookmarkFolderForm::OnKeypadActionPerformed(Control& source, KeypadAction keypadAction) +{ + +} + +void +CreateBookmarkFolderForm::OnKeypadClosed(Control& source) +{ + +} + +void +CreateBookmarkFolderForm::OnKeypadOpened(Control& source) +{ + +} + +void +CreateBookmarkFolderForm::OnKeypadWillOpen(Control& source) +{ + +} + +void +CreateBookmarkFolderForm::OnTextValueChanged(const Control& source) +{ + String title = L""; + Header* pHeader = GetHeader(); + + if (pHeader == NULL) + { + return; + } + + if (__pFolderTitle == NULL) + { + return; + } + + title = __pFolderTitle->GetText(); + title.Trim(); + + // To disable done button when folder title edit-field is empty + if (__pFolderTitle && title.GetLength() == 0) + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, false); + } + else + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, true); + } + pHeader->Invalidate(true); + return; +} + +void +CreateBookmarkFolderForm::OnTextValueChangeCanceled(const Control& source) +{ + +} + +void +CreateBookmarkFolderForm::CreateMessage(String& msg) +{ + + if (__pMsgBox != null) + { + delete __pMsgBox; + __pMsgBox = null; + __modalMsgBoxResult = 0; + } + + __pMsgBox = new(std::nothrow) MessageBox; + + if (__pMsgBox != null) + { + __pMsgBox->Construct(L"", msg, MSGBOX_STYLE_OK, 3000); + } + + if (__pMsgBox != null) + { + __pMsgBox->ShowAndWait(__modalMsgBoxResult); + if(__pFolderTitle != null) + __pFolderTitle->SetFocus(); + /*if (__modalMsgBoxResult == MSGBOX_RESULT_OK) + { + AppLog("CreateBookmarkFolderForm::CreateMessage MSGBOX_RESULT_OK"); + if (__pMsgBox != null) + { + delete __pMsgBox; + __pMsgBox = null; + } + }*/ + if (__pMsgBox != null) + { + delete __pMsgBox; + __pMsgBox = null; + } + __modalMsgBoxResult = 0; + } + + return; +} diff --git a/src/IntDefaultCustomItem.cpp b/src/IntDefaultCustomItem.cpp new file mode 100644 index 0000000..dc024ce --- /dev/null +++ b/src/IntDefaultCustomItem.cpp @@ -0,0 +1,87 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntDefaultCustomItem + *@brief: + * + */ + +#include +#include "IntDefaultCustomItem.h" +#include "IntTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +const int DefaultCustomItem::IDA_FORMAT_STRING = 101; + +DefaultCustomItem::DefaultCustomItem(void) +{ + __width = 0; + __height = 0; + __text = L""; +} + +DefaultCustomItem::~DefaultCustomItem(void) +{ + +} + +result +DefaultCustomItem::Construct(int width, int height) +{ + result r = E_FAILURE; + __width = width; + __height = height; + const Dimension dim(width, height); + r = CustomItem::Construct(dim, LIST_ANNEX_STYLE_NORMAL); + return r; + +} + +void +DefaultCustomItem::SetText(String& text) +{ + __text = text; +} + +String +DefaultCustomItem::GetText(void) +{ + return __text; +} + + +result +DefaultCustomItem::Make(void) +{ + result r = E_SUCCESS; + const Color pressedTextColor = Color(249, 249, 249); + const int textSize = 40; + const int x_Margin_Element = 26; + const int y_Margin_Element = 26; + const int width_Element = __width - 60; + + r = AddElement(Rectangle(x_Margin_Element, y_Margin_Element, width_Element,60), IDA_FORMAT_STRING, __text, textSize, CUSTOM_COLOR_TRANSPARENT, pressedTextColor, pressedTextColor, true); + TryCatch( !IsFailed(r),,"DefaultCustomItem::Make %s",GetErrorMessage(r)); + + SetElementSelectionEnabled(IDA_FORMAT_STRING, true); + + CATCH:return r; +} diff --git a/src/IntDropDownCustomItem.cpp b/src/IntDropDownCustomItem.cpp new file mode 100644 index 0000000..43265d0 --- /dev/null +++ b/src/IntDropDownCustomItem.cpp @@ -0,0 +1,199 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +/* + *@file: IntDropDownCustomItem + *@brief: To create Drop Down custom item + * + */ + +#include +#include + +#include "IntDropDownCustomItem.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +static const wchar_t* IDB_LIST_EXPAND_CLOSED = L"00_circle_button_Expand_closed.png"; +static const wchar_t* IDB_LIST_EXPAND_CLOSED_PRESS = L"00_list_expand_closed_press.png"; +static const wchar_t* IDB_LIST_EXPAND_OPENED = L"00_circle_button_Expand_open.png"; +static const wchar_t* IDB_LIST_EXPAND_OPENED_PRESS = L"00_list_expand_opened_press.png"; + +const int DropDownCustomItem::IDA_FORMAT_BITMAP = 101; +const int DropDownCustomItem::IDA_FORMAT_MAIN_STRING = 102; +const int DropDownCustomItem::IDA_FORMAT_SUB_STRING = 103; +const int DropDownCustomItem::IDA_FORMAT_DROPPER = 104; + + +DropDownCustomItem::DropDownCustomItem(void) +{ + __width = 0; + __height = 0; + __mainText = L""; + __subText = L""; + __currentState = DROP_DOWN__ITEM_STATE_CLOSED; +} + +DropDownCustomItem::~DropDownCustomItem(void) +{ + +} + +result +DropDownCustomItem::Construct(int width) +{ + result r = E_SUCCESS; + __width = width; + __height = 140; + Dimension dim(__width, __height); + r = CustomItem::Construct(dim, LIST_ANNEX_STYLE_NORMAL); + return r; +} + +void +DropDownCustomItem::SetMainText(const Tizen::Base::String& text) +{ + __mainText = text; +} + +String +DropDownCustomItem::GetMainText(void) +{ + return __mainText; +} + +void +DropDownCustomItem::SetSubText(const Tizen::Base::String& text) +{ + __subText = text; +} + +String +DropDownCustomItem::GetSubText(void) +{ + return __subText; +} + +result +DropDownCustomItem::Make() +{ + AppLogDebug("DropDownCustomItem::Make entered"); + result r = E_FAILURE; + EnrichedText* pMainEnText = null; + EnrichedText* pSubEnText = null; + TextElement* pMainTextElement = null; + TextElement* pSubTextElement = null; + Font mainTextFont; + Font subTextFont; + Tizen::Graphics::Bitmap* pDropperBitmapNormal = null; + Tizen::Graphics::Bitmap* pDropperBitmapPressed = null; + + pMainEnText = new(std::nothrow) EnrichedText(); + r = pMainEnText->Construct(Dimension(__width - 80, 54)); + if(IsFailed(r)) + { + delete pMainEnText; + return E_FAILURE; + } + + pMainTextElement = new(std::nothrow) TextElement(); + pMainTextElement->Construct(__mainText); + + mainTextFont.Construct(FONT_STYLE_BOLD, 44); + + Color pressedTextColor = CUSTOM_COLOR_LISTVIEW_TEXT; + pMainTextElement->SetFont(mainTextFont); + pMainTextElement->SetTextColor(CUSTOM_COLOR_TRANSPARENT); + pMainEnText->Add(*pMainTextElement); + + pSubEnText = new(std::nothrow) EnrichedText(); + r = pSubEnText->Construct(Dimension(__width - 80, 42)); + if(IsFailed(r)) + { + pMainEnText->RemoveAll(true); + delete pMainEnText; + delete pSubEnText; + return E_FAILURE; + } + + pSubTextElement = new(std::nothrow) TextElement(); + pSubTextElement->Construct(__subText); + + + subTextFont.Construct(FONT_STYLE_PLAIN, 32); + + pSubTextElement->SetFont(subTextFont); + pSubTextElement->SetTextColor(CUSTOM_COLOR_GREY); + pSubEnText->Add(*pSubTextElement); + + r = AddElement(Rectangle(26, 22, __width - 126, 54), IDA_FORMAT_MAIN_STRING, *pMainEnText); + r = AddElement(Rectangle(26, 76, __width - 126, 42), IDA_FORMAT_SUB_STRING, *pSubEnText); + if(IsFailed(r)) + { + pMainEnText->RemoveAll(true); + pSubEnText->RemoveAll(true); + delete pMainEnText; + delete pSubEnText; + return E_FAILURE; + } + AppResource* pAppResource = UiApp::GetInstance()->GetAppResource(); + if (pAppResource) + { + if (GetCurState() == DROP_DOWN__ITEM_STATE_CLOSED) + { + pDropperBitmapNormal = pAppResource->GetBitmapN(IDB_LIST_EXPAND_CLOSED, BITMAP_PIXEL_FORMAT_ARGB8888); + pDropperBitmapPressed = pAppResource->GetBitmapN(IDB_LIST_EXPAND_CLOSED_PRESS, BITMAP_PIXEL_FORMAT_ARGB8888); + } + else + { + pDropperBitmapNormal = pAppResource->GetBitmapN(IDB_LIST_EXPAND_OPENED, BITMAP_PIXEL_FORMAT_ARGB8888); + pDropperBitmapPressed = pAppResource->GetBitmapN(IDB_LIST_EXPAND_OPENED_PRESS, BITMAP_PIXEL_FORMAT_ARGB8888); + } + + AddElement(Rectangle(__width - 95, (__height - 74) / 2, 74, 74), IDA_FORMAT_DROPPER, *pDropperBitmapNormal, pDropperBitmapPressed, pDropperBitmapNormal); + delete pDropperBitmapNormal; + delete pDropperBitmapPressed; + } + + SetElementSelectionEnabled(IDA_FORMAT_MAIN_STRING, true); + SetElementSelectionEnabled(IDA_FORMAT_SUB_STRING, true); + SetElementSelectionEnabled(IDA_FORMAT_DROPPER, true); + + pSubEnText->RemoveAllTextElements(true); + pMainEnText->RemoveAllTextElements(true); + + delete pMainEnText; + delete pSubEnText; + + return E_SUCCESS; +} + +DropDownItemState +DropDownCustomItem::GetCurState(void) +{ + return __currentState; +} + +void +DropDownCustomItem::SetCurState(DropDownItemState state) +{ + __currentState = state; +} diff --git a/src/IntEditBookmarkListForm.cpp b/src/IntEditBookmarkListForm.cpp new file mode 100644 index 0000000..13189b2 --- /dev/null +++ b/src/IntEditBookmarkListForm.cpp @@ -0,0 +1,836 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: EditBookmarkListForm + *@brief: This class defines EditBookmarkListForm used to edit the bookmark + * + */ + +#include +#include + +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntEditBookmarkListForm.h" +#include "IntFaviconManager.h" +#include "IntNotificationPanel.h" +#include "IntSceneRegister.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const wchar_t* IDB_ICON_FOLDER_OPEN = L"I01_icon_folder_open.png"; +static const wchar_t* IDB_ITEM = L"edit_item.png"; +static const wchar_t* IDB_RIGHT_ARROW = L"I01_right_arrow.png"; + + +const int EditBookmarkListForm::IDA_BUTTON_CHECKED = 101; +const int EditBookmarkListForm::IDA_TABBAR_ITEM_1 = 102; +const int EditBookmarkListForm::IDA_TABBAR_ITEM_2 = 103; +const int EditBookmarkListForm::IDA_DELETEITEM_CLICKED = 104; +const int EditBookmarkListForm::IDA_SHAREITEM_CLICKED = 105; +const int EditBookmarkListForm::IDA_CANCELITEM_CLICKED = 106; +const int EditBookmarkListForm::IDA_FORMAT_FOLDER = 107; +const int EditBookmarkListForm::IDA_FORMAT_SITE = 108; +const int EditBookmarkListForm::IDA_FORMAT_ICON = 109; +const int EditBookmarkListForm::IDA_FORMAT_BITMAP = 110; +const int EditBookmarkListForm::IDA_BUTTON_UNCHECKED = 111; +const int EditBookmarkListForm::IDA_FORMAT_URL = 112; + + + +EditBookmarkListForm::EditBookmarkListForm(void) +{ + __pListview = null; + __pData = null; + __pTimer = null; + __parentID = L"-1"; + __pInfoPanel = null; + __pInfoLabel = null; + __selectedItemCount = 0; + __pCheckButton = null; + __pConfirmationPopup = null; +} + +EditBookmarkListForm::~EditBookmarkListForm(void) +{ + if (__pData != null) + { + __pData->RemoveAll(true); + delete __pData; + } +} + +bool +EditBookmarkListForm::Initialize(void) +{ + Construct(L"IDL_EDIT_BOOKMARK_LIST"); + + return true; +} +result +EditBookmarkListForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + Rectangle rc = GetClientAreaBounds(); + String selected = CommonUtil::GetString(L"IDS_COM_OPT_SELECTED"); + + // Setup back event listener + SetFormBackEventListener(this); + AddOrientationEventListener(*this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager != null) + { + pSceneManager->AddSceneEventListener(IDSCN_EDIT_BOOKMARK_LIST, *this); + } + + Header* pHeader = GetHeader(); + + if (pHeader == NULL) + { + return E_FAILURE; + } + pHeader->SetTitleText(CommonUtil::GetString(L"IDS_BR_HEADER_EDIT_BOOKMARK"));; + + __pCheckButton = static_cast< CheckButton* >(GetControl( + L"IDC_SELECT_CHECKBUTTON", true)); + + if (__pCheckButton == null) + { + return E_FAILURE; + } + + __pCheckButton->SetActionId(IDA_BUTTON_CHECKED, IDA_BUTTON_UNCHECKED); + __pCheckButton->AddActionEventListener(*this); + + __pListview = static_cast< ListView* >(GetControl("IDC_LISTVIEW1")); + + if (__pListview == null) + { + return E_FAILURE; + } + +// __pListview->SetBounds(__pListview->GetX(), __pListview->GetY(), __pListview->GetWidth(), rc.height - 112 - 48); + __pListview->AddFastScrollListener(*this); + __pListview->AddListViewItemEventListener(*this); + __pListview->SetItemProvider(*this); + + + __pInfoPanel = static_cast< Panel* >(GetControl( + L"IDC_INFO_PANEL", true)); + + if (__pInfoPanel == null) + { + return E_FAILURE; + } + +// __pInfoPanel->SetBounds(Rectangle(0,rc.height - 48, rc.width, 48)); + + //SetControlAlwaysOnTop(*__pInfoPanel, true); + + __pInfoLabel = static_cast< Label* >(GetControl( + L"IDC_INFO_LABEL", true)); + + if (__pInfoLabel == null) + { + return E_FAILURE; + } + +// __pInfoLabel->SetBounds(Rectangle(0,0,rc.width, 48)); + selected.Append(L"(0)"); + __pInfoLabel->SetText(selected); + + __pInfoLabel->SetTextConfig(32,LABEL_TEXT_STYLE_BOLD); + //__pInfoLabel->SetBackgroundColor(CUSTOM_COLOR_INFO_LABEL); + __pInfoLabel->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pInfoLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER); + GetFooter()->SetItemEnabled(0,false); + GetFooter()->AddActionEventListener(*this); + __pTimer = new (std::nothrow) Timer(); + __pTimer->Construct(*this); + return r; +} + +void +EditBookmarkListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + result r = E_SUCCESS; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + switch (actionId) + { + case IDA_DELETEITEM_CLICKED: + { + String labelString; + int count = 0; + if(__pListview == null) + { + return; + } + for (int count = 0;count < __pListview->GetItemCount();count++) + { + if (__pListview->IsItemChecked(count)) + { + int id = 0; + String bookmarkId; + BookmarkData* pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(count)); + if (pBookMark == null) + { + return; + } + bookmarkId = pBookMark->GetBookmarkId(); + Integer::Parse(bookmarkId,id); + + if (pBookMark->GetBookmarkType() == BOOKMARK_TYPE_URL) + { + r = BookmarkPresentationModel::GetInstance()->DeleteBookmark(id); + TryCatch( r == E_SUCCESS,,"EditBookmarkListForm::OnActionPerformed BookmarkPresentationModel::GetInstance()->DeleteBookmark failed %s",GetErrorMessage(r)); + } + else + { + r = BookmarkPresentationModel::GetInstance()->DeleteFolder(id); + TryCatch( r == E_SUCCESS,,"EditBookmarkListForm::OnActionPerformed BookmarkPresentationModel::GetInstance()->DeleteBookmark failed %s",GetErrorMessage(r)); + } + } + } + + if (__pListview != null) + { + count = __pListview->GetItemCount(); + + for(int index = 0; index < count ; index ++) + { + if(__pListview->IsItemChecked(index) == true ) + { + __pListview->SetItemChecked(index,false); + } + } + + __pCheckButton->SetSelected(false); + __pListview->UpdateList(); + + if ( __pListview->GetItemCount() == 0) + { + __pCheckButton->SetShowState(false); + __pCheckButton->Invalidate(true); + if (__pInfoPanel != null) + { + __pInfoPanel->SetShowState(false); + } + r = __pListview->SetBounds(__pListview->GetX(), 0, __pListview->GetWidth(), GetClientAreaBounds().height); + if (IsFailed(r)) + { + return; + } + + + } + } + GetFooter()->SetItemEnabled(0,false); + GetFooter()->Invalidate(true); + labelString.Append(CommonUtil::GetString(L"IDS_COM_OPT_SELECTED")); + labelString.Append(L"(0)"); + + if (__pInfoPanel != null) + { + __pInfoLabel->SetText(labelString); + __pInfoPanel->Draw(); + __pInfoPanel->Show(); + } + + NotificationPanel* pNotification = new (std::nothrow) NotificationPanel(*this); + String notification = CommonUtil::GetString(L"IDS_BR_POP_DELETED"); + pNotification->SetText(notification); + pNotification->ShowNotification(); + + + if( __pListview->GetItemCount() == 0) + { + __pTimer->Start(1000); + } + } + break; + case IDA_CANCELITEM_CLICKED: + { + if ( __pTimer != NULL) + { + __pTimer->Cancel(); + } + if(pSceneManager != NULL) + { + r = pSceneManager->GoBackward(BackwardSceneTransition()); + } + if (IsFailed(r)) + { + AppLogDebug("EditBookmarkListForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + return; + } + } + break; + case IDA_BUTTON_CHECKED: + { + String labelString; + bool flag = false; + + for (int count = 0;count < __pListview->GetItemCount();count++) + { + __pListview->SetItemChecked(count,true); + } + + GetFooter()->SetItemEnabled(0,true); + GetFooter()->Invalidate(true); + + labelString.Append(CommonUtil::GetString(L"IDS_COM_OPT_SELECTED")); + labelString.Append(L"("); + labelString.Append(__pListview->GetItemCount()); + labelString.Append(L")"); + + __pInfoLabel->SetText(labelString); + __pInfoPanel->Draw(); + __pInfoPanel->Show(); + + __pListview->Invalidate(true); + } + break; + case IDA_BUTTON_UNCHECKED: + { + String labelString = L""; + + for (int count = 0;count < __pListview->GetItemCount();count++) + { + __pListview->SetItemChecked(count,false); + } + + labelString.Append(CommonUtil::GetString(L"IDS_COM_OPT_SELECTED")); + labelString.Append(L"(0)"); + __pInfoLabel->SetText(labelString); + __pInfoPanel->Draw(); + __pInfoPanel->Show(); + + __pListview->Invalidate(true); + + GetFooter()->SetItemEnabled(0,false); + GetFooter()->Invalidate(true); + } + break; + default: + break; + } + + CATCH: return ; +} + +ListItemBase* +EditBookmarkListForm::CreateItem(int index, int itemWidth) +{ + result r = E_SUCCESS; + ListAnnexStyle style = LIST_ANNEX_STYLE_MARK; + CustomItem* pItem = null; + BookmarkData* pBookMark = null; + Bitmap* pBitmap = null; + String bitmapId; + const int x_Margin_Url = 104; + const int y_Margin_Url = 70; + const int height_Url = 40; + const int width_Url = GetClientAreaBounds().width - 104 - 120 - 16; + const int itemHeight = 112; + const int textSize = 32; + const int width_Title = GetClientAreaBounds().width - 104 - 120 - 16; + + pItem = new(std::nothrow) CustomItem(); + if (pItem == null) + { + return null; + } + pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + if (pBookMark == null) + { + delete pItem; + pItem = null; + return null; + } + if (pBookMark->GetBookmarkType() == BOOKMARK_TYPE_FOLDER) + { + r = pItem->Construct(Tizen::Graphics::Dimension(itemWidth, 112), style); + TryCatch( r == E_SUCCESS,,"EditBookmarkListForm::CreateItem contruct item failed %s",GetErrorMessage(r)); + + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_FOLDER_OPEN); + + if (pBitmap != null) + { + pItem->AddElement(Rectangle(16, 26, 60, 60), IDA_FORMAT_ICON, *pBitmap, null); + delete pBitmap; + } + + pItem->AddElement(Rectangle(92, 8, width_Title/*__pListview->GetWidth() - 92 - 80*/, 112), IDA_FORMAT_FOLDER, pBookMark->GetBookmarkTitle(), true); + + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ITEM); + + if (pBitmap != null) + { + pItem->AddElement(Rectangle(__pListview->GetWidth() - 92 - 64, 20, 60, 60), IDA_FORMAT_BITMAP, *pBitmap, null, null); + delete pBitmap; + } + } + else + { + r = pItem->Construct(Tizen::Graphics::Dimension(itemWidth, 128), style); + TryCatch( r == E_SUCCESS,,"EditBookmarkListForm::CreateItem contruct item failed %s",GetErrorMessage(r)); + + bitmapId = pBookMark->GetFaviconId(); + pBitmap = FaviconManager::GetInstance()->GetFaviconN(bitmapId); + + if (pBitmap == null) + { + pBitmap = FaviconManager::GetInstance()->GetDefaultFaviconN(); + } + + pItem->AddElement(Rectangle(16, 28, 72, 72), IDA_FORMAT_ICON, *pBitmap, null); + delete pBitmap; + + pItem->AddElement(Rectangle(104, 10, width_Title, itemHeight - height_Url), IDA_FORMAT_SITE, pBookMark->GetBookmarkTitle(), true); + pItem->AddElement(Rectangle(x_Margin_Url, y_Margin_Url, width_Url, height_Url), IDA_FORMAT_URL, pBookMark->GetUrl(),textSize,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,true); + + //pBitmap = AppResource::GetInstance()->GetBitmapN("I01_picker_arrow_right.png"); + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_RIGHT_ARROW); + if (pBitmap != null) + { + pItem->AddElement(Rectangle(__pListview->GetWidth() - 92 - 68, 32, 64, 64), IDA_FORMAT_BITMAP, *pBitmap, null, null); + delete pBitmap; + } + } + return pItem; + + CATCH: + delete pItem; + pItem = null; + return NULL; +} + +bool +EditBookmarkListForm::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +int +EditBookmarkListForm::GetItemCount(void) +{ + int count = 0; + result r = E_SUCCESS; + + BookmarkPresentationModel::GetInstance()->GetFolderBookmarkCount(__parentID, count); + + if (__pData != NULL) + { + __pData->RemoveAll(true); + delete __pData; + __pData = NULL ; + + } + __pData = new(std::nothrow) ArrayList(); + + if (__pData == null) + { + return 0; + } + + r = __pData->Construct(); + + TryCatch( r == E_SUCCESS,,"EditBookmarkListForm::GetItemCount __pData->Construct() failed %s",GetErrorMessage(r)); + + BookmarkPresentationModel::GetInstance()->GetFoldersBookmarks(__parentID, 0, count, *__pData); + + if ( count == 0) + { + if(__pCheckButton != null) + { + __pCheckButton->SetShowState(false); + } + if(__pInfoPanel != null) + { + __pInfoPanel->SetShowState(false); + } + __pListview->SetBounds(__pListview->GetX(), 0, __pListview->GetWidth(), GetClientAreaBounds().height); + + } + else + { + if(__pCheckButton != null) + { + __pCheckButton->SetShowState(true); + } + if(__pInfoPanel != null) + { + __pInfoPanel->SetShowState(true); + } + if(__pCheckButton != null && __pInfoPanel != null) + __pListview->SetBounds(__pListview->GetX(), __pListview->GetY(), __pListview->GetWidth(), GetClientAreaBounds().height - __pCheckButton->GetHeight() - __pInfoPanel->GetHeight()); + + } + if(__pCheckButton != null) + { + __pCheckButton->Invalidate(true); + } + if(__pInfoPanel != null) + { + __pInfoPanel->Invalidate(false); + } + + return count; + + CATCH: + __pData->RemoveAll(true); + delete __pData; + __pData = null; + return 0; +} + +void +EditBookmarkListForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status) +{ + +} + +void +EditBookmarkListForm::OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + +} + +void +EditBookmarkListForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + String labelString; + __selectedItemCount = 0; + result r = E_SUCCESS; + + switch (elementId) + { + case IDA_FORMAT_BITMAP: + { + ArrayList* pArgList = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + BookmarkData* pBookMark = dynamic_cast< BookmarkData* >(__pData->GetAt(index)); + + if(pBookMark == NULL) + { + return; + } + if (__pListview->IsItemChecked(index) == true) + { + __pListview->SetItemChecked(index, false); + } + else + { + __pListview->SetItemChecked(index, true); + } + + if (pBookMark->GetBookmarkType() == BOOKMARK_TYPE_FOLDER) + { + pArgList = new(std::nothrow) ArrayList(); + + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) BookmarkData(*pBookMark)); + if ( pSceneManager != null) + { + result r = pSceneManager->GoForward(ForwardSceneTransition(IDSCN_CREATE_BOOKMARK_FOLDER, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + } + + if (pArgList != null) + { + pArgList->RemoveAll(false); + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("BookmarkListForm::CreateItem Construct failed %s",GetErrorMessage(r)); + return; + } + + } + } + else + { + pArgList = new(std::nothrow) ArrayList(); + + if (pArgList != null) + { + pArgList->Construct(); + pArgList->Add(*new(std::nothrow) String(L"1")); + pArgList->Add(*new(std::nothrow) BookmarkData(*pBookMark)); + if ( pSceneManager != null) + { + result r = pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ADD_BOOKMARK, SCENE_TRANSITION_ANIMATION_TYPE_NONE), pArgList); + } + if (pArgList != null) + { + pArgList->RemoveAll(false); + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("BookmarkListForm::CreateItem Construct failed %s",GetErrorMessage(r)); + return; + } + } + } + } + break; + + default: + { + int count = 0; + bool flag = false; + + int itemCount = __pListview->GetItemCount(); + for (int count = 0;count < itemCount ; count++) + { + if (__pListview->IsItemChecked(count)) + { + __selectedItemCount++; + } + } + + //labelString.Append(__selectedItemCount); + labelString.Append(CommonUtil::GetString(L"IDS_COM_OPT_SELECTED")); + labelString.Append(L"("); + labelString.Append(__selectedItemCount); + labelString.Append(L")"); + __pInfoLabel->SetText(labelString); + __pInfoPanel->Draw(); + __pInfoPanel->Show(); + BookmarkPresentationModel::GetInstance()->GetFolderBookmarkCount(L"-1",count); + if (__selectedItemCount == count) + { + __pCheckButton->SetSelected(true); + } + else + { + __pCheckButton->SetSelected(false); + } + + itemCount = __pListview->GetItemCount(); + for (int count = 0;count < itemCount ;count++) + { + if (__pListview->IsItemChecked(count)) + { + flag = true; + break; + } + } + + if (flag == true) + { + GetFooter()->SetItemEnabled(0,true); + } + else + { + GetFooter()->SetItemEnabled(0,false); + } + + GetFooter()->Invalidate(true); + + } + break; + } +} + +void +EditBookmarkListForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ + +} + +void +EditBookmarkListForm::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + +} +void +EditBookmarkListForm::OnListViewItemReordered(Tizen::Ui::Controls::ListView& listView, int indexFrom, int indexTo) +{ + +} + +void +EditBookmarkListForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + result r = E_FAILURE; + String labelString ; + int count = 0; + + if (pArgs != null) + { + __parentID.Clear(); + String* pStr = dynamic_cast(pArgs->GetAt(0)); + if(pStr == null) + { + return; + } + __parentID.Append(pStr->GetPointer()); + } + + __selectedItemCount = 0; + + labelString.Append(CommonUtil::GetString(L"IDS_COM_OPT_SELECTED")); + labelString.Append(L"("); + labelString.Append(__selectedItemCount); + labelString.Append(L")"); + __pInfoLabel->SetText(labelString); + + count = __pListview->GetItemCount(); + + for(int index = 0 ; index < count ; index++) + { + if(__pListview->IsItemChecked(index) == true) + { + __pListview->SetItemChecked(index,false); + } + } + + __pListview->UpdateList(); + __pCheckButton->SetSelected(false); + GetFooter()->SetItemEnabled(0,false); + GetFooter()->Invalidate(true); + + __pInfoPanel->Draw(); + __pInfoPanel->Show(); + + Invalidate(true); + +} + +void +EditBookmarkListForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + +} + +void +EditBookmarkListForm::OnFormBackRequested(Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if ( __pTimer != NULL) + { + __pTimer->Cancel(); + } + + if (pSceneManager != null) + { + //pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_BOOKMARK_VIEW, SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + result r = pSceneManager->GoBackward(BackwardSceneTransition()); + if(IsFailed(r)) + { + AppLogDebug("BookmarkListForm::CreateItem Construct failed %s",GetErrorMessage(r)); + return; + } + + } + GetFooter()->Invalidate(true); +} + + +void EditBookmarkListForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + int itemCount = 0; + ArrayList* pCheckedItems = NULL ; + + if (__pListview != null) + { + AppLog("the list Y axis is %d", __pListview->GetY()); + pCheckedItems = new(std::nothrow) ArrayList(); + pCheckedItems->Construct(); + if ( __pListview->GetItemCount() == 0) + { + __pCheckButton->SetShowState(false); + __pInfoPanel->SetShowState(false); + __pListview->SetBounds(0, __pListview->GetY(), GetClientAreaBounds().width, GetClientAreaBounds().height -__pListview->GetY()); + + } + else + { + __pCheckButton->SetShowState(true); + __pInfoPanel->SetShowState(true); + __pListview->SetBounds(__pListview->GetX(), __pListview->GetY(), __pListview->GetWidth(), GetClientAreaBounds().height - __pCheckButton->GetHeight() - __pInfoPanel->GetHeight()); + + } + __pCheckButton->Invalidate(true); + + itemCount = __pListview->GetItemCount(); + + for (int count = 0;count < itemCount ; count++) + { + + if (__pListview->IsItemChecked(count)) + { + pCheckedItems->Add(* new Integer(count)); + } + } + + __pListview->UpdateList(); + + for (int count = 0;count < itemCount ;count++) + { + if (pCheckedItems->Contains(* new Integer(count)) == true) + { + __pListview->SetItemChecked(count, true); + } + } + if ( pCheckedItems != NULL ) + { + pCheckedItems->RemoveAll(true); + delete pCheckedItems; + } + Invalidate(true); + } +} + +void +EditBookmarkListForm::OnTimerExpired(Timer& timer) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if ( pSceneManager != NULL) + { + result r = pSceneManager->GoBackward(BackwardSceneTransition()); + if(IsFailed(r)) + { + AppLogDebug("EditBookmarkListForm::OnTimerExpired GoBackward failed %s",GetErrorMessage(r)); + } + } +} diff --git a/src/IntEditHistoryListForm.cpp b/src/IntEditHistoryListForm.cpp new file mode 100644 index 0000000..57c0929 --- /dev/null +++ b/src/IntEditHistoryListForm.cpp @@ -0,0 +1,1159 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntEditHistoryListForm + *@brief: This class defines EditHistoryListForm used to edit the history scene + * + */ + +#include +#include +#include "IntCommonLib.h" +#include "IntEditHistoryListForm.h" +#include "IntFaviconManager.h" +#include "IntHistoryPresentationModel.h" +#include "IntNotificationPanel.h" +#include "IntSceneRegister.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Locales; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const int EditHistoryListForm::IDA_TABBAR_ITEM_1 = 101; +const int EditHistoryListForm::IDA_TABBAR_ITEM_2 = 102; +const int EditHistoryListForm::IDA_BUTTON_NEXT_FORM = 103; +const int EditHistoryListForm::IDA_FORMAT_ICON = 104; +const int EditHistoryListForm::IDA_FORMAT_TITLE = 105; +const int EditHistoryListForm::IDA_FORMAT_URL = 106; +const int EditHistoryListForm::IDA_SELECT_ALL_CHECKED = 107; +const int EditHistoryListForm::IDA_SELECT_ALL_UNCHECKED = 108; +const int EditHistoryListForm::IDA_DELETE_HISTORY = 109; +const int EditHistoryListForm::IDA_CANCEL = 110; + + +EditHistoryListForm::EditHistoryListForm(void) +:__pListView(null) +,__pGroupData(null) +,__pTimer(null) +,__pSelectAllCheck(null) +,__pSelectedLabel(null) +,__selectedCount(0) +,__isNoHistoryPresent(true) +{ +} + +EditHistoryListForm::~EditHistoryListForm(void) +{ + AppLog("EditHistoryListForm::~EditHistoryListForm called"); + + if (__pGroupData != null) + { + AppLog("removing __pGroupData"); + __pGroupData->RemoveAll(true); + delete __pGroupData; + } +} + +bool +EditHistoryListForm::Initialize(void) +{ + Construct(L"IDL_EDIT_HISTORY_LIST"); + + return true; +} + +result +EditHistoryListForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + SetFormBackEventListener(this); + + AppLogDebug("EditHistoryListForm::OnInitializing"); + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_INDICATOR | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + + Header* pHeader = GetHeader(); + + if (pHeader == NULL) + { + return E_FAILURE; + } + + pHeader->SetTitleText(CommonUtil::GetString("IDS_BR_SK_DELETE_ABB")); + + GetFooter()->AddActionEventListener(*this); + AddOrientationEventListener(*this); + + SceneManager::GetInstance()->AddSceneEventListener(IDSCN_EDIT_HISTORY_LIST, *this); + __pSelectedLabel = static_cast< Label* >(GetControl(L"IDC_LABEL1")); + + if (__pSelectedLabel == null) + { + return E_FAILURE; + } + String selectedText = CommonUtil::GetString(L"IDS_COM_OPT_SELECTED") + "(0)"; + __pSelectedLabel->SetText(selectedText); + + __pSelectAllCheck = static_cast< CheckButton* >(GetControl(L"IDC_SELECT_ALL",true)); + + if (__pSelectAllCheck != null) + { + __pSelectAllCheck->SetActionId(IDA_SELECT_ALL_CHECKED, IDA_SELECT_ALL_UNCHECKED); + __pSelectAllCheck->AddActionEventListener(*this); + } + else + { + return E_FAILURE; + } + + __pListView = static_cast< GroupedListView* >(GetControl(L"IDC_GROUPEDLISTVIEW1")); + if( __pListView != NULL) + { + __pListView->SetItemProvider(*this); + __pListView->AddGroupedListViewItemEventListener(*this); + } + else + { + return E_FAILURE; + } + + __pTimer = new (std::nothrow) Timer(); + r = __pTimer->Construct(*this); + + return r; +} + +result +EditHistoryListForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + return r; +} + +void +EditHistoryListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + String selectedText = CommonUtil::GetString(L"IDS_COM_OPT_SELECTED"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return; + } + + switch (actionId) + { + case IDA_TABBAR_ITEM_1: + { + result r = pSceneManager->GoBackward(BackwardSceneTransition()); + if (IsFailed(r)) + { + AppLogDebug("EditHistoryListForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + return; + } + } + + break; + case IDA_SELECT_ALL_CHECKED: + { + int selectedCount = 0; + for (int groupIndex = 0 ; __pGroupData != null && groupIndex < __pGroupData->GetCount() ; groupIndex ++) + { + GroupItemClass* pGClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if(pGClass == null) + { + continue; + } + for (int itemIndex = 0 ; itemIndex < pGClass->__pData->GetCount() ; itemIndex ++) + { + selectedCount++; + __pListView->SetItemChecked(groupIndex,itemIndex,true); + } + } + selectedText.Append(L"("); + selectedText.Append(selectedCount); + selectedText.Append(L")"); + __selectedCount = selectedCount; + + __pSelectedLabel->SetText(selectedText); + __pSelectedLabel->Invalidate(true); + + GetFooter()->SetItemEnabled(0, true); + GetFooter()->Invalidate(true); + + __pListView->Invalidate(true); + + } + break; + case IDA_SELECT_ALL_UNCHECKED: + { + for (int groupIndex = 0 ; __pGroupData != null && groupIndex < __pGroupData->GetCount() ; groupIndex ++) + { + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if(pGroupItemClass == null) + { + continue; + } + for (int itemIndex = 0 ; itemIndex < pGroupItemClass->__pData->GetCount() ; itemIndex ++) + { + __pListView->SetItemChecked(groupIndex,itemIndex,false); + } + } + selectedText.Append(L"(0)"); + __pSelectedLabel->SetText(selectedText); + __selectedCount = 0; + __pSelectedLabel->Invalidate(true); + + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + + __pListView->Invalidate(true); + } + break; + case IDA_DELETE_HISTORY: + { + + ArrayList* pArrayList = new(std::nothrow) ArrayList(); + int itemCount = 0; + int count = 0; + int groupCount = 0; + int counter = 0; + pArrayList->Construct(); + for (int groupIndex = 0 ; __pGroupData != null && groupIndex < __pGroupData->GetCount() ; groupIndex ++) + { + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + + if (pGroupItemClass == null || pGroupItemClass->__pData == null) + { + AppLogDebug(" pGroupItemClass || __pData is null"); + continue; + } + itemCount = pGroupItemClass->__pData->GetCount(); + for (int itemIndex = 0 ; itemIndex < itemCount ; itemIndex++) + { + bool ret = __pListView->IsItemChecked(groupIndex,itemIndex); + if (ret == false) + { + continue; + } + AppLog("deleting history for groupId %d, item %d",groupIndex,itemIndex); + int hisId = -1; + History* pHistory = dynamic_cast< History* >(pGroupItemClass->__pData->GetAt(itemIndex)); + if(pHistory == null) + { + continue; + } + pArrayList->Add(*new(std::nothrow) String(pHistory->GetHistoryId())); + + } + } + + HistoryPresentationModel::GetInstance()->DeleteMultipleHistory(pArrayList); + + if (pArrayList != null) + { + pArrayList->RemoveAll(true); + delete pArrayList; + } + + if(__pGroupData != null) + { + groupCount = __pGroupData->GetCount(); + + for(int groupIndex = 0 ; groupIndex < groupCount ; groupIndex ++ ) + { + counter = __pListView->GetItemCountAt(groupIndex); + + for(int index = 0 ; index < counter ; index++) + { + if(__pListView->IsItemChecked( groupIndex,index ) == true) + { + __pListView->SetItemChecked(groupIndex,index,false); + } + } + } + } + + + + __pSelectAllCheck->SetSelected(false); + + GetFooter()->SetItemEnabled(0,false); + GetFooter()->Invalidate(true); + selectedText.Append(L"(0)"); + __pSelectedLabel->SetText(selectedText); + __selectedCount = 0; + __pSelectedLabel->Invalidate(true); + if (__pListView != null) + { + __pListView->UpdateList(); + } + + NotificationPanel* pNotification = new (std::nothrow) NotificationPanel(*this); + String notification = CommonUtil::GetString(L"IDS_BR_POP_DELETED"); + pNotification->SetText(notification); + pNotification->ShowNotification(); + } + break; + case IDA_CANCEL: + { + if( __pTimer != NULL) + { + __pTimer->Cancel(); + } + result r = pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_HISTORY_LIST, SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + if (IsFailed(r)) + { + AppLogDebug("EditHistoryListForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + return; + } + + } + break; + + default: + break; + } +} + +void +EditHistoryListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return; + } + + result r = pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_HISTORY_LIST, SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + if (IsFailed(r)) + { + AppLogDebug("EditHistoryListForm::OnFormBackRequested Failed to GoBackward %s",GetErrorMessage(r)); + return; + } +} + +GroupItem* +EditHistoryListForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + AppLogDebug("EditHistoryListForm::CreateGroupItem"); + result r = E_FAILURE; + + int strMonth = 0; + String text; + GroupItem* pItem = null; + int count = 0; + + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if(pGroupItemClass == null) + return null; + pItem = new(std::nothrow) GroupItem(); + + if (pItem == null) + { + return null; + } + + if ( pGroupItemClass->__pData == null || pGroupItemClass->__pData->GetCount() == 0) + { + r = pItem->Construct(Dimension(itemWidth, 0)); + } + else + { + r = pItem->Construct(Dimension(itemWidth, 48)); + } + + text = pGroupItemClass->__titleText; + text.Append(L" ("); + + int dayOfWeek = 0 ; + if (pGroupItemClass->__titleText == L"Today" || pGroupItemClass->__titleText == L"Yesterday") + { + Calendar* pGregorianCalendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + if (pGregorianCalendar != NULL) + { + pGregorianCalendar->SetTimeField(TIME_FIELD_YEAR, pGroupItemClass->__startTime.GetYear()); + pGregorianCalendar->SetTimeField(TIME_FIELD_MONTH, pGroupItemClass->__startTime.GetMonth()); + pGregorianCalendar->SetTimeField(TIME_FIELD_DAY_OF_MONTH, pGroupItemClass->__startTime.GetDay()); + dayOfWeek = pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK); + + if (pGregorianCalendar != NULL) + { + delete pGregorianCalendar; + } + } + } + switch(dayOfWeek) + { + case 1: + text.Append(L"Sun"); + break; + case 2: + text.Append(L"Mon"); + break; + case 3: + text.Append(L"Tue"); + break; + case 4: + text.Append(L"Wed"); + break; + case 5: + text.Append(L"Thu"); + break; + case 6: + text.Append(L"Fri"); + break; + case 7: + text.Append(L"Sat"); + break; + default: + break; + } + text.Append(L", "); + + String month = L""; + + if (pGroupItemClass->__titleText != L"Older") + { + text.Append(pGroupItemClass->__startTime.GetDay()); + text.Append(L". "); + strMonth = pGroupItemClass->__startTime.GetMonth(); + month = GetMonth(strMonth); + text.Append(month); + } + else + { + text.Append(L"~ "); + } + + if (pGroupItemClass->__titleText == L"Last week" || pGroupItemClass->__titleText == L"Two weeks ago" || pGroupItemClass->__titleText == L"Three weeks ago" || pGroupItemClass->__titleText == L"Four weeks ago" || pGroupItemClass->__titleText == L"Last month" || pGroupItemClass->__titleText == L"Older") + { + text.Append(L" - "); + text.Append(pGroupItemClass->__endTime.GetDay()); + text.Append(L". "); + strMonth = pGroupItemClass->__endTime.GetMonth(); + month = GetMonth(strMonth); + text.Append(month); + } + + text.Append(L".)"); + AppLogDebug("startTime day = %d month = %d year = %d",pGroupItemClass->__startTime.GetDay(),pGroupItemClass->__startTime.GetMonth(),pGroupItemClass->__startTime.GetYear()); + + pItem->SetElement(text, null); + pItem->SetTextSize(32); + + return pItem; +} + +ListItemBase* +EditHistoryListForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLogDebug("EditHistoryListForm::CreateItem"); + result r = E_FAILURE; + const int bookmarkBtnWidth = 64; + String bitmapId; + if (__pGroupData == null) + { + return null; + } + + CustomItem* pItem = new(std::nothrow) CustomItem(); + if ( pItem == NULL) + { + return null ; + } + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + + if (pGroupItemClass == null) + { + delete pItem; + return null; + } + + History* pHistory = dynamic_cast< History* >(pGroupItemClass->__pData->GetAt(itemIndex)); + if ( pHistory == NULL ) + { + delete pItem; + return null; + } + Bitmap* pBitmap = null; + + r = pItem->Construct(Tizen::Graphics::Dimension(itemWidth, 128), LIST_ANNEX_STYLE_MARK); + + bitmapId = pHistory->GetFaviconId(); + + pBitmap = FaviconManager::GetInstance()->GetFaviconN(bitmapId); + if (pBitmap == null) + { + pBitmap = FaviconManager::GetInstance()->GetDefaultFaviconN(); + } + + if (pBitmap != null) + { + pItem->AddElement(Rectangle(16, 26, 60, 60), IDA_FORMAT_ICON, *pBitmap, null); + delete pBitmap; + } + r = pItem->AddElement(Rectangle(92, 4, GetClientAreaBounds().width - 96 - 32 -64 -32, 60), IDA_FORMAT_TITLE, pHistory->GetHistoryTitle(), 44,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,true); + if (IsFailed(r)) + { + delete pItem; + AppLogException("CreateItem failed with %s", GetErrorMessage(r)); + return null; + } + + pItem->AddElement(Rectangle(92, 68, GetClientAreaBounds().width - 108 - 32 - bookmarkBtnWidth - 32, 52), IDA_FORMAT_URL, pHistory->GetHistoryUrl(),32,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,true); + + return pItem; +} + +bool +EditHistoryListForm::DeleteGroupItem(int groupIndex, GroupItem* pItem, int itemWidth) +{ + + AppLogDebug("EditHistoryListForm::DeleteGroupItem"); + + if (__pGroupData == null) + { + return false; + } + + delete pItem; + pItem = null; + + return true; + +} + +bool +EditHistoryListForm::DeleteItem(int groupIndex, int itemIndex, ListItemBase* pItem, int itemWidth) +{ + + if (__pGroupData == null) + { + return false; + } + + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + return false; + } + + delete pItem; + pItem = null; + return true; +} + +int +EditHistoryListForm::GetGroupCount(void) +{ + AppLogDebug("EditHistoryListForm::GetGroupCount"); + + __isNoHistoryPresent = true; + + CreateGroupItems(); + + int count = 0; + HistoryPresentationModel::GetInstance()->GetHistoryCount(count); + if(count == 0) + { + __isNoHistoryPresent = false; + AppLogDebug("the value of isNoHistoryPresent %d",__isNoHistoryPresent); + __pTimer->Start(1000); + __pSelectAllCheck->SetShowState(false); + __pSelectedLabel->SetShowState(false); + } + else + { + __isNoHistoryPresent = true; + __pSelectAllCheck->SetShowState(true); + __pSelectedLabel->SetShowState(true); + } + __pSelectAllCheck->Invalidate(true); + __pSelectedLabel->Invalidate(false); + GetFooter()->Invalidate(true); + + if (__pGroupData != null) + { + AppLogDebug("GetGroupCount returning %d",__pGroupData->GetCount()); + count = __pGroupData->GetCount(); + } + else + { + AppLogDebug("GetGroupCount returning 0"); + count = 0; + } + + return count; +} + +int +EditHistoryListForm::GetItemCount(int groupIndex) +{ + AppLogDebug("EditHistoryListForm::GetItemCount"); + result r = E_FAILURE; + int count = 0; + + if (__pGroupData == null) + { + AppLogDebug("EditHistoryListForm::GetItemCount returning 0"); + return 0; + } + + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + + if (pGroupItemClass == null) + { + AppLogDebug("EditHistoryListForm::GetItemCount returning 0"); + return 0; + } + + + r = HistoryPresentationModel::GetInstance()->GetHistoryCountWithTimeRange(pGroupItemClass->__startTime,pGroupItemClass->__endTime,count); + + if ( r != E_SUCCESS) + { + AppLogDebug("EditHistoryListForm::GetItemCount returning 0"); + return 0; + } + + if (pGroupItemClass->__pData != null) + { + pGroupItemClass->__pData->RemoveAll(true); + delete pGroupItemClass->__pData; + } + pGroupItemClass->__pData = new(std::nothrow) Collection::ArrayList(); + pGroupItemClass->__pData->Construct(); + AppLog("Starttime %ls endtime %ls",pGroupItemClass->__startTime.ToString().GetPointer(),pGroupItemClass->__endTime.ToString().GetPointer()); + HistoryPresentationModel::GetInstance()->GetHistoryWithTimeRange(pGroupItemClass->__startTime,pGroupItemClass->__endTime, 0, count, *pGroupItemClass->__pData); + AppLogDebug("Count = %d ", count); + + if (__pGroupData == null) + { + AppLogDebug("EditHistoryListForm::GetItemCount returning 0"); + return 0; + } + + + + if (pGroupItemClass == null || pGroupItemClass->__pData == null) + { + AppLogDebug("EditHistoryListForm::GetItemCount returning 0"); + return 0; + } + else + { + AppLogDebug("EditHistoryListForm::GetItemCount returning %d for %d title %ls",pGroupItemClass->__pData->GetCount(),groupIndex,pGroupItemClass->__titleText.GetPointer()); + return pGroupItemClass->__pData->GetCount(); + } +} + +void +EditHistoryListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("EditHistoryListForm::OnSceneActivatedN"); + int groupCount = 0; + int count = 0; + + if(__pGroupData != null) + { + groupCount = __pGroupData->GetCount(); + + for(int groupIndex = 0 ; groupIndex < groupCount ; groupIndex ++ ) + { + count = __pListView->GetItemCountAt(groupIndex); + + for(int index = 0 ; index < count ; index++) + { + if(__pListView->IsItemChecked( groupIndex,index ) == true) + { + __pListView->SetItemChecked(groupIndex,index,false); + } + } + } + } + if (__pListView != null) + { + __pListView->UpdateList(); + } + __pSelectAllCheck->SetSelected(false); + + GetFooter()->SetItemEnabled(0, false); + Invalidate(true); +} + +void +EditHistoryListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("EditHistoryListForm::OnSceneDeactivated"); +} + +void +EditHistoryListForm::OnGroupedListViewContextItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListContextItemStatus status) +{ + +} + +void +EditHistoryListForm::OnGroupedListViewItemStateChanged(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + AppLogDebug("EditHistoryListForm::OnGroupedListViewItemStateChanged entered"); + String selectedText = CommonUtil::GetString(L"IDS_COM_OPT_SELECTED"); + bool flag = false; + + if (status == LIST_ITEM_STATUS_UNCHECKED) + { + __selectedCount--; + } + else + { + __selectedCount++; + } + + if (__selectedCount == 0) + { + GetFooter()->SetItemEnabled(0,false); + } + else + { + GetFooter()->SetItemEnabled(0,true); + } + GetFooter()->Invalidate(true); + + selectedText.Append(L"("); + selectedText.Append(__selectedCount); + selectedText.Append(L")"); + + __pSelectedLabel->SetText(selectedText); + __pSelectedLabel->Invalidate(true); + + if (status == LIST_ITEM_STATUS_UNCHECKED) + { + __pSelectAllCheck->SetSelected(false); + } + else if (status == LIST_ITEM_STATUS_CHECKED && __pSelectAllCheck->IsSelected() == false && __pGroupData != null) + { + int itemCount = __pGroupData->GetCount(); + for (int groupIndex = 0 ; groupIndex < itemCount ; groupIndex ++) + { + GroupItemClass* pGClass = (dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex))); + if(pGClass == null) + { + continue; + } + for (int itemIndex = 0 ; itemIndex < pGClass->__pData->GetCount() ; itemIndex ++) + { + bool ret = __pListView->IsItemChecked(groupIndex,itemIndex); + + if (ret == false) + { + __pSelectAllCheck->SetSelected(false); + return; + } + } + } + __pSelectAllCheck->SetSelected(true); + } + +} + +void +EditHistoryListForm::OnGroupedListViewItemSwept(Tizen::Ui::Controls::GroupedListView& listView, int groupIndex, int itemIndex, Tizen::Ui::Controls::SweepDirection direction) +{ + +} + +String +EditHistoryListForm::GetMonth(int month) +{ + String monthValue; + switch (month) + { + case 1: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JAN"));; + break; + case 2: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_FEB"));; + break; + case 3: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_MAR"));; + break; + case 4: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_APR"));; + break; + case 5: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_MAY"));; + break; + case 6: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JUN"));; + break; + case 7: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JUL"));; + break; + case 8: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_AUG"));; + break; + case 9: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_SEP"));; + break; + case 10: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_OCT"));; + break; + case 11: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_NOV"));; + break; + case 12: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_DEC"));; + break; + default: + break; + } + + return monthValue; +} + +void +EditHistoryListForm::CreateGroupItems(void) +{ + AppLogDebug("EditHistoryListForm::createGroupItems entered"); + if (__pGroupData != null) + { + __pGroupData->RemoveAll(true); + delete __pGroupData; + __pGroupData = null; + } + + if (__pGroupData == null) + { + __pGroupData = new(std::nothrow) Collection::ArrayList(); + __pGroupData->Construct(); + } + + DateTime currentTime; + + HistoryPresentationModel::GetCurrentDateTime(currentTime); + GroupItemClass* pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_TODAY"); + pGroupItemClass->__endTime = currentTime; + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + __pGroupData->Add(*pGroupItemClass); + int dayOfWeek = 0; + Calendar* pGregorianCalendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + + if (pGregorianCalendar != NULL) + { + pGregorianCalendar->SetTimeField(TIME_FIELD_YEAR, currentTime.GetYear()); + pGregorianCalendar->SetTimeField(TIME_FIELD_MONTH, currentTime.GetMonth()); + pGregorianCalendar->SetTimeField(TIME_FIELD_DAY_OF_MONTH, currentTime.GetDay()); + dayOfWeek = pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK); + delete pGregorianCalendar; + } + + + switch(dayOfWeek) + { + case SUNDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 6 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case MONDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 7 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case TUESDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 8 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case WEDNESDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 9 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case THURSDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 3 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 10 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case FRIDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_WED"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 3 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 4 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 11 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case SATURDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_THU"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_WED"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 3 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 4 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 5 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 5 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 12 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + default: + break; + } + int day = currentTime.GetDay(); + switch(day/7) + { + case 2: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = L"Two weeks ago"; + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case 3: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = L"Two weeks ago"; + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = L"Three weeks ago"; + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + __pGroupData->Add(*pGroupItemClass); + break; + + case 4: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = L"Two weeks ago"; + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = L"Three weeks ago"; + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__startTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_BR_EARLIER_THIS_MONTH"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + __pGroupData->Add(*pGroupItemClass); + break; + default: + break; + } + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_MONTH"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + pGroupItemClass->__endTime.AddDays(-1); + pGroupItemClass->__startTime.SetValue(currentTime.GetYear(), 1, 1); + pGroupItemClass->__startTime.AddMonths(currentTime.GetMonth() - 1 - 1); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + pGroupItemClass->__titleText = CommonUtil::GetString(L"IDS_BR_BODY_OLDER"); + pGroupItemClass->__endTime.SetValue(currentTime.GetYear(),1, 1); + pGroupItemClass->__endTime.AddMonths(currentTime.GetMonth() - 2); + pGroupItemClass->__endTime.AddDays(-1); + pGroupItemClass->__startTime.SetValue(0, 0, 0); + __pGroupData->Add(*pGroupItemClass); +} + +void EditHistoryListForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + if (__pListView != null) + { + __pListView->UpdateList(); + } +} + +void +EditHistoryListForm::OnTimerExpired(Timer& timer) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if ( pSceneManager != NULL) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } +} diff --git a/src/IntEditHomePageForm.cpp b/src/IntEditHomePageForm.cpp new file mode 100644 index 0000000..c5808fe --- /dev/null +++ b/src/IntEditHomePageForm.cpp @@ -0,0 +1,282 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet EditHomePageForm class +/*@file: EditHomePageForm.h + *@brief: Allow user to set any page as Home page. + * + */ + +#include +#include + +#include "IntBookmarkData.h" +#include "IntCommonLib.h" +#include "IntEditHomePageForm.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" +#include "IntSettingPresentationModel.h" + + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const int EditHomePageForm::IDA_BUTTON_DONE = 101; +const int EditHomePageForm::IDA_BUTTON_CANCEL = 102; + +EditHomePageForm::EditHomePageForm(void) +:__pUrlEditField(null) +, __pMsgBox(null) +, __modalMsgBoxResult(0) +{ + +} + +EditHomePageForm::~EditHomePageForm(void) +{ + +} + +bool +EditHomePageForm::Initialize(void) +{ + Construct(L"IDL_EDIT_HOME_PAGE"); + SetOrientation(ORIENTATION_AUTOMATIC); + return true; +} + +result +EditHomePageForm::OnInitializing(void) +{ + result r = E_SUCCESS; + SetFormBackEventListener(this); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->AddSceneEventListener(IDSCN_EDIT_HOMEPAGE_VIEW, *this); + + GetHeader()->AddActionEventListener(*this); + + __pUrlEditField = static_cast(GetControl(L"IDC_EDITFIELD")); + if (__pUrlEditField != null) + { + __pUrlEditField->AddTextEventListener(*this); + __pUrlEditField->SetOverlayKeypadCommandButtonVisible(false); + } + return r; +} + +result +EditHomePageForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +EditHomePageForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + if (__pUrlEditField != null) + { + String favURL = SettingPresentationModel::GetInstance()->GetFavoriteUrl(); + AppLogDebug("EditHomePageForm::OnSceneActivatedN favURL %ls",favURL.GetPointer()); + __pUrlEditField->SetText(SettingPresentationModel::GetInstance()->GetFavoriteUrl()); + __pUrlEditField->SetFocus(); + __pUrlEditField->SetCursorPosition(__pUrlEditField->GetTextLength()); + __pUrlEditField->ShowKeypad(); + __pUrlEditField->Invalidate(true); + } + + Invalidate(true); + + return; +} + +void +EditHomePageForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + +} + +void +EditHomePageForm::OnFormBackRequested(Form& source) +{ + +} + +void +EditHomePageForm::OnActionPerformed(const Control& source, int actionId) +{ + ArrayList* pArgList = null; + pArgList = new(std::nothrow) ArrayList(); + switch(actionId) + { + case IDA_BUTTON_DONE: + { + pArgList->Add(*new(std::nothrow) String(CommonUtil::GetString(L"IDS_BR_SK_DONE"))); + String urlText = __pUrlEditField->GetText(); + AppLogDebug("set url text is %ls",urlText.GetPointer()); + + bool ret = false; + bool flag = false; + String firstPattern(L"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)"); + String secondPattern(L"^[A-Za-z0-9\.\+-:#@%/;$~?]+\\.[A-Za-z0-9\+-=:#@%/;$~()_?\\\.&]{2,}$"); // URL of type abc.com (i.e without protocol in front of it) + RegularExpression firstRegex; + RegularExpression secondRegex; + + firstRegex.Construct(firstPattern, REGEX_CASELESS); + secondRegex.Construct(secondPattern, REGEX_CASELESS); + + Uri uri; + uri.SetUri(urlText); + urlText = uri.GetEncodedString(); + + // Match + ret = firstRegex.Match(urlText, false); // This returns true value + flag = secondRegex.Match(urlText, false); // Checks whether URL typed is of type abc.com (i.e without protocol in front of it) + + + if (ret == true) + { + //valid Url + SettingPresentationModel::GetInstance()->SetHomepage(urlText); + SettingPresentationModel::GetInstance()->SetFavoriteValue(urlText); + result r = SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(), pArgList); + TryCatch(!IsFailed(r), "EditHomePageForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + } + else + { + if (flag == true) + { + String validUrl; + validUrl = L"http://"; + validUrl.Append(urlText); + // save Url + SettingPresentationModel::GetInstance()->SetHomepage(validUrl); + SettingPresentationModel::GetInstance()->SetFavoriteValue(validUrl); + result r = SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(), pArgList); + TryCatch(!IsFailed(r), "EditHomePageForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + } + else + { + // show pop up , not a valid URL + String msg = CommonUtil::GetString(L"IDS_BR_POP_INVALIDADDRESS"); + CreateMessage(msg); + } + } + + break; + } + case IDA_BUTTON_CANCEL: + { + pArgList->Add(*new(std::nothrow) String(CommonUtil::GetString(L"IDS_BR_SK_CANCEL"))); + result r = SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(), pArgList); + TryCatch(!IsFailed(r), "EditHomePageForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + break; + } + default: + break; + } + + CATCH: + pArgList->RemoveAll(true); + delete pArgList; + return; +} + +void +EditHomePageForm::OnTextValueChanged(const Control& source) +{ + String title ; + Header* pHeader = GetHeader(); + + if (pHeader == NULL) + { + return; + } + + if (__pUrlEditField == NULL) + { + return; + } + + title = __pUrlEditField->GetText(); + title.Trim(); + + // To disable done button when folder title edit-field is empty + if (__pUrlEditField && title.IsEmpty() == true) + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, false); + } + else + { + pHeader->SetButtonEnabled(BUTTON_POSITION_LEFT, true); + } + pHeader->Invalidate(true); + return; +} + +void +EditHomePageForm::OnTextValueChangeCanceled(const Control& source) +{ + return; +} + +void +EditHomePageForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + return; +} + +void +EditHomePageForm::CreateMessage(String& message) +{ + + if (__pMsgBox != null) + { + delete __pMsgBox; + __pMsgBox = null; + __modalMsgBoxResult = 0; + } + + __pMsgBox = new(std::nothrow) MessageBox; + if (__pMsgBox != null) + { + __pMsgBox->Construct(L"", message, MSGBOX_STYLE_OK, 3000); + } + + if (__pMsgBox != null) + { + __pMsgBox->ShowAndWait(__modalMsgBoxResult); + if (__modalMsgBoxResult == MSGBOX_RESULT_OK) + { + if (__pMsgBox != null) + { + delete __pMsgBox; + __pMsgBox = null; + } + } + __modalMsgBoxResult = 0; + } + + return; +} diff --git a/src/IntFaviconManager.cpp b/src/IntFaviconManager.cpp new file mode 100644 index 0000000..6a016a6 --- /dev/null +++ b/src/IntFaviconManager.cpp @@ -0,0 +1,332 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntFaviconManager.cpp + *@brief: Provides functionalities to handle/maintain Browser Favicon. + */ + +#include +#include "IntTypes.h" +#include "IntFaviconManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; + +const wchar_t* FAVICON_DATA_TABLE = L"FaviconData"; +static const wchar_t* IDB_ICON_DEFAULT_FAVICON = L"I01_icon_default_favicon.png"; +FaviconManager* FaviconManager::__pFaviconManagerInstance = null; + +Bitmap* FaviconManager::__pDefaultBitmap = null; + +FaviconManager::FaviconManager(void) +{ + +} + +FaviconManager::~FaviconManager(void) +{ + +} + +FaviconManager::FaviconManager(const FaviconManager& settingModelObj) +{ + +} + +FaviconManager& FaviconManager::operator=(const FaviconManager& settingModelObj) +{ + return *this; +} + +result +FaviconManager::Construct(void) +{ + result r = E_SUCCESS; + r = PresentationModelBase::Initialize(); + TryCatch( !IsFailed(r),,"FaviconManager::Initialize failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +void +FaviconManager::CreateInstance(void) +{ + if (__pFaviconManagerInstance == null) + __pFaviconManagerInstance = new(std::nothrow) FaviconManager(); + result r = __pFaviconManagerInstance->Construct(); + if (IsFailed(r)) + { + delete __pFaviconManagerInstance; + __pFaviconManagerInstance = null; + return; + } + std::atexit(DestroyInstance); + +} + +void FaviconManager::DestroyInstance(void) +{ + if (__pFaviconManagerInstance) + { + delete __pFaviconManagerInstance; + __pFaviconManagerInstance = null; + } +} + + +FaviconManager* +FaviconManager::GetInstance(void) +{ + if (__pFaviconManagerInstance == null) + { + CreateInstance(); + } + return __pFaviconManagerInstance; + +} + + +String +FaviconManager::GenerateFileName(void) +{ + AppRegistry* pAppRegistry = App::GetInstance()->GetAppRegistry(); + String keyCount("FileCount"); + String fileName = UiApp::GetInstance()->GetAppRootPath() + "data/favicons/"; + result r = E_SUCCESS; + int keyValue = 1; + if ( pAppRegistry == NULL ) + { + return NULL; + } + r = pAppRegistry->Get(keyCount, keyValue); + + if (r == E_KEY_NOT_FOUND) + { + keyValue = 1; + pAppRegistry->Add(keyCount, keyValue); + } + else + { + keyValue++; + pAppRegistry->Set(keyCount, keyValue); + } + + fileName.Append(keyValue); + pAppRegistry->Save(); + + return fileName; +} + +void +FaviconManager::SaveBitmapToFile(Bitmap& bitmap, String& filePath) +{ + + result r; + Image image; + + image.Construct(); + r = image.EncodeToFile(bitmap, Tizen::Media::IMG_FORMAT_PNG, filePath, true); + + TryCatch( !IsFailed(r),,"FaviconManager::SaveBitmapToFile %s",GetErrorMessage(r)); + + CATCH: return ; +} + +String +FaviconManager::SaveFavicon(Tizen::Graphics::Bitmap& bitmap, String& url) +{ + AppLogDebug("FaviconManager::SaveFavicon"); + + result r = E_FAILURE; + String faviconTable = FAVICON_DATA_TABLE; + String query; + String columnNames; + String attachment; + int resultCount = -1; + int length = -1; + DateTime dt; + int faviconID = -1; + String faviconId; + String filePath ; + bool nextRowPresent = false; + + columnNames.Append(L"URL, "); + columnNames.Append(L"FILE_PATH"); + + //strQuery.Append(L"SELECT FILE_PATH FROM strFaviconTable WHERE URL= 'strURL'"); + query.Clear(); + //strQuery.Format(MAX_DB_QUERY_SIZE, L"SELECT COUNT(ID) FROM %ls WHERE NOTEBOOK_ID = %ls", strTable.GetPointer(),notebookId.GetPointer()); + query.Append(L"SELECT ID, FILE_PATH FROM "); + query.Append(faviconTable); + query.Append(" WHERE URL LIKE "); + query.Append("'"); + query.Append(url); + query.Append("'"); + r = PresentationModelBase::ExecuteQuery(query, resultCount); + AppLogDebug("FaviconManager: nResultCount %d",resultCount); + + if (resultCount < 1) + { + filePath = GenerateFileName(); + if (url.EndsWith(L".gif")) + { + filePath.Append(L".gif"); + } + else if (url.EndsWith(L".ico")) + { + filePath.Append(L".ico"); + } + else if (url.EndsWith(L".png")) + { + filePath.Append(L".png"); + } + query.Clear(); + //@Append() is replaced with Format() for improving performance + //strQuery.Format(MAX_DB_QUERY_SIZE, L"INSERT INTO %ls(%ls) VALUES('%ls', '%ls', '%ls', %ls, '%ls', '%ls', %d, %d, '%ls')", strNoteTable.GetPointer(),strColumnNames.GetPointer(), note.GetNoteTitle().GetPointer(), notePlaintext.GetPointer(), noteEncodedHtml.GetPointer(), note.GetNotebookId().GetPointer(), dt.ToString().GetPointer(), dt.ToString().GetPointer(), note.IsFavorite(), note.IsLocked(), strAttachment.GetPointer()); + query.Append(L"INSERT INTO "); + query.Append(faviconTable); + query.Append("("); + query.Append(columnNames); + query.Append(") "); + query.Append("VALUES("); + query.Append("'"); + query.Append(url); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(filePath); + query.Append("')"); + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon CommitDb failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::GetLastInsertedId(faviconTable, faviconID); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon GetLastInsertedId failed %s",GetErrorMessage(r)); + + faviconId.Append(faviconID); + + if (faviconId.GetLength() < 0) + { + AppLogDebug("FaviconManager::length is less than 0"); + } + + } + else + { + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon DbIsNextRowPresent failed %s",GetErrorMessage(r)); + + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, faviconID); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon GetColumn failed %s",GetErrorMessage(r)); + + faviconId.Append(faviconID); + + if (faviconId.GetLength() < 0) + { + AppLogDebug("FaviconManager::length is less than 0"); + } + r = PresentationModelBase::GetColumn(1, filePath); + TryCatch( r == E_SUCCESS,,"FaviconManager::SaveFavicon GetColumn failed %s",GetErrorMessage(r)); + } + + } + + SaveBitmapToFile(bitmap,filePath); + AppLogDebug("FaviconManager::SaveFavicon: %ls, %ls , %ls", url.GetPointer(),filePath.GetPointer(), faviconId.GetPointer()); + + CATCH: return faviconId; + } + +Bitmap* +FaviconManager::GetFaviconN(Tizen::Base::String& favicon_Id) +{ + int count = -1; + int length = -1; + String query; + String table = FAVICON_DATA_TABLE; + result r = E_FAILURE; + bool nextRowPresent = false; + String fileName ; + Image image; + Bitmap* pFaviconBitmap = null; + + image.Construct(); + + //query.Format(MAX_DB_QUERY_SIZE, L"SELECT * FROM %ls WHERE NOTEBOOK_ID = %ls", strTable.GetPointer(),notebookId.GetPointer()); + query.Append(L"SELECT FILE_PATH FROM "); + query.Append(table); + query.Append(L" WHERE ID= "); + query.Append("'"); + query.Append(favicon_Id); + query.Append("'"); + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"FaviconManager::GetFavicon ExecuteQuery failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + TryCatch( r == E_SUCCESS,,"FaviconManager::GetFavicon DbIsNextRowPresent failed %s",GetErrorMessage(r)); + + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, fileName); + TryCatch( r == E_SUCCESS,,"FaviconManager::GetFavicon GetColumn failed %s",GetErrorMessage(r)); + + } + + if (fileName.EndsWith(L".gif")) + { + pFaviconBitmap = image.DecodeN(fileName, BITMAP_PIXEL_FORMAT_ARGB8888); + } + else if (fileName.EndsWith(L".ico")) + { + pFaviconBitmap = image.DecodeN(fileName, BITMAP_PIXEL_FORMAT_ARGB8888); + } + else if (fileName.EndsWith(L".png")) + { + pFaviconBitmap = image.DecodeN(fileName, BITMAP_PIXEL_FORMAT_R8G8B8A8); + } + + return pFaviconBitmap; + + CATCH: return null; +} + +Bitmap* +FaviconManager::GetDefaultFaviconN() +{ + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + + if ( pAppResource == NULL ) + { + return null; + } + + __pDefaultBitmap = pAppResource->GetBitmapN(IDB_ICON_DEFAULT_FAVICON); + return __pDefaultBitmap; +} + diff --git a/src/IntFontManager.cpp b/src/IntFontManager.cpp new file mode 100644 index 0000000..1ed8c5c --- /dev/null +++ b/src/IntFontManager.cpp @@ -0,0 +1,170 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntFontManager.cpp + *@brief: This header file contains the definitions of the FontManager class. + */ + +#include "IntFontManager.h" + +using namespace Tizen::Base; +using namespace Tizen::Graphics; + +FontTable fontTable[] = { + //FONT_GT34 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN, 34 + }, + //FONT_GT32 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 32 + }, + //FONT_GT30 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 30 + }, + //FONT_GT26 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 26 + }, + //FONT_GT20 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 20 + }, + //FONT_GT14 + { + NULL, L"Global" /*L"GT_Latin"*/, FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 14 + }, + + //FONT_GP40 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 40 + }, + //FONT_GP38 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 38 + }, + //FONT_GP36 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 36 + }, + //FONT_GP34 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 34 + }, + //FONT_GP30 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 30 + }, + //FONT_GP26 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 26 + }, + //FONT_GP24 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 24 + }, + //FONT_GP18 + { + NULL, L"Global" /*L"GP_Latin"*/, FONT_STYLE_PLAIN, 18 + }, + + //FONT_GS30 + { + NULL, L"Global" /*L"GS_Latin"*/, FONT_STYLE_PLAIN, 30 + }, + //FONT_GS34 + { + NULL, L"Global" /*L"GS_Latin"*/, FONT_STYLE_PLAIN, 34 + }, + + // end of font table ---------- + { + NULL, L"", FONT_STYLE_PLAIN, 0 + } +}; + +void +FontManager::CreateFont(FontId fontValue) +{ + Font* pFont = null; + if (fontValue < 0 || fontValue >= MAX_FONT) + { + return; + } + + if (fontTable[fontValue].pInstance) + { + return; + } + + if (fontTable[fontValue].fontName.GetLength() <= 0) + { + return; + } + + pFont = new(std::nothrow) Font(); + // If pFont is null then return + if (pFont == NULL) + { + return; + } + + pFont->Construct( /*g_FontTable[fontid].fontName,*/ + fontTable[fontValue].fontStyle, + fontTable[fontValue].fontSize); + + fontTable[fontValue].pInstance = pFont; + return; +} + +Font* +FontManager::GetFont(FontId fontValue) +{ + if (fontValue < 0 || fontValue >= MAX_FONT) + { + return NULL; + } + + //Check for the existence of fontValue in fontTable and if its not null then call CreateFont(fontValue) + + if (fontTable[fontValue].pInstance == null) + { + CreateFont(fontValue); + } + + return fontTable[fontValue].pInstance; + +} + +void +FontManager::ReleaseFonts(void) +{ + int maxCount = 0; + + for (maxCount = 0; maxCount < MAX_FONT; maxCount++) + { + //delete if instance exists in fontTable + if (fontTable[maxCount].pInstance) + { + delete fontTable[maxCount].pInstance; + fontTable[maxCount].pInstance = NULL; + } + } + return; +} diff --git a/src/IntFormFactory.cpp b/src/IntFormFactory.cpp new file mode 100644 index 0000000..cdb7498 --- /dev/null +++ b/src/IntFormFactory.cpp @@ -0,0 +1,208 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntFormFactory.cpp + *@brief: FormFactory class helps in creating appropriate forms with a specified form ID. + * It Should be derived from Tizen::Ui::Scenes::IFormFactory class + */ + +#include "IntAddBookmarkForm.h" +#include "IntBookmarkListForm.h" +#include "IntBrightnessForm.h" +#include "IntCreateBookmarkFolderForm.h" +#include "IntEditBookmarkListForm.h" +#include "IntEditHistoryListForm.h" +#include "IntEditHomePageForm.h" +#include "IntHistoryListForm.h" +#include "IntMainForm.h" +#include "IntMultipleWindowForm.h" +#include "IntReaderFontSizeForm.h" +#include "IntFormFactory.h" +#include "IntSettingForm.h" + +using namespace Tizen::Base; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const wchar_t* IDL_FORM_MAIN_VIEW_SCENE = L"FormMainMenu"; +const wchar_t* IDL_FORM_BOOKMARK_LIST_SCENE = L"BooKmarkList"; +const wchar_t* IDL_FORM_HISTORY_LIST_SCENE = L"HistoryList"; +const wchar_t* IDL_FORM_EDIT_HISTORY_LIST_SCENE = L"EditHistoryList"; +const wchar_t* IDL_FORM_SETTINGS_CLEAR_PRIVATE_DATA_SCENE = L"SettingsClearPrivateData"; +const wchar_t* IDL_FORM_MULTIPLE_WINDOW_SCENE = L"MultipleWindow"; +const wchar_t* IDL_FORM_SETTINGS_SCENE = L"Settings"; +const wchar_t* IDL_FORM_ADD_BOOKMARK_SCENE = L"AddBookmark"; +const wchar_t* IDL_FORM_ARTICLE_READER_SCENE = L"ArticleReader"; +const wchar_t* IDL_FORM_EDIT_BOOKMARK_LIST_SCENE = L"EditBookmarkList"; +const wchar_t* IDL_FORM_FIND_WORD_SCENE = L"FindWord"; +const wchar_t* IDL_FORM_CREATE_BOOKMARK_FOLDER_SCENE = L"CreateBookmarkFolder"; +const wchar_t* IDL_FORM_FONT_SIZE_SCENE = L"FontSize"; +const wchar_t* IDL_FORM_EDIT_HOME_PAGE_SCENE = L"EditHomePage"; +const wchar_t* IDL_FORM_BRIGHTNESS_SCENE = L"Brightness"; + +FormFactory::FormFactory(void) +{ + +} + +FormFactory::~FormFactory(void) +{ + +} + +Form* +FormFactory::CreateFormN(const String& formId, const SceneId& sceneId) +{ + AppLog("FormFactory createForm"); + + Tizen::Ui::Controls::Form* pNewForm = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if ( pSceneManager == null) + { + return null; + } + + if (formId.Contains(IDL_FORM_MAIN_VIEW_SCENE) == true) + { + MainForm* pForm = new(std::nothrow) MainForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDL_FORM_BOOKMARK_LIST_SCENE) + { + BookmarkListForm* pForm = new(std::nothrow) BookmarkListForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_HISTORY_LIST_SCENE) + { + HistoryListForm* pForm = new(std::nothrow) HistoryListForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_EDIT_HISTORY_LIST_SCENE) + { + EditHistoryListForm* pForm = new(std::nothrow) EditHistoryListForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + + else if (formId == IDL_FORM_MULTIPLE_WINDOW_SCENE) + { + MultipleWindowForm* pForm = new(std::nothrow) MultipleWindowForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_SETTINGS_SCENE) + { + SettingForm* pForm = new(std::nothrow) SettingForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_ADD_BOOKMARK_SCENE) + { + AddBookmarkForm* pForm = new(std::nothrow) AddBookmarkForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + + else if (formId == IDL_FORM_EDIT_BOOKMARK_LIST_SCENE) + { + EditBookmarkListForm* pForm = new(std::nothrow) EditBookmarkListForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + + else if (formId == IDL_FORM_CREATE_BOOKMARK_FOLDER_SCENE) + { + CreateBookmarkFolderForm* pForm = new(std::nothrow) CreateBookmarkFolderForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + + else if (formId == IDL_FORM_FONT_SIZE_SCENE) + { + ReaderFontSizeForm* pForm = new(std::nothrow) ReaderFontSizeForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_EDIT_HOME_PAGE_SCENE) + { + EditHomePageForm* pForm = new(std::nothrow) EditHomePageForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDL_FORM_BRIGHTNESS_SCENE) + { + BrightnessForm* pForm = new(std::nothrow) BrightnessForm(); + if (pForm == null) + { + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + AppLogDebug("FormFactory createForm exit"); + return pNewForm; +} diff --git a/src/IntHistory.cpp b/src/IntHistory.cpp new file mode 100644 index 0000000..634e369 --- /dev/null +++ b/src/IntHistory.cpp @@ -0,0 +1,210 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntHistory.cpp + *@brief: Used to define History + */ + +#include "IntHistoryData.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::System; +using namespace Tizen::Locales; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +History::History(void) + : __historyId("") + , __historyTitle("") + , __historyUrl("") + , __iconPath("") + ,__bookmarkId(L"") + ,__faviconId(L"") + , __visitedCount(0) + , __pThumbnail(null) + , __thumbnailPath("") +{ + AppLog("History::History(void)"); + __visitedTime.SetValue(0,0,0); +} + +History::History(const History& hs) +{ + AppLog("History::History(const History& hs)"); + __historyId = hs.__historyId; + __historyTitle = hs.__historyTitle; + __historyUrl = hs.__historyUrl; +} + +History::~History(void) +{ + if(__pThumbnail != null) + { + delete __pThumbnail; //TODO To get this reviewed + } + AppLog("History::~History()"); +} + +History& +History::operator =(const History& rhs) +{ + if (this != &rhs) + { + __historyId = rhs.__historyId; + __historyTitle = rhs.__historyTitle; + __historyUrl = rhs.__historyUrl; + } + return *this; +} + +String +History::GetHistoryId(void) const +{ + return __historyId; +} + +String +History::GetHistoryTitle(void) const +{ + return __historyTitle; +} + +String +History::GetHistoryUrl(void) const +{ + return __historyUrl; +} + +DateTime +History::GetVisitedTime(void) const +{ + return __visitedTime; +} + +String +History::GetHistoryIconPath(void) const +{ + return __iconPath; +} + +String +History::GetFaviconId(void) const +{ + return __faviconId; +} + +String +History::GetBookmarkId(void) const +{ + return __bookmarkId; +} + +int +History::GetVisitedCount(void) const +{ + return __visitedCount; +} + +Bitmap* +History::GetThumbnail(void) const +{ + return __pThumbnail; +} + +String +History::GetThumbnailPath(void) const +{ + return __thumbnailPath; +} + +void +History::SetHistoryId(const String& strHistoryId) +{ + __historyId = strHistoryId; + return; +} + +void +History::SetHistoryTitle(String& strHistoryTitle) +{ + strHistoryTitle.Trim(); + __historyTitle = strHistoryTitle; + return; +} + +void +History::SetHistoryUrl(const String& strHistoryUrl) +{ + __historyUrl = strHistoryUrl; + return; +} + +void +History::SetVisitedTime(const DateTime& strVisitedTime) +{ + __visitedTime = strVisitedTime; + return; +} + +void +History::SetIconPath(const String& strFilePath) +{ + __iconPath = strFilePath; + return; +} + +void +History::SetFaviconId(const String& strFaviconId) +{ + __faviconId = strFaviconId; +} + +void +History::SetBookmarkId(const String& bookmarkId) +{ + __bookmarkId = bookmarkId; +} + +void +History::SetVisitedCount(int& visitedCount) +{ + __visitedCount = visitedCount; +} + +void +History::SetThumbnail(Bitmap* thumbnail) +{ + //TODO To get this reviewed + if(__pThumbnail != thumbnail && __pThumbnail != null) { + delete __pThumbnail; + } + __pThumbnail = thumbnail; +} + +void +History::SetThumbnailPath(String& thumbnailPath) +{ + __thumbnailPath = thumbnailPath; +} diff --git a/src/IntHistoryListForm.cpp b/src/IntHistoryListForm.cpp new file mode 100644 index 0000000..94915c3 --- /dev/null +++ b/src/IntHistoryListForm.cpp @@ -0,0 +1,1836 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet HistoryListForm class +/*@file: HistoryListForm.cpp + *@brief: This class defines HistoryListForm used define history + * + */ + +#include +#include +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntFaviconManager.h" +#include "IntHistoryListForm.h" +#include "IntHistoryPresentationModel.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Locales; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const wchar_t* IDB_TAB_ICON_BOOKMARKS = L"I01_tab_icon_bookmarks.png"; +static const wchar_t* IDB_TAB_ICON_HISTORY = L"I01_tab_icon_history.png"; +static const wchar_t* IDB_ICON_BOOKMARK_ON_TEMP = L"I01_icon_bookmark_on_temp.png"; +static const wchar_t* IDB_ICON_BOOKMARK_OFF_TEMP = L"I01_icon_bookmark_off_temp.png"; + + +const int HistoryListForm::IDA_TABBAR_ITEM_1 = 101; +const int HistoryListForm::IDA_TABBAR_ITEM_2 = 102; +const int HistoryListForm::IDA_EDIT_HISTORY_LIST_FORM = 103; +const int HistoryListForm::IDA_FORMAT_ICON = 104; +const int HistoryListForm::IDA_FORMAT_TITLE = 105; +const int HistoryListForm::IDA_FORMAT_URL = 106; +const int HistoryListForm::IDA_FORMAT_BOOKMARK = 107; + + +HistoryListForm::HistoryListForm(void) +{ + __pGroupedListView =null; + __pSearchListView = null; + __pSearchBar = null; + __pGroupData = null; + __pSearchedData = null ; + __searchHistory = false; + __isNoHistoryPresent = true; +} + +HistoryListForm::~HistoryListForm(void) +{ + if (__pGroupData != null) + { + __pGroupData->RemoveAll(true); + delete __pGroupData; + } +} + +bool +HistoryListForm::Initialize(void) +{ + Construct(L"IDL_HISTORY_LIST"); + + return true; +} + +result +HistoryListForm::OnInitializing(void) +{ + AppLog("HistoryListForm::OnInitializing"); + result r = E_SUCCESS; + SceneManager* pSceneManager = null; + HeaderItem bookmark; + HeaderItem history; + Header *pHeader = GetHeader(); + Bitmap *pIconBitmap = null; + AppResource* pAppResource = UiApp::GetInstance()->GetAppResource(); + const Color brown = Color(32, 32, 32, 0xFF); + + // Setup back event listener + SetFormBackEventListener(this); + + GetHeader()->AddActionEventListener(*this); + GetFooter()->AddActionEventListener(*this); + + AddOrientationEventListener(*this); + pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + pSceneManager->AddSceneEventListener(IDSCN_HISTORY_LIST, *this); + } + + if (pAppResource == null) + { + return E_FAILURE; + } + + __pGroupedListView = static_cast< GroupedListView* >(GetControl(L"IDC_GROUPEDLISTVIEW1")); + if (__pGroupedListView == null) + { + return E_FAILURE; + } + r = __pGroupedListView->SetItemProvider(*this); + if (IsFailed(r)) + { + return r; + } + + + __pSearchBar = static_cast< SearchBar* >(GetControl(L"IDC_SEARCHBAR1")); + if (__pSearchBar == null) + { + return E_FAILURE; + } + __pSearchListView = new(std::nothrow) GroupedListView(); + if (__pSearchListView == null) + { + return E_FAILURE; + } + __pGroupedListView->AddGroupedListViewItemEventListener(*this); + r = __pGroupedListView->SetBounds(Rectangle(0,__pGroupedListView->GetY(),GetClientAreaBounds().width,GetClientAreaBounds().height - __pSearchBar->GetHeight() - __pSearchBar->GetY())); + if (IsFailed(r)) + { + return r; + } + r = __pSearchListView->Construct(Rectangle(0,0, GetClientAreaBounds().width, GetClientAreaBounds().height -__pSearchBar->GetHeight() - __pSearchBar->GetY()), GROUPED_LIST_VIEW_STYLE_INDEXED, true, false); + if (IsFailed(r)) + { + return r; + } + r = __pSearchListView->SetItemProvider(*this); + if (IsFailed(r)) + { + return r; + } + r = __pSearchListView->SetTextOfEmptyList(CommonUtil::GetString(L"IDS_BR_BODY_NO_RESULTS_FOUND")); + + if (IsFailed(r)) + { + return r; + } + + __pSearchListView->SetTextColorOfEmptyList(Color::GetColor(COLOR_ID_BLACK)); + __pSearchListView->AddGroupedListViewItemEventListener(*this); + r = __pSearchListView->SetShowState(false); + if (IsFailed(r)) + { + return r; + } + + + __pSearchBar->AddSearchBarEventListener(*this); + __pSearchBar->AddKeypadEventListener(*this); + r = __pSearchBar->SetContent(__pSearchListView); + + if (pHeader != null) + { + pHeader->SetStyle(HEADER_STYLE_TAB); + bookmark.Construct(IDA_TABBAR_ITEM_1); + String strbookmark; + pAppResource->GetString(L"IDS_BR_TAB_BOOKMARKS", strbookmark); + bookmark.SetText(strbookmark); + pIconBitmap = pAppResource->GetBitmapN(IDB_TAB_ICON_BOOKMARKS); + bookmark.SetIcon(HEADER_ITEM_STATUS_NORMAL, pIconBitmap); + bookmark.SetIcon(HEADER_ITEM_STATUS_PRESSED, pIconBitmap); + pHeader->AddItem(bookmark); + + if (pIconBitmap) + { + delete pIconBitmap; + } + + + history.Construct(IDA_TABBAR_ITEM_2); + String strhistory; + pAppResource->GetString(L"IDS_BR_TAB_HISTORY", strhistory); + history.SetText(strhistory); + pIconBitmap = pAppResource->GetBitmapN(IDB_TAB_ICON_HISTORY); + history.SetIcon(HEADER_ITEM_STATUS_NORMAL, pIconBitmap); + history.SetIcon(HEADER_ITEM_STATUS_PRESSED, pIconBitmap); + pHeader->AddItem(history); + pHeader->SetItemSelected(1); + + if (pIconBitmap != NULL) + { + delete pIconBitmap; + } + } + + return r; +} + +result +HistoryListForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + return r; +} + +void +HistoryListForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLog("HistoryListForm::OnActionPerformed"); + result r = E_FAILURE; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + switch (actionId) + { + case IDA_EDIT_HISTORY_LIST_FORM: + { + AppLog("ID_EDIT_HISTORY_LIST_FORM entered"); + r = pSceneManager->GoForward(ForwardSceneTransition(IDSCN_EDIT_HISTORY_LIST, SCENE_TRANSITION_ANIMATION_TYPE_LEFT)); + if (IsFailed(r)) + { + return; + } + } + break; + case IDA_TABBAR_ITEM_1: + { + result r = GetHeader()->SetItemSelected(1); + AppLog("SetItemSelected result %s",GetErrorMessage(r)); + GetHeader()->Invalidate(true); + r = pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + if (IsFailed(r)) + { + return; + } + } + break; + default: + break; + } +} + +void +HistoryListForm::OnFormBackRequested(Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + result r = pSceneManager->GoBackward(BackwardSceneTransition()); + if(IsFailed(r)) + { + AppLogDebug("HistoryListForm::OnFormBackRequested GoForward failed %s",GetErrorMessage(r)); + } +} + +GroupItem* +HistoryListForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + result r = E_FAILURE; + int strMonth = 0; + String text(L""); + DateTime endTime; + DateTime startTime; + int count = 0; + GroupItem* pItem = null; + GroupItemClass* pGroupItemClass = null; + + String weeksAgo2 = L""; + weeksAgo2.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),2); + + String weeksAgo3 = L""; + weeksAgo3.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),3); + + String weeksAgo4 = L""; + weeksAgo4.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),4); + + pItem = new(std::nothrow) GroupItem(); + if (pItem == null) + { + return null; + } + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + + if (pGroupItemClass == null || pGroupItemClass->GetHistoryData() == null || pGroupItemClass->GetHistoryData()->GetCount() == 0) + { + AppLog("CreateGroupItem :: if history is null"); + r = pItem->Construct(Dimension(itemWidth, 0)); + return pItem; + } + else + { + r = pItem->Construct(Dimension(itemWidth, 48)); + } + text = pGroupItemClass->GetTitleText(); + + if (__searchHistory == false) + { + String month = L""; + text.Append(L" ("); + if (pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_COM_BODY_TODAY") || pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY")) + { + int dayOfWeek = 0; + Calendar* pGregorianCalendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + if ( pGregorianCalendar != NULL) + { + r = pGregorianCalendar->SetTimeField(TIME_FIELD_YEAR, pGroupItemClass->GetStartTime().GetYear()); + if (IsFailed(r)) + { + if( pItem != null) + { + delete pItem; + } + delete pGregorianCalendar; + return null; + } + r = pGregorianCalendar->SetTimeField(TIME_FIELD_MONTH, pGroupItemClass->GetStartTime().GetMonth()); + if (IsFailed(r)) + { + if( pItem != null) + { + delete pItem; + } + delete pGregorianCalendar; + return null; + } + r = pGregorianCalendar->SetTimeField(TIME_FIELD_DAY_OF_MONTH, pGroupItemClass->GetStartTime().GetDay()); + if (IsFailed(r)) + { + if( pItem != null) + { + delete pItem; + } + delete pGregorianCalendar; + return null; + } + dayOfWeek = pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK); + + delete pGregorianCalendar; + + } + switch(dayOfWeek) + { + case SUNDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_SUN")); + break; + case MONDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_MON")); + break; + case TUESDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_TUE")); + break; + case WEDNESDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_WED")); + break; + case THURSDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_THU")); + break; + case FRIDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_FRI")); + break; + case SATURDAY: + text.Append(CommonUtil::GetString(L"IDS_COM_BODY_SAT")); + break; + default: + break; + } + text.Append(L", "); + } + + if (pGroupItemClass->GetTitleText() != CommonUtil::GetString(L"IDS_BR_BODY_OLDER")) + { + text.Append(pGroupItemClass->GetStartTime().GetDay()); + text.Append(L". "); + strMonth = pGroupItemClass->GetStartTime().GetMonth(); + month = GetMonth(strMonth); + text.Append(month); + } + else + { + text.Append(L"~ "); + } + + + + if (pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK") || pGroupItemClass->GetTitleText() == weeksAgo2 + || pGroupItemClass->GetTitleText() == weeksAgo3 || pGroupItemClass->GetTitleText() == weeksAgo4 || pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_BR_EARLIER_THIS_MONTH") || pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_MONTH") || pGroupItemClass->GetTitleText() == CommonUtil::GetString(L"IDS_BR_BODY_OLDER")) + { + text.Append(L" - "); + text.Append(pGroupItemClass->GetEndTime().GetDay()); + text.Append(L". "); + strMonth = pGroupItemClass->GetEndTime().GetMonth(); + month = GetMonth(strMonth); + text.Append(month); + } + text.Append(L".)"); + } + + r = pItem->SetElement(text, null); + if (IsFailed(r)) + { + delete pItem; + AppLogDebug("Failed with %s", GetErrorMessage(r)); + return null; + } + r = pItem->SetTextSize(32); + if (IsFailed(r)) + { + delete pItem; + return null; + } + + return pItem; +} + +ListItemBase* +HistoryListForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLog("HistoryListForm::CreateItem"); + result r = E_FAILURE; + History* pHistory = null; + Bitmap* pBitmap = null; + GroupItemClass* pGroupItemClass = null; + CustomItem* pItem = new(std::nothrow) CustomItem(); + int bookmarkBtnWidth = 0; + Bitmap* pBookmarkBitmap = null; + String bitmapId; + + if (pItem == null) + { + return null; + } + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + delete pItem; + return null; + } + pHistory = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(itemIndex)); + if (pHistory == null) + { + delete pItem; + return null; + } + r = pItem->Construct(Dimension(itemWidth, 128), LIST_ANNEX_STYLE_NORMAL); + if (IsFailed(r)) + { + delete pItem; + return null; + } + + bitmapId = pHistory->GetFaviconId() ; + + pBitmap = FaviconManager::GetInstance()->GetFaviconN(bitmapId); + + if (pBitmap == null) + { + pBitmap = FaviconManager::GetInstance()->GetDefaultFaviconN(); + } + if (pBitmap != null) + { + r = pItem->AddElement(Rectangle(16, 28, 72, 72), IDA_FORMAT_ICON, *pBitmap, null); + delete pBitmap; + if (IsFailed(r)) + { + delete pItem; + AppLogException("CreateItem failed with %s", GetErrorMessage(r)); + return null; + } + } + if (pHistory->GetBookmarkId().GetLength()>0) + { + pBookmarkBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_ON_TEMP); + } + else + { + pBookmarkBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_OFF_TEMP); + } + bookmarkBtnWidth = 64; + + + r = pItem->AddElement(Rectangle(104, 10, GetClientAreaBounds().width - 108 - 32 - bookmarkBtnWidth - 32, 60), IDA_FORMAT_TITLE, pHistory->GetHistoryTitle(), 44,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,true); + TryCatch(!IsFailed(r), "CreateItem failed with %s",GetErrorMessage(r)); + + if(__pSearchBar->GetMode() == SEARCH_BAR_MODE_INPUT) + r = pItem->AddElement(Rectangle(104, 70, GetClientAreaBounds().width - 108 - 32 - bookmarkBtnWidth - 32, 48), IDA_FORMAT_URL, pHistory->GetHistoryUrl(),32,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,CUSTOM_COLOR_TRANSPARENT,true); + else + r = pItem->AddElement(Rectangle(104, 70, GetClientAreaBounds().width - 108 - 32 - bookmarkBtnWidth - 32, 48), IDA_FORMAT_URL, pHistory->GetHistoryUrl(),32,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,CUSTOM_COLOR_GREY,true); + TryCatch(!IsFailed(r), "CreateItem failed with %s",GetErrorMessage(r)); + if ( pBookmarkBitmap != null) + { + r = pItem->AddElement(Rectangle(GetClientAreaBounds().width - bookmarkBtnWidth - 16, (128 - pBookmarkBitmap->GetHeight())/2, bookmarkBtnWidth, bookmarkBtnWidth), IDA_FORMAT_BOOKMARK, *pBookmarkBitmap); + TryCatch(!IsFailed(r), "CreateItem failed with %s",GetErrorMessage(r)); + delete pBookmarkBitmap; + } + return pItem; + + CATCH: + delete pItem; + delete pBookmarkBitmap; + return null; +} + +bool +HistoryListForm::DeleteGroupItem(int groupIndex, GroupItem* pItem, int itemWidth) +{ + + // delete pItem; + // pItem = null; + return false; +} + +bool +HistoryListForm::DeleteItem(int groupIndex, int itemIndex, ListItemBase* pItem, int itemWidth) +{ + AppLog("HistoryListForm::DeleteItem"); + result r = E_FAILURE; + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + return false; + } + + // if (pGroupItemClass->__pData != null) + // { + // r = pGroupItemClass->__pData->RemoveAt(itemIndex); + // if (IsFailed(r)) + // { + // return false; + // } + // } + + delete pItem; + pItem = null; + return true; +} + +int +HistoryListForm::GetGroupCount(void) +{ + __isNoHistoryPresent = true; + CreateGroupItems(); + if (__pGroupData != null) + { + if (__searchHistory == false) + { + int count = 0; + HistoryPresentationModel::GetInstance()->GetHistoryCount(count); + if (count == 0) + { + return 0; + } + return __pGroupData->GetCount(); + } + else + { + int count = 0; + String searchText = __pSearchBar->GetText(); + result r = HistoryPresentationModel::GetInstance()->GetSearchHistoryCount(count, searchText); + if(count) + return 1; + else + return 0; + } + } + else + { + return 0; + } +} + +int +HistoryListForm::GetItemCount(int groupIndex) +{ + result r = E_FAILURE; + int count = 0; + DateTime endTime; + DateTime startTime; + String text; + + GroupItemClass* pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + return null; + } + if (__searchHistory == false) + { + startTime = pGroupItemClass->GetStartTime(); + endTime = pGroupItemClass->GetEndTime(); + r = HistoryPresentationModel::GetInstance()->GetHistoryCountWithTimeRange(startTime,endTime,count); + } + else + { + text = __pSearchBar->GetText(); + r = HistoryPresentationModel::GetInstance()->GetSearchHistoryCount(count,text); + if(count == 0) + { + return count; + } + } + if (IsFailed(r)) + { + return 0; + } + + ArrayList* pData = new(std::nothrow) ArrayList(); + if (pData == null) + { + return 0; + } + r = pData->Construct(); + + if (IsFailed(r)) + { + delete pData; + return 0; + } + + if (__searchHistory == false) + { + startTime = pGroupItemClass->GetStartTime(); + endTime = pGroupItemClass->GetEndTime(); + AppLog("Starttime %ls endtime %ls",startTime.ToString().GetPointer(),endTime.ToString().GetPointer()); + r = HistoryPresentationModel::GetInstance()->GetHistoryWithTimeRange(startTime,endTime, 0, count, *pData); + } + else + { + text = __pSearchBar->GetText() ; + r = HistoryPresentationModel::GetInstance()->GetSearchHistory(0, count, *pData,text ); + } + if (IsFailed(r)) + { + delete pData; + return 0; + } + pGroupItemClass->SetHistoryData(pData); + + + if (__isNoHistoryPresent == true && count == 0) + { + __isNoHistoryPresent = true; + GetFooter()->SetItemEnabled(0, false); + } + else + { + __isNoHistoryPresent = false; + GetFooter()->SetItemEnabled(0, true); + } + // pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null || pGroupItemClass->GetHistoryData() == null) + { + delete pData; + return 0; + } + else + { + AppLogDebug("HistoryListForm::GetItemCount returning %d for %d title %ls",pGroupItemClass->GetHistoryData()->GetCount(),groupIndex,pGroupItemClass->GetTitleText().GetPointer()); + return pGroupItemClass->GetHistoryData()->GetCount(); + } +} + +void +HistoryListForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + + GetHeader()->SetItemSelected(1); + + AppLog("HistoryListForm::OnSceneActivatedN called"); + //GetHeader()->Invalidate(true); + if (__pGroupData == null) + { + __pGroupData = new(std::nothrow) ArrayList(); + __pGroupData->Construct(); + } + if (__pGroupedListView != null) + { + __pGroupedListView->UpdateList(); + __pGroupedListView->Invalidate(true); + } + if (__isNoHistoryPresent == true) + { + GetFooter()->SetItemEnabled(0, false); + } + else + { + GetFooter()->SetItemEnabled(0, true); + } + + int count = 0; + HistoryPresentationModel::GetInstance()->GetHistoryCount(count); + if (count == 0) + { + __pSearchBar->SetShowState(false); + __pSearchBar->Invalidate(true); + } + else + { + __pSearchBar->SetShowState(true); + __pSearchBar->Invalidate(true); + } + + // if (__isNoHistoryPresent == true) + // { + // // __pGroupedListView->SetBitmapOfEmptyList(AppResource::GetInstance()->GetBitmapN(L"I01_Nocontents_Bookmarks.png")); + // __pGroupedListView->UpdateList(); + // } + + result r = GetHeader()->SetItemSelected(2); + if (IsFailed(r)) + { + AppLog("HistoryListForm::OnSceneActivatedN header failed %ls", GetErrorMessage(r)); + return; + } + + Invalidate(true); + +} + +void +HistoryListForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLog("HistoryListForm::OnSceneDeactivated"); + __pSearchBar->SetMode(SEARCH_BAR_MODE_NORMAL); +} + +void +HistoryListForm::OnGroupedListViewContextItemStateChanged(GroupedListView& listView, int groupIndex, int itemIndex, int elementId, ListContextItemStatus status) +{ + +} + +void +HistoryListForm::OnGroupedListViewItemStateChanged(GroupedListView& listView, int groupIndex, int itemIndex, int elementId, ListItemStatus status) +{ + GroupItemClass* pGroupItemClass = null; + History* pHistory = null; + AppLog("int groupIndex %d, int itemIndex %d, int elementId %d, ListItemStatus status %d",groupIndex,itemIndex,elementId,status); + if (elementId == IDA_FORMAT_BOOKMARK) + { + String toggledUrl = L""; + AppLog("BookMarkStatusChanged ID_FORMAT_BOOKMARK"); + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + return; + } + pHistory = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(itemIndex)); + if (pHistory == null) + { + return; + } + toggledUrl = pHistory->GetHistoryUrl(); + + AppLog("History's Bookmark ID %ls ToggledUrl %ls",pHistory->GetBookmarkId().GetPointer(),toggledUrl.GetPointer()); + if (pHistory->GetBookmarkId().GetLength() > 0) + { + AppLog("Already added to bookmark so will be removed"); + String bookmarkId = L""; + int id = 0; + + bookmarkId = pHistory->GetBookmarkId(); + Integer::Parse(bookmarkId,id); + BookmarkPresentationModel::GetInstance()->DeleteBookmark(id); + pHistory->SetBookmarkId(L""); + //listView.RefreshList(groupIndex,itemIndex,LIST_REFRESH_TYPE_ITEM_MODIFY); + + for(int grindex = 0 ; grindex < __pGroupData->GetCount() ; grindex++) + { + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(grindex)); + if (pGroupItemClass == null) + { + continue; + } + for(int index = 0 ; index < pGroupItemClass->GetHistoryData()->GetCount() ; index++) + { + pHistory = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(index)); + if (pHistory == null) + { + continue; + } + if (toggledUrl.CompareTo(pHistory->GetHistoryUrl()) == 0) + { + pHistory->SetBookmarkId(L""); + AppLog("Already added to bookmark so will be removed"); + String bookmarkId = L""; + int id = 0; + + bookmarkId = pHistory->GetBookmarkId(); + Integer::Parse(bookmarkId,id); + BookmarkPresentationModel::GetInstance()->DeleteBookmark(id); + pHistory->SetBookmarkId(L""); + //listView.RefreshList(groupIndex,itemIndex,LIST_REFRESH_TYPE_ITEM_MODIFY); + + for(int grindex = 0 ; grindex < __pGroupData->GetCount() ; grindex++) + { + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(grindex)); + if (pGroupItemClass == null) + { + continue; + } + for(int index = 0 ; index < pGroupItemClass->GetHistoryData()->GetCount() ; index++) + { + pHistory = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(index)); + if (pHistory == null) + { + continue; + } + if (toggledUrl.CompareTo(pHistory->GetHistoryUrl()) == 0) + { + pHistory->SetBookmarkId(L""); + //listView.RefreshList(grindex,index,LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + + //listView.RefreshList(grindex,index,LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + listView.UpdateList(); + + } + else + { + AppLog("Adding history to bookmark"); + result r = E_FAILURE; + BookmarkData pBookmark; + + String bookmarkTitle = pHistory->GetHistoryTitle(); + + pBookmark.SetBookmarkTitle(bookmarkTitle); + pBookmark.SetUrl(pHistory->GetHistoryUrl()); + pBookmark.SetFaviconId(pHistory->GetFaviconId()); + + r = BookmarkPresentationModel::GetInstance()->SaveBookmark(pBookmark); + if (!IsFailed(r)) + { + AppLog("History added to bookmark with ID %ls",pBookmark.GetBookmarkId().GetPointer()); + pHistory->SetBookmarkId(pBookmark.GetBookmarkId()); + } + + listView.RefreshList(groupIndex,itemIndex,LIST_REFRESH_TYPE_ITEM_MODIFY); + + for(int grindex = 0 ; grindex < __pGroupData->GetCount() ; grindex++) + { + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(grindex)); + if (pGroupItemClass == null) + { + continue; + } + for(int index = 0 ; index < pGroupItemClass->GetHistoryData()->GetCount() ; index++) + { + pHistory = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(index)); + if (pHistory == null) + { + continue; + } + if (toggledUrl.CompareTo(pHistory->GetHistoryUrl()) == 0) + { + pHistory->SetBookmarkId(pBookmark.GetBookmarkId()); + //listView.RefreshList(grindex,index,LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + listView.UpdateList(); + } + } + else + { + + pGroupItemClass = dynamic_cast< GroupItemClass* >(__pGroupData->GetAt(groupIndex)); + if (pGroupItemClass == null) + { + return; + } + + History* pHistory1 = dynamic_cast< History* >(pGroupItemClass->GetHistoryData()->GetAt(itemIndex)); + if (pHistory1 == null) + { + return; + } + SceneManager* pSceneManager = SceneManager::GetInstance(); + ArrayList *pArgList = null; + result r = E_SUCCESS; + pArgList = new(std::nothrow) ArrayList(); + if (pArgList != null) + { + r = pArgList->Construct(); + if (IsFailed(r)) + { + delete pArgList; + return; + } + + r = pArgList->Add(*MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo()); + r = pArgList->Add(*new(std::nothrow) String(pHistory1->GetHistoryUrl())); + if (IsFailed(r)) + { + delete pArgList; + return; + } + + + } + + String scneId = L""; + MultipleWindowPresentationModel::GetInstance()->GetCurrentSceneId(scneId); + + if (pSceneManager != null) + { + AppLog("pSceneManager exists"); + r = SceneManager::GetInstance()->GoForward(ForwardSceneTransition(scneId), pArgList); + if(pArgList) + { + pArgList->RemoveAll(false); + delete pArgList; + } + if (IsFailed(r)) + { + return; + } + } + } + +} + +void +HistoryListForm::OnGroupedListViewItemSwept(GroupedListView& listView, int groupIndex, int itemIndex, SweepDirection direction) +{ + +} + +void +HistoryListForm::OnSearchBarModeChanged(SearchBar& source, SearchBarMode mode) +{ + result r = E_FAILURE; + if (mode == SEARCH_BAR_MODE_NORMAL) + { + // __pSearchBar->SetMode(SEARCH_BAR_MODE_INPUT); + r = __pSearchListView->SetShowState(false); + if (IsFailed(r)) + { + return; + } + r = __pGroupedListView->SetShowState(true); + if (IsFailed(r)) + { + return; + } + __pSearchListView->SetEnabled(true); + GetFooter()->SetShowState(true); + Invalidate(true); + __searchHistory = false; + r = __pGroupedListView->UpdateList(); + if (__isNoHistoryPresent == true) + { + GetFooter()->SetItemEnabled(0, false); + } + else + { + GetFooter()->SetItemEnabled(0, true); + } + + if (IsFailed(r)) + { + return; + } + } + else + { + // __pSearchListView->SetEnabled(false); + r = __pSearchListView->SetShowState(true); + if (IsFailed(r)) + { + return; + } + __pSearchListView->SetEnabled(false); + r = __pSearchListView->UpdateList(); + if (IsFailed(r)) + { + return; + } + r = __pGroupedListView->SetShowState(false); + if (IsFailed(r)) + { + return; + } + if(__pSearchBar != null) + { + __pSearchBar->SetContentAreaSize(Dimension(__pSearchListView->GetWidth(), __pSearchListView->GetHeight())); + } + Footer* pFooter = GetFooter(); + pFooter->SetShowState(false); + } +} + +String +HistoryListForm::GetMonth(int month) +{ + String monthValue = L""; + switch (month) + { + case JANUARY: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JAN")); + break; + case FEBRUARY: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_FEB")); + break; + case MARCH: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_MAR")); + break; + case APRIL: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_APR")); + break; + case MAY: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_MAY")); + break; + case JUNE: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JUN")); + break; + case JULY: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_JUL")); + break; + case AUGUST: + monthValue.Append(CommonUtil::GetString(L"DS_COM_BODY_AUG")); + break; + case SEPTEMBER: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_SEP")); + break; + case OCTOBER: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_OCT")); + break; + case NOVEMBER: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_NOV")); + break; + case DECEMBER: + monthValue.Append(CommonUtil::GetString(L"IDS_COM_BODY_DEC")); + break; + default: + break; + } + + + return monthValue; +} + +void +HistoryListForm::OnKeypadActionPerformed(Control &source, KeypadAction keypadAction) +{ + result r = E_FAILURE; + if (__pSearchBar != null) + { + __pSearchBar->HideKeypad(); + } + + if (keypadAction == KEYPAD_ACTION_SEARCH) + { + __pSearchListView->SetEnabled(true); + __searchHistory = true; + r = __pGroupedListView->SetShowState(false); + if (IsFailed(r)) + { + return; + } + r = __pSearchListView->SetShowState(true); + if (IsFailed(r)) + { + return; + } + r= __pSearchListView->UpdateList(); + if (__isNoHistoryPresent == true) + { + GetFooter()->SetItemEnabled(0, false); + } + else + { + GetFooter()->SetItemEnabled(0, true); + } + if (IsFailed(r)) + { + return; + } + } + else + { + __searchHistory = false; + } + Invalidate(true); +} + +void +HistoryListForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + result r = E_FAILURE; + if (__pGroupedListView != null) + { + if(__pSearchBar != null &&__pSearchBar->GetShowState()) + r = __pGroupedListView->SetBounds(Rectangle(0,__pSearchBar->GetY() + __pSearchBar->GetHeight()/*72 + 30*/,GetClientAreaBounds().width,GetClientAreaBounds().height - __pSearchBar->GetHeight() - __pSearchBar->GetY())); + else if(__pSearchBar != null) + r = __pGroupedListView->SetBounds(Rectangle(0,0,GetClientAreaBounds().width,GetClientAreaBounds().height - __pSearchBar->GetHeight() - __pSearchBar->GetY())); + if (IsFailed(r)) + { + return; + } + __pGroupedListView->UpdateList(); + + if (__pSearchListView != null) + { + r = __pSearchListView->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, __pGroupedListView->GetHeight())); + if (IsFailed(r)) + { + return; + } + + if ( __searchHistory == false) + { + __pSearchListView->UpdateList(); + } + + if(__pSearchBar != null) + __pSearchBar->SetContentAreaSize(Dimension(__pSearchListView->GetWidth(), __pSearchListView->GetHeight())); + } + + } + + if (__isNoHistoryPresent == true) + { + GetFooter()->SetItemEnabled(0, false); + } + else + { + GetFooter()->SetItemEnabled(0, true); + } +} + +void +HistoryListForm::OnKeypadWillOpen(Control& source) +{ + GetFooter()->SetShowState(false); + __pSearchListView->SetEnabled(false); +} + +void +HistoryListForm::OnKeypadOpened(Control& source) +{ + +} + +void +HistoryListForm::OnKeypadClosed(Control& source) +{ + if ( Clipboard::GetInstance()->IsPopupVisible() == false && __searchHistory == false) + { +// __pSearchBar->SetMode(SEARCH_BAR_MODE_NORMAL); + __pSearchListView->SetEnabled(true); + } + GetFooter()->SetShowState(true); + Invalidate(true); +} + +void +HistoryListForm::CreateGroupItems() +{ + result r = E_FAILURE; + DateTime currentTime; + DateTime dateTime; + GroupItemClass* pGroupItemClass = null; + String titleText; + + String weeksAgo2 = L""; + weeksAgo2.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),2); + + String weeksAgo3 = L""; + weeksAgo3.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),3); + + if (__pGroupData != null) + { + __pGroupData->RemoveAll(true); + delete __pGroupData; + __pGroupData = null; + } + __pGroupData = new(std::nothrow) ArrayList(); + if (__pGroupData == null) + { + return; + } + r = __pGroupData->Construct(); + if (IsFailed(r)) + { + delete __pGroupData; + __pGroupData = null; + return; + } + if (__searchHistory == true) + { + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_BR_BODY_SEARCHED_ITEMS"); + pGroupItemClass->SetTitleText(titleText); + r = __pGroupData->Add(*pGroupItemClass); + if (IsFailed(r)) + { + return; + } + } + else + { + Calendar* pGregorianCalendar = null; + int dayOfWeek = 0; + int day = 0; + HistoryPresentationModel::GetCurrentDateTime(currentTime); + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_TODAY"); + pGroupItemClass->SetTitleText(titleText); + pGroupItemClass->SetEndTime(currentTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + + pGregorianCalendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + if ( pGregorianCalendar != NULL ) + { + pGregorianCalendar->SetTimeField(TIME_FIELD_YEAR, currentTime.GetYear()); + pGregorianCalendar->SetTimeField(TIME_FIELD_MONTH, currentTime.GetMonth()); + pGregorianCalendar->SetTimeField(TIME_FIELD_DAY_OF_MONTH, currentTime.GetDay()); + dayOfWeek = pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK); + delete pGregorianCalendar; + } + switch(dayOfWeek) + { + case SUNDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 6 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case MONDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 7 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case TUESDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 8 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case WEDNESDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 9 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case THURSDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 10 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case FRIDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_WED"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 11 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + case SATURDAY: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_YESTERDAY"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), currentTime.GetDay()); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_THU"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 1 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_WED"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_TUE"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 3 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_COM_BODY_MON"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 4 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 5 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_WEEK"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 5 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 12 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + break; + + default: + break; + } + day = currentTime.GetDay(); + switch(day/7) + { + case 2: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + + pGroupItemClass->SetTitleText(weeksAgo2); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + if (pGroupItemClass->GetStartTime().GetDay() > 1 && pGroupItemClass->GetStartTime().GetDay() < 8) + { + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + String weeksAgo3 = L""; + weeksAgo3.Format(25,CommonUtil::GetString(L"IDS_BR_BODY_PD_WEEKS_AGO").GetPointer(),3); + pGroupItemClass->SetTitleText(weeksAgo3); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + } + break; + case 3: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + pGroupItemClass->SetTitleText(weeksAgo2); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + + pGroupItemClass->SetTitleText(weeksAgo3); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + if (pGroupItemClass->GetStartTime().GetDay() > 1 && pGroupItemClass->GetStartTime().GetDay() < 8) + { + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_BR_EARLIER_THIS_MONTH"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + //dateTime.AddDays(currentTime.GetDay() - 28 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + } + break; + case 4: + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + pGroupItemClass->SetTitleText(weeksAgo2); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 7 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + pGroupItemClass->SetTitleText(weeksAgo3); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 14 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + if (pGroupItemClass->GetStartTime().GetDay() > 1 && pGroupItemClass->GetStartTime().GetDay() < 8) + { + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_BR_EARLIER_THIS_MONTH"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(currentTime.GetDay() - 21 - dayOfWeek + 2 - 1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + //dateTime.AddDays(currentTime.GetDay() - 28 - dayOfWeek + 2 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + } + break; + default: + break; + } + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_EMAIL_BODY_LAST_MONTH"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),currentTime.GetMonth(), 1); + dateTime.AddDays(-1); + pGroupItemClass->SetEndTime(dateTime); + dateTime.SetValue(currentTime.GetYear(), 1, 1); + dateTime.AddMonths(currentTime.GetMonth() - 1 - 1); + pGroupItemClass->SetStartTime(dateTime); + __pGroupData->Add(*pGroupItemClass); + + pGroupItemClass = new(std::nothrow) GroupItemClass(); + if (pGroupItemClass == null) + { + return; + } + titleText = CommonUtil::GetString(L"IDS_BR_BODY_OLDER"); + pGroupItemClass->SetTitleText(titleText); + dateTime.SetValue(currentTime.GetYear(),1, 1); + dateTime.AddMonths(currentTime.GetMonth() - 2); + dateTime.AddDays(-1); + pGroupItemClass->SetEndTime(dateTime); + DateTime dateTime2; + dateTime2.SetValue(0, 0, 0); + pGroupItemClass->SetStartTime(dateTime2); + __pGroupData->Add(*pGroupItemClass); + } +} + +GroupItemClass::GroupItemClass() +{ + __pData = null; +} + +GroupItemClass& +GroupItemClass::operator =(const GroupItemClass& rhs) +{ + if (this != &rhs) + { + __pData = rhs.__pData; + } + return *this; +} + +GroupItemClass::GroupItemClass(const GroupItemClass& groupItem) +{ + __pData = groupItem.__pData; +} + +GroupItemClass::~GroupItemClass() +{ + if (__pData) + { + __pData->RemoveAll(true); + delete __pData; + } +} + +void +GroupItemClass::SetStartTime(DateTime& startTime) +{ + __startTime = startTime; +} + +void +GroupItemClass::SetEndTime(DateTime& endTime) +{ + __endTime = endTime; +} + +void +GroupItemClass::SetTitleText(String& titleText) +{ + __titleText = titleText; +} + +void +GroupItemClass::SetHistoryData(ArrayList* pData) +{ + __pData = pData; +} + +DateTime +GroupItemClass::GetStartTime(void) +{ + return __startTime; +} + +DateTime +GroupItemClass::GetEndTime(void) +{ + return __endTime; +} + +String +GroupItemClass::GetTitleText(void) +{ + return __titleText; +} + +ArrayList* +GroupItemClass::GetHistoryData(void) +{ + return __pData; +} diff --git a/src/IntHistoryPresentationModel.cpp b/src/IntHistoryPresentationModel.cpp new file mode 100644 index 0000000..fa15b99 --- /dev/null +++ b/src/IntHistoryPresentationModel.cpp @@ -0,0 +1,1023 @@ +// + +// Copyright (c) 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://floralicense.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. +// + + +//!Internet +/*@file: IntHistoryPresentationModel.cpp + *@brief: Provides functionalities to handle/maintain Browser History. + */ + +#include +#include "IntHistoryData.h" +#include "IntHistoryPresentationModel.h" +#include "IntTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Locales; +using namespace Tizen::Media; +using namespace Tizen::System; + +extern const wchar_t* HISTORY_DATA_TABLE; +extern const wchar_t* BOOKMARK_URL_TABLE; + +HistoryPresentationModel* HistoryPresentationModel::__pHistoryPresentationModel = null; + +void HistoryPresentationModel::CreateInstance(void) +{ + if (__pHistoryPresentationModel == null) + __pHistoryPresentationModel = new(std::nothrow) HistoryPresentationModel(); + result r = __pHistoryPresentationModel->Construct(); + if (IsFailed(r)) + { + delete __pHistoryPresentationModel; + __pHistoryPresentationModel = null; + return; + } + std::atexit(DestroyInstance); +} + + +HistoryPresentationModel* HistoryPresentationModel::GetInstance(void) +{ + if (__pHistoryPresentationModel == null) + { + CreateInstance(); + } + return __pHistoryPresentationModel; + +} + +void HistoryPresentationModel::DestroyInstance(void) +{ + if (__pHistoryPresentationModel) + { + delete __pHistoryPresentationModel; + __pHistoryPresentationModel = null; + } +} + +HistoryPresentationModel::HistoryPresentationModel(void) +{ + +} + +HistoryPresentationModel::~HistoryPresentationModel(void) +{ + +} + +HistoryPresentationModel::HistoryPresentationModel(const HistoryPresentationModel& historyModelObj) +{ + +} + +HistoryPresentationModel& HistoryPresentationModel::operator=(const HistoryPresentationModel& historyModelObj) +{ + return *this; +} + +result +HistoryPresentationModel::Construct(void) +{ + result r = E_SUCCESS; + r = PresentationModelBase::Initialize(); + TryCatch( !IsFailed(r),,"Failed to initialize HistoryPresentationModel Model %s",GetErrorMessage(r)); + + CATCH: return r; + +} + +result +HistoryPresentationModel::SaveHistory(History& history) +{ + AppLog("HistoryPresentationModel::saveHistory"); + result r = E_FAILURE; + String historyTable(HISTORY_DATA_TABLE); + String query; + String columnNames; + String attachment; + int resultCount = -1; + int rowId = -1; + DateTime date; + String historyId; + int urlCount = 0; + ArrayList* pMostVisitedSites = null; + bool isAlreadyExist = false; + bool isEligibleForMostVisitedSites = true; + int i; + String thumbnailPath; + int todaysCount = 0; + DateTime todayStart; + DateTime todayEnd; + SystemTime::GetCurrentTime(todayStart); + SystemTime::GetCurrentTime(todayEnd); + todayStart.SetValue(todayStart.GetYear(), todayStart.GetMonth(), todayStart.GetDay(), 0,0,0); + todayEnd.SetValue(todayStart.GetYear(), todayStart.GetMonth(), todayStart.GetDay(), 23,59,59); + + ArrayList* pTodaysList = new(std::nothrow) ArrayList(); + pTodaysList->Construct(); + GetHistoryCountWithTimeRange(todayStart, todayEnd, todaysCount); + GetHistoryWithTimeRange(todayStart, todayEnd, 0, todaysCount, *pTodaysList); + + for(int count = 0; count < todaysCount; count++) + { + History *pHistoryItem = dynamic_cast(pTodaysList->GetAt(count)); + if(pHistoryItem != null && pHistoryItem->GetHistoryUrl().CompareTo(history.GetHistoryUrl()) == 0) + { + history.SetHistoryId(pHistoryItem->GetHistoryId()); + break; + } + } + + pMostVisitedSites = new(std::nothrow) ArrayList(); + pMostVisitedSites->Construct(); + String historyTitle = history.GetHistoryTitle(); + historyTitle.Replace(L"'", L"''"); + + String historyUrl = history.GetHistoryUrl(); + historyUrl.Replace(L"'", L"''"); + + PresentationModelBase::GetCurrentDateTime(date); + GetMostVisitedSites(*pMostVisitedSites); + GetUrlCount(historyUrl, urlCount); + for (i = 0; i < pMostVisitedSites->GetCount(); i++) + { + History* pHistory = static_cast< History* >(pMostVisitedSites->GetAt(i)); + if (pHistory != null && pHistory->GetHistoryUrl().CompareTo(historyUrl) == 0) + { + isAlreadyExist = true; + break; + } + if ( pHistory != null && urlCount >= pHistory->GetVisitedCount()) + { + isEligibleForMostVisitedSites = true; + } + else + { + isEligibleForMostVisitedSites = false; + } + } + + if (pMostVisitedSites->GetCount() < 9 || (isAlreadyExist == false && isEligibleForMostVisitedSites == true && history.GetThumbnail() != null)) + { + AppLog("HistoryPresentationModel::SaveHistory coming here"); + + thumbnailPath = GenerateFileName(); + AppLog("generating file path and url %ls, %ls",thumbnailPath.GetPointer(),historyUrl.GetPointer()); + Image* pImage = new(std::nothrow) Image(); + pImage->Construct(); + result r = pImage->EncodeToFile(*history.GetThumbnail(), IMG_FORMAT_JPG, thumbnailPath, true); + delete pImage; + if(IsFailed(r)) + { + AppLogDebug("PresentationModelBase::saveHistory -(%s)\n", GetErrorMessage(r)); + return r; + } + } + delete pMostVisitedSites; + pMostVisitedSites = NULL ; + + if (history.GetHistoryId() == "") + { + columnNames.Append(L"TITLE, "); + columnNames.Append(L"URL, "); + columnNames.Append(L"VISITED_TIME, "); + columnNames.Append(L"ICON_PATH, "); + columnNames.Append(L"FAVICON_ID, "); + columnNames.Append(L"THUMBNAIL_PATH"); + + query.Append(L"INSERT INTO "); + query.Append(historyTable); + query.Append("("); + query.Append(columnNames); + query.Append(") "); + query.Append("VALUES("); + query.Append("'"); + query.Append(historyTitle); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(historyUrl); + query.Append("', "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(date)); + query.Append("'), "); + query.Append("'"); + query.Append(history.GetHistoryIconPath()); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(history.GetFaviconId()); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(thumbnailPath); + query.Append("'"); + query.Append(")"); + } + else + { + query.Append(L"UPDATE "); + query.Append(historyTable); + query.Append(" SET TITLE = "); + query.Append("'"); + query.Append(historyTitle); + query.Append("'"); + query.Append(", URL = "); + query.Append("'"); + query.Append(historyUrl); + query.Append("'"); + query.Append(", VISITED_TIME = "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(date)); + query.Append("')"); + query.Append(", ICON_PATH = "); + query.Append("'"); + query.Append(history.GetHistoryIconPath()); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(history.GetFaviconId()); + query.Append("'"); + query.Append(", "); + query.Append("'"); + query.Append(thumbnailPath); + query.Append("'"); + query.Append(" WHERE ID = "); + query.Append(history.GetHistoryId()); + } + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::SaveHistory query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + r = GetLastInsertedId(historyTable, rowId); + if (IsFailed(r)) + { + AppLogDebug("PresentationModelBase::saveHistory -(%s)\n", GetErrorMessage(r)); + return r; + } + if (rowId < 0) + return E_FAILURE; + + historyId.Append(rowId); + if (historyId.GetLength() < 0) + { + return E_FAILURE; + } + //Set the generated ID to History + history.SetHistoryId(historyId); + + CATCH: return r; +} +result +HistoryPresentationModel::DeleteMultipleHistory(ArrayList* pHistoryIdList) +{ + result r = E_FAILURE; + String query; + String historyTable = HISTORY_DATA_TABLE; + int resultCount = -1; + + if (pHistoryIdList == null) + { + return E_FAILURE; + } + + query.Append(L"DELETE FROM "); + query.Append(historyTable); + query.Append(" WHERE"); + for(int index = 0; index <= pHistoryIdList->GetCount()-2; index++) + { + query.Append(" ID = "); + String* hisId = static_cast(pHistoryIdList->GetAt(index)); + query.Append(*hisId); + query.Append(" OR "); + } + query.Append(" ID = "); + String* hisId = static_cast(pHistoryIdList->GetAt(pHistoryIdList->GetCount()-1)); + if(hisId == null) + { + return E_FAILURE; + } + query.Append(*hisId); + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteHistory GetLastInsertedId failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + CATCH: return r; +} + +result +HistoryPresentationModel::DeleteHistory(const int historyId) +{ + result r = E_FAILURE; + String query; + String historyTable = HISTORY_DATA_TABLE; + int resultCount = -1; + + if (historyId < 1) + { + return E_INVALID_ARG; + } + + query.Append(L"DELETE FROM "); + query.Append(historyTable); + query.Append(" WHERE ID = "); + query.Append(historyId); + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteHistory GetLastInsertedId failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + CATCH: return r; +} + +result +HistoryPresentationModel::DeleteHistory(String& historyUrl) +{ + result r = E_FAILURE; + String query; + String historyTable = HISTORY_DATA_TABLE; + int resultCount = -1; + + query.Append(L"DELETE FROM "); + query.Append(historyTable); + query.Append(" WHERE URL = '"); + query.Append(historyUrl); + query.Append("'"); + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::DeleteHistory GetLastInsertedId failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + CATCH: return r; +} + +result +HistoryPresentationModel::ClearHistory(void) +{ + result r = E_FAILURE; + String query; + String historyTable = HISTORY_DATA_TABLE; + int resultCount = -1; + + query.Append(L"DELETE FROM "); + query.Append(historyTable); + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::ClearHistory GetLastInsertedId failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::CommitDb(); + + CATCH: return r; +} + +result +HistoryPresentationModel::GetHistoryCount(int& historyCount) +{ + int count = -1; + int intVal = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(historyTable); + + r = PresentationModelBase::ExecuteQuery(query, count); + AppLog("the count is %d", count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistoryCount query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r) != null) + return r; + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + if (IsFailed(r) != null) + { + AppLogDebug("Error:PresentationModelBase::GetColumn:%s", GetErrorMessage(r)); + return r; + } + } + historyCount = intVal; + + CATCH: return r; +} + +result +HistoryPresentationModel::GetHistoryCountWithTimeRange(Tizen::Base::DateTime& startTime, Tizen::Base::DateTime& endTime, int& historyCount) +{ + + int count = -1; + int intVal = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(historyTable); + query.Append(" WHERE VISITED_TIME >= "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(startTime)); + query.Append("')"); + query.Append(" AND VISITED_TIME <= "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(endTime)); + query.Append("')"); + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistoryCountWithTimeRange query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r)) + return r; + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + if (IsFailed(r)) + { + AppLogDebug("Error:PresentationModelBase::DbGetColumn:%s", GetErrorMessage(r)); + return r; + } + } + historyCount = intVal; + + CATCH: return r; +} + +result +HistoryPresentationModel::GetHistory(const int startIndex,const int limit, ArrayList& pHistoryList) +{ + + int count = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + + query.Append(L"SELECT"); + query.Append(historyTable); + query.Append(L".*, "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".ID "); + query.Append(L"FROM "); + query.Append(historyTable); + query.Append(L", "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L" WHERE "); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(L"IN"); + query.Append(L"("); + query.Append(L"SELECT"); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(L"FROM "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L" LEFT JOIN "); + query.Append(historyTable); + query.Append(L"ON"); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".URL = "); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(" ORDER BY"); + query.Append(historyTable); + query.Append(L".VISITED_TIME DESC"); + query.Append(")"); + query.Append(" GROUP BY "); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(" ORDER BY"); + query.Append(L"COUNT("); + query.Append(historyTable); + query.Append(L".URL) DESC "); + + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistory query failed %s",GetErrorMessage(r)); + + r = CreateHistoryList(count, pHistoryList); + if (IsFailed(r)) + { + AppLogDebug("Error:CreateNoteList:failed:%s", GetErrorMessage(r)); + } + CATCH: return r; +} + +result +HistoryPresentationModel::CreateHistoryList(int historyCount, ArrayList& historyList, int maxCount) +{ + + History* pHistory = null; + int intVal = -1; + String stringVal; + DateTime dateVal; + result r = E_FAILURE; + String historyId; + String faviconId; + String bookmarkId; + int visitedCount; + DateTime visitedTime; + String iconPath; + String thumbnailPath; + bool nextRowPresent = false; + Image image; + Bitmap* pThumnailBitmap = null; + + image.Construct(); + if (historyCount < 1) + { + return E_SUCCESS; + } + + for (int Count = 0; (maxCount == -1 && Count < historyCount ) || (maxCount != -1 && Count < maxCount && Count < historyCount); Count++) + { + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r)) + { + return E_SUCCESS; + } + if (nextRowPresent == true) + { + pHistory = new(std::nothrow) History; + if (pHistory) + { + for (int columnCount = 0; columnCount < MAX_NOTE_TABLE_COLUMN; columnCount++) + { + + switch (columnCount) + { + case HISTORY_ID: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + historyId.Clear(); + historyId.Append(intVal); + if (historyId.GetLength() > 0) + { + pHistory->SetHistoryId(historyId); + } + } + + } + break; + + case HISTORY_TITLE: + r = PresentationModelBase::GetColumn(columnCount, stringVal); + if (!IsFailed(r)) + { + pHistory->SetHistoryTitle(stringVal); + } + break; + + case HISTORY_URL: + r = PresentationModelBase::GetColumn(columnCount, stringVal); + if (!IsFailed(r)) + { + pHistory->SetHistoryUrl(stringVal); + } + break; + + case HISTORY_VISITED_TIME: + r = PresentationModelBase::GetColumn(columnCount, dateVal); + if (!IsFailed(r)) + { + visitedTime = dateVal; + pHistory->SetVisitedTime(visitedTime); + } + break; + + case HISTORY_ICON_PATH: + r = PresentationModelBase::GetColumn(columnCount, stringVal); + if (!IsFailed(r)) + { + iconPath = stringVal; + pHistory->SetIconPath(iconPath); + } + break; + + case HISTORY_FAVICONID: + + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal >= 0) + { + faviconId.Clear(); + faviconId.Append(intVal); + if (faviconId.GetLength() > 0) + { + pHistory->SetFaviconId(faviconId); + } + } + } + break; + case HISTORY_THUMBNAIL: + r = PresentationModelBase::GetColumn(columnCount, stringVal); + if (!IsFailed(r)) + { + + thumbnailPath = stringVal; + pThumnailBitmap = image.DecodeN(thumbnailPath, BITMAP_PIXEL_FORMAT_RGB565); + if (pThumnailBitmap != null) + { + pHistory->SetThumbnail(pThumnailBitmap); + pHistory->SetThumbnailPath(thumbnailPath); + } + } + break; + case HISTORY_BOOKMARK_ID: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + bookmarkId.Clear(); + bookmarkId.Append(intVal); + if (bookmarkId.GetLength() > 0) + { + pHistory->SetBookmarkId(bookmarkId); + } + } + + } + break; + case HISTORY_VISITED_COUNT: + r = PresentationModelBase::GetColumn(columnCount, intVal); + if (!IsFailed(r)) + { + if (intVal > 0) + { + pHistory->SetVisitedCount(intVal); + + } + + } + break; + + default: + break; + } + + } + r = historyList.Add(*pHistory); + + if (IsFailed(r)) + { + delete pHistory; + return r; + } + } + } + } + return E_SUCCESS; +} + +result +HistoryPresentationModel::GetSearchHistory(const int startIndex,const int limit, ArrayList& pHistoryList, String& text) +{ + text.Replace(L"'", L"''"); + + int count = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + + query.Append(L"SELECT "); + query.Append(historyTable); + query.Append(L".*, "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".ID "); + query.Append(L"FROM "); + query.Append(historyTable); + query.Append(L" LEFT JOIN "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L" ON "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".URL = "); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(L" WHERE ("); + query.Append(historyTable); + query.Append(L".TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + query.Append(" OR "); + query.Append(L"("); + query.Append(historyTable); + query.Append(L".URL LIKE '%"); + query.Append(text); + query.Append("%')"); + query.Append(" ORDER BY VISITED_TIME DESC"); + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = HistoryPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchHistory query failed %s",GetErrorMessage(r)); + + r = CreateHistoryList(count, pHistoryList); + if (IsFailed(r)) + { + AppLogDebug("Error:CreateNoteList:failed:%s", GetErrorMessage(r)); + } + CATCH: return r; +} + +result +HistoryPresentationModel::GetSearchHistoryCount(int& historyCount, String& text) +{ + int count = -1; + int intVal = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + text.Replace(L"'", L"''"); + query.Append(L"SELECT COUNT(ID) FROM "); + query.Append(historyTable); + query.Append(L" WHERE (TITLE LIKE '%"); + query.Append(text); + query.Append("%')"); + query.Append(" OR "); + query.Append(L"(URL LIKE '%"); + query.Append(text); + query.Append("%')"); + + r = HistoryPresentationModel::ExecuteQuery(query, count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetSearchHistoryCount query failed %s",GetErrorMessage(r)); + + r = HistoryPresentationModel::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r) != null) + return r; + if (nextRowPresent == true) + { + r = HistoryPresentationModel::GetColumn(0, intVal); + if (IsFailed(r) != null) + { + AppLogDebug("Error:HistoryPresentationModel::DbGetColumn:%s", GetErrorMessage(r)); + return r; + } + } + historyCount = intVal; + + CATCH: return r; +} + +result +HistoryPresentationModel::GetHistoryWithTimeRange(Tizen::Base::DateTime& startTime, Tizen::Base::DateTime& endTime,const int startIndex,const int limit, ArrayList& pHistoryList) +{ + int count = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + + query.Append(L"SELECT "); + query.Append(historyTable); + query.Append(L".*, "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".ID "); + query.Append(L"FROM "); + query.Append(historyTable); + query.Append(L" LEFT JOIN "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L" ON "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L".URL = "); + query.Append(historyTable); + query.Append(L".URL "); + query.Append(" WHERE "); + query.Append(historyTable); + query.Append(L".VISITED_TIME >= "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(startTime)); + query.Append("')"); + query.Append(" AND "); + query.Append(historyTable); + query.Append(L".VISITED_TIME <= "); + query.Append("DateTime("); + query.Append("'"); + query.Append(GetStringFromDate(endTime)); + query.Append("')"); + query.Append(" ORDER BY VISITED_TIME DESC"); + + //Append LIMIT + if (limit > 0) + { + query.Append(" LIMIT "); + query.Append(limit); + + //Append OFFESET + if (startIndex >= 0) + { + query.Append(" OFFSET "); + query.Append(startIndex); + } + } + + r = HistoryPresentationModel::ExecuteQuery(query, count); + AppLog("the count is %d",count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistoryWithTimeRange query failed %s",GetErrorMessage(r)); + + r = CreateHistoryList(count, pHistoryList); + if (IsFailed(r)) + { + AppLogDebug("Error:CreateNoteList:failed:%s", GetErrorMessage(r)); + } + + CATCH: return r; +} + +result +HistoryPresentationModel::GetMostVisitedSites(ArrayList& pHistoryList) +{ + + int count = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + + + //query = L"SELECT *, COUNT(URL) AS NOS FROM HistoryData GROUP BY URL ORDER BY NOS DESC"; + query = L"SELECT HistoryData.*, Bookmark.ID, COUNT(HistoryData.URL) AS NOS FROM HistoryData LEFT JOIN Bookmark ON Bookmark.URL = HistoryData.URL WHERE HistoryData.URL != '' GROUP BY HistoryData.URL ORDER BY NOS DESC"; + + r = HistoryPresentationModel::ExecuteQuery(query, count); + AppLog("the count is %d",count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistoryWithTimeRange query failed %s",GetErrorMessage(r)); + + r = CreateHistoryList(count, pHistoryList, 9); + if (IsFailed(r)) + { + AppLogDebug("Error:CreateNoteList:failed:%s", GetErrorMessage(r)); + } + + CATCH: return r; +} + +result +HistoryPresentationModel::GetUrlCount(const String& Url, int& historyCount) +{ + int count = -1; + int intVal = -1; + String query; + String historyTable(HISTORY_DATA_TABLE); + result r = E_FAILURE; + bool nextRowPresent = false; + + query.Append(L"SELECT COUNT(URL) FROM "); + query.Append(historyTable); + query.Append(L" WHERE URL = "); + query.Append("'"); + query.Append(Url); + query.Append("'"); + + r = PresentationModelBase::ExecuteQuery(query, count); + AppLog("the count is %d", count); + TryCatch( r == E_SUCCESS,,"BookmarkPresentationModel::GetHistoryCount query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowPresent); + if (IsFailed(r)) + return r; + if (nextRowPresent == true) + { + r = PresentationModelBase::GetColumn(0, intVal); + if (IsFailed(r)) + { + AppLogDebug("Error:PresentationModelBase::GetColumn:%s", GetErrorMessage(r)); + return r; + } + } + historyCount = intVal; + + CATCH: return r; +} + +String +HistoryPresentationModel::GenerateFileName(void) +{ + AppRegistry* pAppRegistry = App::GetInstance()->GetAppRegistry(); + if ( pAppRegistry == NULL ) + { + return NULL ; + } + String keyCount("ThumbnailCount"); + String fileName = UiApp::GetInstance()->GetAppRootPath() + "/data/Thumbnail/thumbnails"; + result r = E_SUCCESS; + int keyValue = 1; + r = pAppRegistry->Get(keyCount, keyValue); + + if (r == E_KEY_NOT_FOUND) + { + keyValue = 1; + pAppRegistry->Add(keyCount, keyValue); + } + else + { + keyValue++; + pAppRegistry->Set(keyCount, keyValue); + } + + fileName.Append(keyValue); + fileName.Append(".jpg"); + pAppRegistry->Save(); + + return fileName; +} + +String +HistoryPresentationModel::GetStringFromDate(DateTime& date) +{ + String dateFormat = L""; + dateFormat.Append(date.GetYear()); + dateFormat.Append('-'); + if(date.GetMonth() < 10) + { + dateFormat.Append('0'); + } + dateFormat.Append(date.GetMonth()); + dateFormat.Append('-'); + if(date.GetDay() < 10) + { + dateFormat.Append('0'); + } + dateFormat.Append(date.GetDay()); + dateFormat.Append(' '); + if(date.GetHour() < 10) + { + dateFormat.Append('0'); + } + dateFormat.Append(date.GetHour()); + dateFormat.Append(':'); + if(date.GetMinute() < 10) + { + dateFormat.Append('0'); + } + dateFormat.Append(date.GetMinute()); + dateFormat.Append(':'); + if(date.GetSecond() < 10) + { + dateFormat.Append('0'); + } + dateFormat.Append(date.GetSecond()); + return dateFormat; +} diff --git a/src/IntInternetApp.cpp b/src/IntInternetApp.cpp new file mode 100644 index 0000000..87683e9 --- /dev/null +++ b/src/IntInternetApp.cpp @@ -0,0 +1,312 @@ +// + +// Copyright (c) 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. +// + +//!Internet +/*@file: Internet.cpp + *@brief: provides basic features necessary to define an UiApp. + */ + +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntFaviconManager.h" +#include "IntHistoryPresentationModel.h" +#include "IntInternetApp.h" +#include "IntMainFrame.h" +#include "IntMainForm.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" +#include "IntSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +InternetApp::InternetApp(void) +: __pMultiWindowManager(NULL),__pNewWindowInfo(null) +{ + +} + +InternetApp::~InternetApp(void) +{ + if (__pNewWindowInfo != NULL) + { + delete __pNewWindowInfo; + __pNewWindowInfo = NULL; + } +} + +UiApp* +InternetApp::CreateInstance(void) +{ + // Create the instance through the constructor. + return new(std::nothrow) InternetApp(); +} + +void +InternetApp::ShowPopup(String& pTitle, String& pText) +{ + MessageBox messageBox; + messageBox.Construct(pTitle, pText,MSGBOX_STYLE_OK,3000); + int modalResult = 0; + + messageBox.ShowAndWait(modalResult); + switch (modalResult) + { + case MSGBOX_RESULT_OK: + { + + } + break; + default: + break; + } +} + +bool +InternetApp::OnAppInitializing(AppRegistry& appRegistry) +{ + AppLog("ABC::Internet::OnAppInitializing entered"); + AppControlProviderManager* pAppMgr = AppControlProviderManager::GetInstance(); + if (pAppMgr != null) + { + result r = pAppMgr->SetAppControlProviderEventListener(this); + AppLogDebug("SetAppControlProviderEventListener result %s",GetErrorMessage(r)); + } + return true; +} + +bool +InternetApp::OnAppInitialized(void) +{ + result r = E_SUCCESS; + + String title1 = L"URL1"; + String title2 = L"URL2"; + String folder1 = L"Folder 1"; + String strSite1 = "Site 1"; + + BookmarkPresentationModel::GetInstance(); + HistoryPresentationModel::GetInstance(); + FaviconManager::GetInstance(); + SettingPresentationModel::GetInstance(); + +// MultipleWindowPresentationModel::GetInstance(); + + __pMultiWindowManager = MultipleWindowPresentationModel::GetInstance(); + AppLogDebug("window count %d",__pMultiWindowManager->GetAllWindowArrayList()->GetCount()); + + // Goto the first scene. + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + AppLogDebug("pSceneManager is null returning"); + return false; + } + // Create a Frame + MainFrame* pSceneManagementFrame = new(std::nothrow) MainFrame(); + pSceneManagementFrame->Construct(); + pSceneManagementFrame->SetName(L"SceneManagement"); + AddFrame(*pSceneManagementFrame); + + String homePage = SettingPresentationModel::GetInstance()->GetHomepage(); + if (homePage == CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES") || homePage == CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")) + { + homePage = L""; + } + else if (homePage == CommonUtil::GetString(L"IDS_BR_BODY_USER_HOMEPAGE")) + { + AppLog("InternetApp::OnAppInitialized homaepage = userhomepage"); + homePage = SettingPresentationModel::GetInstance()->GetFavoriteUrl(); + AppLog("InternetApp::OnAppInitialized fav URL = %ls ",homePage.GetPointer()); + } + + if (__pNewWindowInfo == null)//if the application is launched normally + { + __pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(homePage); + } + + if (__pNewWindowInfo == null) + { + return false; + } + + ArrayList* pArgList = new(std::nothrow) ArrayList(); + pArgList->Construct(); + pArgList->Add(*__pNewWindowInfo); + /* + * The GoForward call cannot be moved into the MainFrame::OnInitializing + * because when the application is launched from the appcontol, the data(URL) + * is not available for Mainframe, and we cannot pass the url information to + * the Mainframe because logically MainFrame should not know the URL information. + */ + if (E_SUCCESS != pSceneManager->GoForward(ForwardSceneTransition(__pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList)) + { + AppLogDebug("CustomAppControl::OnAppInitializing Result = %s", GetLastResult()); + delete pArgList; + __pNewWindowInfo = null; + return false; + } + + delete pArgList; + pArgList = null; + __pNewWindowInfo = null; + + return true; +} + +bool +InternetApp::OnAppWillTerminate(void) +{ + return true; +} + + +bool +InternetApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + AppLogDebug("Internet::OnAppTerminating"); + + return true; +} + +void +InternetApp::OnForeground(void) +{ + +} + +void +InternetApp::OnBackground(void) +{ + +} + +void +InternetApp::OnLowMemory(void) +{ + +} + +void +InternetApp::OnBatteryLevelChanged(BatteryLevel batteryLevel) +{ + +} + +void +InternetApp::OnScreenOn(void) +{ + +} + +void +InternetApp::OnScreenOff(void) +{ + // TODO: + // Unless there is a strong reason to do otherwise, release resources (such as 3D, media, and sensors) to allow the device + // to enter the sleep mode to save the battery. + // Invoking a lengthy asynchronous method within this listener method can be risky, because it is not guaranteed to invoke a + // callback before the device enters the sleep mode. + // Similarly, do not perform lengthy operations in this listener method. Any operation must be a quick one. +} +void +InternetApp::OnAppControlRequestReceived(RequestId reqId, const String &operationId, const String* pUriScheme, const String *pDataType, const IMap *pArgs) +{ + AppLogDebug("ABC::Internet::OnAppControlRequestReceivedN entered %ls",operationId.GetPointer()); + + if (operationId.CompareTo(L"http://tizen.org/appcontrol/operation/view") == 0) + { + String urlData; + if (pUriScheme) + { + urlData = *pUriScheme; + } + else + { + int argCount = pArgs->GetCount(); + AppLog("argCount == %d", argCount); + + IList *pValues = pArgs->GetValuesN(); + if(pValues == null) + { + AppLog("pValues == null"); + return; + } + + String url = L"url"; + String* pUrl = dynamic_cast(const_cast(pArgs->GetValue(url))); + if(pUrl == null) + { + delete pValues; + AppLog("pUrl == null"); + return; + } + urlData = *pUrl; + } + AppLog("URL received %ls", urlData.GetPointer()); + + if (__pNewWindowInfo == null) + { + __pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(urlData, true); + } + if (__pNewWindowInfo == null) + { + if (MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList()->GetCount() >= 9) + { + String strTitle = L"Maximum Limit Reached"; + String strText = L"cannot open more than 9 windows"; + ShowPopup(strTitle, strText); + } + return; + } + if (__pMultiWindowManager != null && __pMultiWindowManager->GetAllWindowArrayList()->GetCount() != 0) + { + //if the application is running in background and it receives an appcontrol request it will launch a new(std::nothrow) window here, + //otherwise appcontrol request will be handled by OnAppInitialized method + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + + ArrayList* pArgList = new(std::nothrow) ArrayList(); + pArgList->Construct(); + pArgList->Add(*__pNewWindowInfo); + + if (E_SUCCESS != pSceneManager->GoForward(ForwardSceneTransition(__pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList)) + { + AppLogDebug("CustomAppControl::OnAppInitializing Result = %s", GetLastResult()); + delete pArgList; + __pNewWindowInfo = null; + return; + } + + delete pArgList; + + __pNewWindowInfo = null; + } + } + AppLogDebug("ABC::Internet::OnAppControlRequestReceivedN Exit"); + return; +} + diff --git a/src/IntInternetEntry.cpp b/src/IntInternetEntry.cpp new file mode 100644 index 0000000..f4ec79e --- /dev/null +++ b/src/IntInternetEntry.cpp @@ -0,0 +1,72 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +/** + * This file contains the Tizen application entry point. + */ +#include "IntInternetApp.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +_EXPORT_ int OspMain(int argc, char* pArgv[]); +#ifdef _PROFILE +extern void start_profile(void); +extern void end_profile(void); +#else +#define start_profile() +#define end_profile() +#endif + +/** + * The entry function of Tizen application called by the operating system. + */ +int +OspMain(int argc, char* pArgv[]) +{ + result r = E_SUCCESS; + + AppLogDebug("Application started."); + ArrayList* pArgs = new(std::nothrow) ArrayList(); + pArgs->Construct(); + for (int i = 0; i < argc; i++) + pArgs->Add(*(new(std::nothrow) String(pArgv[i]))); + + start_profile(); + r = Tizen::App::UiApp::Execute(InternetApp::CreateInstance, pArgs); + if (IsFailed(r)) + { + AppLogException("Application execution failed-[%s].", GetErrorMessage(r)); + r &= 0x0000FFFF; + } + end_profile(); + + pArgs->RemoveAll(true); + delete pArgs; + pArgs = null; + AppLogDebug("Application finished."); + + return static_cast< int >(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/src/IntMainForm.cpp b/src/IntMainForm.cpp new file mode 100644 index 0000000..fd019da --- /dev/null +++ b/src/IntMainForm.cpp @@ -0,0 +1,3572 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet MainForm class +/*@file: MainForm.cpp + *@brief: The %MainForm provides the common functionalities for the Main View of the Browser including the addressbar, + * loading,handling events etc. + */ + +#include +#include +#include +#include +#include + +#include "IntBookmarkData.h" +#include "IntBookmarkPresentationModel.h" +#include "IntCommonLib.h" +#include "IntFaviconManager.h" +#include "IntMainForm.h" +#include "IntNotificationPanel.h" +#include "IntSceneRegister.h" +#include "IntSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Utility; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Locales; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Content; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::System; +using namespace Tizen::Web; +using namespace Tizen::Web::Controls; + +static const wchar_t* IDB_BTN_BACK = L"I01_icon_Back.png"; +static const wchar_t* IDB_BTN_BACK_PRESS = L"I01_icon_Back_press.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_BOOKMARK = L"I01_search_list_icon_favorite.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_BOOKMARK_PRESS = L"I01_search_list_icon_favorite_press.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_MORE = L"I01_icon_more.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_MORE_PRESS = L"I01_icon_more_press.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_NEW_WINDOW = L"I01_icon_plus.png"; +static const wchar_t* IDB_CONTRLBAR_ICON_NEW_WINDOW_PRESS = L"I01_icon_plus_press.png"; +static const wchar_t* IDB_CONTROLBAR_ICON_CREATE_DISABLE = L"I01_controlbar_icon_create_disable.png"; +static const wchar_t* IDB_BUTTON_ON = L"00_button_on.png"; +static const wchar_t* IDB_BUTTON_OFF = L"00_button_off.png"; +static const wchar_t* IDB_ICON_BOOKMARK_OFF_TEMP = L"I01_icon_bookmark_off_temp.png"; +static const wchar_t* IDB_ICON_BOOKMARK_ON_TEMP = L"I01_icon_bookmark_on_temp.png"; + +const int IDA_BACKBTN_CLICKED = 101; +const int IDA_BOOKMARKBTN_CLICKED = 102; +const int IDA_MOREBTN_CLICKED = 103; +const int IDA_MULTIWINDOWBTN_CLICKED = 104; +const int IDA_NEWWINDOWBTN_CLICKED = 105; +const int IDA_FORWARD_CLICKED = 106; +const int IDA_ADDTOBOOKMARK_CLICKED = 107; +const int IDA_SHARE_CLICKED = 108; +const int IDA_FINDONPAGE_CLICKED = 109; +const int IDA_PRIVATEON_CLICKED = 110; +const int IDA_SETTINGS_CLICKED = 111; +const int IDA_READER_CLOSE_CLICKED = 112; +const int IDA_SMALLFONT_BTN_CLICKED = 113; +const int IDA_LARGEFONT_BTN_CLICKED = 114; +const int IDA_BRIGHTNESS_BTN_CLICKED = 115; +const int IDA_FINDWORD_SEARCH_CLICKED = 201; +const int IDA_FINDWORD_NEXT_CLICKED = 202; +const int IDA_FINDWORD_PREV_CLICKED = 203; +const int IDA_FINDWORD_CLEAR_CLICKED = 204; +const int IDA_FINDWORD_CANCEL_CLICKED = 205; + +const int IDA_COPY_IMAGE_CLICKED = 206; +const int IDA_VIEW_IMAGE_CLICKED = 207; +const int IDA_SAVE_IMAGE_CLICKED = 208; +const int IDA_SHARE_IMAGE_CLICKED = 209; + +const int IDA_COPY_TEXT_CLICKED = 210; +const int IDA_PASTE_TEXT_CLICKED = 211; +const int IDA_FIND_TEXT__CLICKED = 212; +const int IDA_SHARE_TEXT_CLICKED = 213; +const int DEFAULT_PROGRESS_PERCENTAGE = 10; + +const int MainForm::IDA_FORMAT_BITMAP = 500; +const int MainForm::IDA_FORMAT_DELETE_BITMAP = 501; +const int MainForm::IDA_FORMAT_TITLE_STRING = 502; +const int MainForm::IDA_FORMAT_URL_STRING = 503; +const int MainForm::IDA_CONTEXT_ITEM_DELETE = 504; + +MainForm::MainForm(void) +{ + __pAddressbar = null; + // __pMostVisitedSitesPanel = null; + __pMostVisitedListView = null; + __pFooterPanel = null; + __pHitElementResult = null; + __pWindowInfo = null; + __pWebViewer = null; + __pImageMenu = null; + __pMenu = null; + __pFindWordControl = null; + __pFindWordPanel = null; + __pFindWordBgLabel = null; + __pFindWordEditField = null; + __pFindWordClear = null; + __pFindWordCountLabel = null; + __pFindWordNext = null; + __pFindWordPrev = null; + __previousZoomLevel = 1.0; + __pSaveImage = null; + __currentSearchStr = L""; + __currentSelectedStr = L""; + __maxOccurrances = 0; + __currentWordIndex = 0; + __distanceMoved = 0; + __isLoaded = false; + __inputEventToBeSupressed = false; + __touchPoint1 = Point(-1,-1); + __touchPoint2 = Point(-1,-1); + __pWebReader = null; + // __pReaderPopup = null; + __pReaderData = null; + __pPopUp = null; + __pReaderCloseBtn = null; + __pNewWindowButton = null; + __pMoreButton = null; + __pMultiWindowButton = null; + __pArticleReaderPanel = null; + __pBlankPanel = null; + __pArticleReaderLabel = null; + __webControlHeight = 0; + __prevAddressBarMode = ADDRESSBAR_MODE_INVALID; + __curAddressBarMode = ADDRESSBAR_MODE_INVALID; + __pMostVisitedSites = null; +} + +MainForm::~MainForm(void) +{ + SettingPresentationModel::GetInstance()->RemoveSettingsEventListener(*this); + + if(__pAddressbar) + { + __pAddressbar->SetAddressbarEventListener(null); + } + if (__pReaderData != null) + { + delete __pReaderData; + __pReaderData = null; + } + + if (__pPopUp != null) + { + delete __pPopUp; + __pPopUp = null; + } + String* pSelectedScene = NULL; + Object* pValue = NULL; + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &pValue); + pSelectedScene = (String*) pValue; + + /*if (pSelectedScene != null) + { + delete pSelectedScene; + } + MultiWindowPresentationModel::SetValue(SELECTED_SCENE_ID, null);*/ +} + +bool +MainForm::Initialize(void) +{ + Construct(L"IDL_FORM"); + return true; +} + +result +MainForm::OnInitializing(void) +{ + const int WIDTH_CONTEXT_MENU_BUTTON = 336; + const int HEIGHT_CONTEXT_MENU_BUTTON = 72; + + Panel* pFooterPanel = null; + + __pSaveImage = new Image(); + __pSaveImage->Construct(); + + // Setup back event listener + SettingPresentationModel::GetInstance()->AddSettingsEventListener(*this); + SceneManager::GetInstance()->AddSceneEventListener(IDSCN_MAIN_VIEW, *this); + AddOrientationEventListener(*this); + AppLogDebug(" MainForm::OnInitializing ended"); + if (__pMostVisitedSites == null) + { + __pMostVisitedSites = new(std::nothrow) ArrayList(); + __pMostVisitedSites->Construct(); + } + HistoryPresentationModel::GetInstance()->GetMostVisitedSites(*__pMostVisitedSites); + + __pItemContext= new(std::nothrow) ListContextItem(); + __pItemContext->Construct(); + Bitmap* pBitmapNormal = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete.9.png", WIDTH_CONTEXT_MENU_BUTTON,HEIGHT_CONTEXT_MENU_BUTTON); + Bitmap* pBitmapPressed = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete_press.9.png", WIDTH_CONTEXT_MENU_BUTTON, HEIGHT_CONTEXT_MENU_BUTTON); + + if (pBitmapNormal != null && pBitmapPressed != null) + { + __pItemContext->AddElement(IDA_CONTEXT_ITEM_DELETE, CommonUtil::GetString(L"IDS_BR_SK_DELETE_ABB"), *pBitmapNormal, *pBitmapPressed, pBitmapPressed); + } + + if (pBitmapNormal != null) + { + delete pBitmapNormal; + } + + if (pBitmapPressed != null) + { + delete pBitmapPressed; + } + + return E_SUCCESS; +} + +result +MainForm::InitAddressbar(void) +{ + AppLogDebug("MainForm::InitAddressbar entered"); + + result r = E_SUCCESS; + + if (__pAddressbar != null) + { + return E_SUCCESS; + } + __pAddressbar = new(std::nothrow) Addressbar(); + AppLog("MainForm::InitAddressbar GetClientAreaBounds().width %d",GetClientAreaBounds().width); + r = __pAddressbar->Initialize(Tizen::Graphics::Rectangle(0, 0, GetClientAreaBounds().width, 82)); + if (r != E_SUCCESS) + { + AppLogDebug("Addressbar init failed with %s", GetErrorMessage(r)); + return r; + } + __pAddressbar->SetAddressbarEventListener(this); + AddControl(*__pAddressbar); + __pAddressbar->SetBounds(Rectangle(0,0,GetClientAreaBounds().width,__pAddressbar->GetHeight())); + SetControlAlwaysOnTop(*__pAddressbar, true); + __adressPanelPosition = __pAddressbar->GetPosition(); + + AppLogDebug("MainForm::InitAddressbar exit"); + + return E_SUCCESS; +} + +result +MainForm::CreateReaderPanel(void) +{ + AppLogDebug("CreateReaderPanel() width %d",GetClientAreaBounds().width); + result r = E_FAILURE; + WebSetting settings; + Button *pSmallFontBtn = null; + Button *pLargeFontBtn = null; + + __pBlankPanel = new (std::nothrow) Panel(); + __pBlankPanel->Construct(L"IDL_BLANK_PANEL"); + + __pArticleReaderPanel = new (std::nothrow) Panel(); + __pArticleReaderPanel->Construct(L"IDL_ARTICLE_READER"); + + __pReaderCloseBtn = static_cast(__pArticleReaderPanel->GetControl(L"IDC_CLOSE_READER",true)); + if (__pReaderCloseBtn) + { + AppLogDebug("CreateReaderPanel() 6"); + __pReaderCloseBtn->AddActionEventListener(*this); + __pReaderCloseBtn->SetActionId(IDA_READER_CLOSE_CLICKED); + } + + __pWebReader = new (std::nothrow) Web(); + __pWebReader->Construct(Rectangle(2,2, __pArticleReaderPanel->GetWidth()-2,__pArticleReaderPanel->GetHeight() - 96 -2)); + + settings.SetInputStyle(INPUT_STYLE_OVERLAY); + settings.SetFontSize(SettingPresentationModel::GetInstance()->GetReaderFontSize()); + + r = __pWebReader->SetSetting(settings); + if (IsFailed(r)) + AppLogDebug("Web setting add failed with %s", GetErrorMessage(r)); + + + __pArticleReaderLabel = new Label(); + __pArticleReaderLabel->Construct(Rectangle(__pArticleReaderPanel->GetX(),__pArticleReaderPanel->GetY(),__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()),L""); + + __pBlankPanel->AddControl(*__pArticleReaderLabel); + __pBlankPanel->AddControl(*__pArticleReaderPanel); + AddControl(*__pBlankPanel); + + __pBlankPanel->SetBounds(0,0,GetClientAreaBounds().width,GetClientAreaBounds().height); + __pArticleReaderPanel->SetBounds((GetClientAreaBounds().width - __pArticleReaderPanel->GetWidth())/2,(GetClientAreaBounds().height - __pArticleReaderPanel->GetHeight())/2, __pArticleReaderPanel->GetWidth(), __pArticleReaderPanel->GetHeight()); + __pArticleReaderLabel->SetBounds(__pArticleReaderPanel->GetX(),__pArticleReaderPanel->GetY(),__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()); + + __pArticleReaderPanel->AddControl(*__pWebReader); + __pWebReader->SetBounds(Rectangle(2,2, __pArticleReaderPanel->GetWidth()-2,__pArticleReaderPanel->GetHeight() - 96 -2)); + Bitmap* pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_popup_bg.9.png",__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()); + Bitmap* pSrcBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_popup_bottom_bg.9.png",__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()); + + if (pBitmap != null && pSrcBitmap != null) + { + pBitmap->Merge(Point(0,__pArticleReaderPanel->GetHeight() - 96),*pSrcBitmap,Rectangle(0,0,pSrcBitmap->GetWidth(),pSrcBitmap->GetHeight())); + } + __pArticleReaderLabel->SetBackgroundBitmap(*pBitmap); + + pSmallFontBtn = static_cast(__pArticleReaderPanel->GetControl(L"IDC_SMALL_FONT",true)); + if (pSmallFontBtn) + { + pSmallFontBtn->AddActionEventListener(*this); + pSmallFontBtn->SetActionId(IDA_SMALLFONT_BTN_CLICKED); + } + + pLargeFontBtn = static_cast(__pArticleReaderPanel->GetControl(L"IDC_LARGE_FONT",true)); + if (pLargeFontBtn) + { + pLargeFontBtn->AddActionEventListener(*this); + pLargeFontBtn->SetActionId(IDA_LARGEFONT_BTN_CLICKED); + } + + + if (pBitmap != null) + { + delete pBitmap; + pBitmap = null; + } + if (pSrcBitmap != null) + { + delete pSrcBitmap; + pSrcBitmap = null; + } + + SetControlAlwaysOnTop(*__pBlankPanel, true); + //__pBlankPanel->SetControlAlwaysAtBottom(*__pArticleReaderPanel, true); + Invalidate(true); + + return E_SUCCESS; +} + +result +MainForm::InitWebControl() +{ + AppLogDebug("MainForm::InitWebControl enter"); + result r = E_SUCCESS; + AppLogDebug("InitWebControl"); + + if (__pAddressbar == null || __pFooterPanel == null) + return E_FAILURE; + + const int Y_WEBCONTROL_POSITION = __pAddressbar->GetY() + __pAddressbar->GetHeight() - 12; + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + if (__pMostVisitedListView) + { + __pMostVisitedListView->SetShowState(false); + } + if (__pWebViewer != null) + { + AppLogDebug("Already initialized"); + return E_SUCCESS; + } + __pWebViewer = new(std::nothrow) Web(); + if(__pWebViewer == NULL) + { + AppLogDebug("Initialization failed"); + return E_FAILURE; + } + r = __pWebViewer->Construct(Rectangle(0, Y_WEBCONTROL_POSITION, GetClientAreaBounds().width,__webControlHeight)); + + if (IsFailed(r)) + { + AppLogDebug("Web construct failed with %s", GetErrorMessage(r)); + return r; + } + else + { + r = AddControl(*__pWebViewer); + + if (IsFailed(r)) + { + AppLogDebug("Web addcontrol failed with %s", GetErrorMessage(r)); + return r; + } + __webControlPosition = __pWebViewer->GetPosition(); + r = __pWebViewer->SetSetting(SettingPresentationModel::GetInstance()->GetWebSettings()); + if (IsFailed(r)) + { + AppLogDebug("Web setting add failed with %s", GetErrorMessage(r)); + return r; + } + + __pWebViewer->SetLoadingListener(this); + __pWebViewer->SetWebUiEventListener(this); + __pWebViewer->SetWebKeypadEventListener(this); + __pWebViewer->SetFocus(); + __pWebViewer->AddTouchEventListener(*this); + + __pWebViewer->SetCookieEnabled(SettingPresentationModel::GetInstance()->IsCookiesEnabled()); + __pWebViewer->SetTextSearchListener(this); + } + + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width,__webControlHeight)); + AppLogDebug("MainForm :before return"); + Invalidate(true); + AppLogDebug("MainForm::InitWebControl Exit"); + + return r; +} + +void +MainForm::SetJavascriptEnabled() +{ + WebSetting settings = __pWebViewer->GetSetting(); + settings.SetJavascriptEnabled(SettingPresentationModel::GetInstance()->IsRunJavascriptEnabled()); + __pWebViewer->SetSetting(settings); +} + +void +MainForm::SetImageLoadEnabled() +{ + WebSetting settings = __pWebViewer->GetSetting(); + settings.SetAutoImageLoadEnabled(SettingPresentationModel::GetInstance()->IsDisplayImagesEnabled()); + __pWebViewer->SetSetting(settings); +} + +result +MainForm::InitFooter(void) +{ + AppLogDebug("MainForm::InitFooter entered"); + Button* pBackButton = null; + Button* pBookmarkButton = null; + Button* pMultiWindowButton = null; + Bitmap *pIconBitmap = null; + Bitmap *pBGBitmap = null; + Label *pBGLabel = null; + + if (__pFooterPanel == null) + { + __pFooterPanel = static_cast< Panel* >(GetControl(L"IDC_FOOTER_PANEL", true)); + } + + if (__pFooterPanel == null) + { + return E_FAILURE; + } + + SetControlAlwaysOnTop(*__pFooterPanel, true); + + __pMultiWindowButton = static_cast< Button* >(GetControl(L"IDC_MULTIWINDOW_BUTTON", true)); + + if ( __pMultiWindowButton == NULL ) + { + return E_FAILURE; + } + + pBackButton = static_cast< Button* >(GetControl(L"IDC_PAGEBACK_BUTTON", true)); + + if ( pBackButton == NULL ) + { + return E_FAILURE; + } + + pBookmarkButton = static_cast< Button* >(GetControl(L"IDC_BOOKMARK_BUTTON", true)); + + if ( pBookmarkButton == NULL ) + { + return E_FAILURE; + } + + __pMoreButton = static_cast(GetControl(L"IDC_MORE_BUTTON",true)); + + if ( __pMoreButton == NULL ) + { + return E_FAILURE; + } + + __pNewWindowButton = static_cast< Button* >(GetControl(L"IDC_NEW_WINDOW",true)); + + if ( __pNewWindowButton == NULL ) + { + return E_FAILURE; + } + + if (__pMultiWindowButton != null) + { + Bitmap* pBitmap = null; + Bitmap* pPressedBitmap = null; + String imagePath = "I01_toolbar_icon_windows_manager_0"; + String pressedImagePath = "I01_toolbar_icon_windows_manager_0"; + int totalCount = MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList()->GetCount(); + imagePath.Append(totalCount); + imagePath.Append(".png"); + + pressedImagePath.Append(totalCount); + pressedImagePath.Append("_press.png"); + + pBitmap = AppResource::GetInstance()->GetBitmapN(imagePath); + pPressedBitmap = AppResource::GetInstance()->GetBitmapN(pressedImagePath); + if ( pBitmap == null ) + { + return E_FAILURE; + } + + Point startPoint = Point((__pMultiWindowButton->GetWidth() - pBitmap->GetWidth())/2,(__pMultiWindowButton->GetHeight() - pBitmap->GetHeight())/2); + if (pBitmap != null) + { + __pMultiWindowButton->SetNormalBitmap(startPoint, *pBitmap); + __pMultiWindowButton->SetPressedBitmap(startPoint, *pPressedBitmap); + + delete pBitmap; + } + + __pMultiWindowButton->AddActionEventListener(*this); + __pMultiWindowButton->SetActionId(IDA_MULTIWINDOWBTN_CLICKED); + } + + + if (pBackButton) + { + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BTN_BACK); + Bitmap* pPressedBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BTN_BACK_PRESS); + if (pBitmap != null) + { + // pBitmap->Scale(Dimension(56,56)); + + Point startPoint((pBackButton->GetWidth() - pBitmap->GetWidth())/2,(pBackButton->GetHeight() - pBitmap->GetHeight())/2 ); + AppLog("startPoint %d,%d pBitmap width height %d %d",startPoint.x,startPoint.y,pBitmap->GetWidth(),pBitmap->GetHeight()); + pBackButton->SetNormalBitmap(startPoint, *pBitmap); + pBackButton->SetPressedBitmap(startPoint, *pPressedBitmap); + delete pBitmap; + } + pBackButton->AddActionEventListener(*this); + pBackButton->SetActionId(IDA_BACKBTN_CLICKED); + } + + if (pBookmarkButton) + { + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_BOOKMARK); + Bitmap* pPressedBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_BOOKMARK_PRESS); + if (pBitmap != null) + { + Point startPoint((pBookmarkButton->GetWidth() - pBitmap->GetWidth())/2,(pBookmarkButton->GetHeight() - pBitmap->GetHeight())/2 ); + pBookmarkButton->SetNormalBitmap(startPoint, *pBitmap); + pBookmarkButton->SetPressedBitmap(startPoint, *pPressedBitmap); + delete pBitmap; + } + pBookmarkButton->AddActionEventListener(*this); + pBookmarkButton->SetActionId(IDA_BOOKMARKBTN_CLICKED); + } + + if (__pMoreButton) + { + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_MORE); + Bitmap* pPressedBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_MORE_PRESS); + if (pBitmap != null) + { + Point startPoint((__pMoreButton->GetWidth() - pBitmap->GetWidth())/2,(__pMoreButton->GetHeight() - pBitmap->GetHeight())/2 ); + __pMoreButton->SetNormalBitmap(startPoint, *pBitmap); + __pMoreButton->SetPressedBitmap(startPoint, *pPressedBitmap); + + delete pBitmap; + } + __pMoreButton->AddActionEventListener(*this); + __pMoreButton->SetActionId(IDA_MOREBTN_CLICKED); + + } + + + if (__pNewWindowButton) + { + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_NEW_WINDOW); + Bitmap* pPressedBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTRLBAR_ICON_NEW_WINDOW_PRESS); + if (pBitmap != null) + { + Point startPoint((__pNewWindowButton->GetWidth() - pBitmap->GetWidth())/2,(__pNewWindowButton->GetHeight() - pBitmap->GetHeight())/2 ); + __pNewWindowButton->SetNormalBitmap(startPoint, *pBitmap); + __pNewWindowButton->SetPressedBitmap(startPoint, *pPressedBitmap); + delete pBitmap; + } + __pNewWindowButton->AddActionEventListener(*this); + __pNewWindowButton->SetActionId(IDA_NEWWINDOWBTN_CLICKED); + __pNewWindowButton->SetEnabled(true); + // __pNewWindowButton->Invalidate(true); + } + + AppLog("checkingwindow count %d",MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList()->GetCount()); + + if (__pNewWindowButton != null && MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList()->GetCount() >= 9) + { + Bitmap* pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_CONTROLBAR_ICON_CREATE_DISABLE); + if (pBitmap != null) + { + Point startPoint = Point((__pNewWindowButton->GetWidth() - pBitmap->GetWidth())/2,(__pNewWindowButton->GetHeight() - pBitmap->GetHeight())/2 ); + __pNewWindowButton->SetDisabledBitmap(startPoint,*pBitmap); + delete pBitmap; + } + __pNewWindowButton->SetEnabled(false); + } + + // __pFooterPanel->Invalidate(true); + AppLogDebug("MainForm::InitFooter exit"); + return E_SUCCESS; +} + + +result +MainForm::InitContextMenu(Point& p) +{ + result r = E_SUCCESS; + bool isPrivateBrowsing = false; + Bitmap* pBitmap = null; + + if (__pMenu != null) + { + __pMenu->SetAnchorPosition(p); + __pMenu->Invalidate(true); + return r; + } + + __pMenu = new(std::nothrow) ContextMenu(); + r = __pMenu->Construct(p, CONTEXT_MENU_STYLE_LIST); + TryCatch(!IsFailed(r),,"Contextmenu creation failed with%s",GetErrorMessage(r)); + + isPrivateBrowsing = SettingPresentationModel::GetInstance()->GetPrivateOn(); + + + if (isPrivateBrowsing == true) + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_ON); + } + else + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_OFF); + } + + if ( pBitmap != NULL) + { + __pMenu->AddItem(CommonUtil::GetString(L"IDS_BR_BODY_PRIVACY"), IDA_PRIVATEON_CLICKED,*pBitmap); + delete pBitmap; + } + r = __pMenu->AddItem(CommonUtil::GetString(L"IDS_COM_OPT_BRIGHTNESS"), IDA_BRIGHTNESS_BTN_CLICKED); + r = __pMenu->AddItem(CommonUtil::GetString(L"IDS_COM_BODY_SETTINGS"), IDA_SETTINGS_CLICKED); + __pMenu->SetMaxVisibleItemsCount(3); + __pMenu->SetShowState(false); + __pMenu->AddActionEventListener(*this); + SetControlAlwaysOnTop(*__pMenu, true); + + CATCH: + return r; +} + +result MainForm::InitImageContextMenu(Tizen::Graphics::Point p) +{ + result r = E_SUCCESS; + + AppLog("MainForm::InitImageContextMenu clicked on image"); + if (__pImageMenu != null) + { + delete __pImageMenu; + __pImageMenu = null; + } + + p.y = p.y + __pAddressbar->GetHeight() + 12; + __pImageMenu = new (std::nothrow) ContextMenu(); + r = __pImageMenu->Construct(p, CONTEXT_MENU_STYLE_LIST); + TryCatch(!IsFailed(r),, "Context image menu creation failed with%s",GetErrorMessage(r)); + + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_BR_OPT_COPY_IMAGE"),IDA_COPY_IMAGE_CLICKED); + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_BR_OPT_VIEW_IMAGE"),IDA_VIEW_IMAGE_CLICKED); + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_BR_OPT_SAVE_IMAGE"),IDA_SAVE_IMAGE_CLICKED); + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_DLNA_BODY_SHARE_IMAGE_ABB"),IDA_SHARE_IMAGE_CLICKED); + __pImageMenu->SetMaxVisibleItemsCount(4); + __pImageMenu->AddActionEventListener(*this); + SetControlAlwaysOnTop(*__pImageMenu, true); + + CATCH: return r; +} + +result MainForm::InitSelectTextContextMenu(Tizen::Graphics::Point p, bool pasteOption, bool onlyPasteOption = false) +{ + result r = E_SUCCESS; + + AppLog("MainForm::InitSelectTextContextMenu clicked on text"); + if (__pImageMenu != null) + { + delete __pImageMenu; + __pImageMenu = null; + } + p.y = p.y + __pAddressbar->GetHeight() + 12; + __pImageMenu = new (std::nothrow) ContextMenu(); + r = __pImageMenu->Construct(p, CONTEXT_MENU_STYLE_GRID); + TryCatch(!IsFailed(r),, "Context image menu creation failed with%s",GetErrorMessage(r)); + + if(onlyPasteOption == false) + { + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_COM_OPT_COPY"),IDA_COPY_TEXT_CLICKED); + } + if (pasteOption || onlyPasteOption) + { + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_COM_BODY_PASTE"),IDA_PASTE_TEXT_CLICKED); + } + if(onlyPasteOption == false) + { + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_BR_OPT_FIND_ON_PAGE_ABB"),IDA_FIND_TEXT__CLICKED); + r = __pImageMenu->AddItem(CommonUtil::GetString(L"IDS_BR_OPT_SHARE"),IDA_SHARE_TEXT_CLICKED); + } + + __pImageMenu->SetMaxVisibleItemsCount(3); + __pImageMenu->AddActionEventListener(*this); + SetControlAlwaysOnTop(*__pImageMenu, true); + + CATCH: return r; + +} + +result +MainForm::InitFindWordPanel(void) +{ + result r = E_SUCCESS; + Bitmap *pIconBitmap = null; + + if (__pFindWordPanel != null) + { + AppLogDebug("Findword panel already initialized"); + if (__pFindWordBgLabel != null) + { + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_search_input_field_bg.9.png", __pFindWordBgLabel->GetWidth(), __pFindWordBgLabel->GetHeight()); + if (pBitmap != null) + { + AppLogDebug("InitFindWordPanel: Coming here"); + __pFindWordBgLabel->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + } + return r; + } + + __pFindWordPanel = static_cast(GetControl(L"IDC_FIND_ON_PAGE_PANEL")); + if (__pFindWordPanel == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + + __pFindWordControl = new (std::nothrow) Panel(); + r = __pFindWordControl->Construct(L"IDL_FIND_ON_PAGE"); + if (IsFailed(r)) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + __pFindWordPanel->AddControl(*__pFindWordControl); + __pFindWordControl->SetBounds(0,0, __pFindWordPanel->GetWidth(), __pFindWordPanel->GetHeight()); + SetControlAlwaysOnTop(*__pFindWordPanel,true); + __pFindWordPanel->SetShowState(false); + __pFindWordPanel->Invalidate(false); + + __pFindWordBgLabel = static_cast(__pFindWordControl->GetControl(L"IDC_LABEL1", true)); + if (__pFindWordBgLabel != null) + { + Panel* pPanel1 = static_cast(__pFindWordControl->GetControl(L"IDC_PANEL1", true)); + Rectangle pRect = pPanel1->GetBounds(); + pRect.x = pRect.y = 0; + __pFindWordBgLabel->SetBounds(pRect); + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_search_input_field_bg.9.png", __pFindWordBgLabel->GetWidth(), __pFindWordBgLabel->GetHeight()); + if (pBitmap != null) + { + AppLogDebug("InitFindWordPanel: Coming here"); + __pFindWordBgLabel->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + else + { + AppLogDebug("InitFindWordPanel: shouldn't Come here"); + } + } + + Button* pfindWordCancel = null; + pfindWordCancel = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_CANCEL", true)); + if (pfindWordCancel == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + pfindWordCancel->SetActionId(IDA_FINDWORD_CANCEL_CLICKED); + pfindWordCancel->AddActionEventListener(*this); + + __pFindWordClear = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_CLEAR", true)); + if (__pFindWordClear == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + + __pFindWordClear->SetActionId(IDA_FINDWORD_CLEAR_CLICKED); + __pFindWordClear->AddActionEventListener(*this); + + __pFindWordNext = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_NEXT", true)); + if (__pFindWordNext == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + + __pFindWordNext->SetActionId(IDA_FINDWORD_NEXT_CLICKED); + __pFindWordNext->AddActionEventListener(*this); + + __pFindWordPrev = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_PREV", true)); + if (__pFindWordPrev == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + + __pFindWordPrev->SetActionId(IDA_FINDWORD_PREV_CLICKED); + __pFindWordPrev->AddActionEventListener(*this); + + __pFindWordNext->SetEnabled(false); + __pFindWordPrev->SetEnabled(false); + + __pFindWordCountLabel = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_COUNT_LABEL", true)); + if (__pFindWordCountLabel == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + + __pFindWordEditField = static_cast(__pFindWordControl->GetControl(L"IDC_FIND_WORD_EDITFIELD", true)); + if (__pFindWordEditField == null) + { + AppLogException("There is some problem in the xml file. Please check."); + return E_FAILURE; + } + __pFindWordEditField->AddTextEventListener(*this); + __pFindWordEditField->AddKeypadEventListener(*this); + __pFindWordEditField->SetOverlayKeypadCommandButtonVisible(false); + + return r; +} + +ListItemBase* +MainForm::CreateItem (int index, int itemWidth) +{ + Rectangle listImageRect; + Rectangle pagetTitleRect; + Rectangle pageURLRect; + Rectangle deleteImageRect; + String pageTitle(L""); + String pageURL(L""); + result r = E_SUCCESS; + Bitmap* pListIconImage = null; + + + History* pHistory = static_cast < History* >(__pMostVisitedSites->GetAt(index)); + if(pHistory == null) + { + return null; + } + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + if ( pAppResource == NULL ) + { + return null; + } + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + + CustomItem* pItem = new(std::nothrow) CustomItem(); + pageTitle = pHistory->GetHistoryTitle(); + pageURL = pHistory->GetHistoryUrl(); + + if (pageURL.GetLength() == 0) + { + String nourl; + pAppResource->GetString(L"IDS_BR_BODY_ABOUT_C_BLANK", nourl); + pageURL = L"<"+ nourl +">"; + + } + + Rectangle screenBounds = GetBounds(); + if (pItem != null) + { + r = pItem->Construct(Dimension(itemWidth, 128), style); + } + if (IsFailed(r)) + { + delete pItem; + return NULL; + } + + if (pHistory->GetFaviconId().GetLength() > 0) + { + String bitmapId = pHistory->GetFaviconId(); + Bitmap* pBitmap = FaviconManager::GetInstance()->GetFaviconN(bitmapId); + + if ( pBitmap != NULL) + { + pListIconImage = new Bitmap(); + pListIconImage->Construct(*pBitmap,Rectangle(0,0,pBitmap->GetWidth(),pBitmap->GetHeight())); + delete pBitmap; + } + } + + if(pListIconImage == null) + { + pListIconImage = pAppResource->GetBitmapN(L"I01_icon_default_favicon.png"); + } + + if ( pListIconImage != NULL) + { + listImageRect.SetBounds(screenBounds.x + 16, screenBounds.y + 28,72, 72); + pagetTitleRect.SetBounds(listImageRect.x + 72 + 16,10, screenBounds.width - 2 * pListIconImage->GetWidth() - 120, 60); + pageURLRect.SetBounds(pagetTitleRect.x, pagetTitleRect.y + pagetTitleRect.height, screenBounds.width - 2 * pListIconImage->GetWidth() - 120, 48); + + + if (pItem != null && pListIconImage != NULL) + { + pItem->AddElement(listImageRect, IDA_FORMAT_BITMAP, *pListIconImage, null, null); + } + } + + if (pageTitle.CompareTo(L"") != 0) + { + if (pItem != null) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, pageTitle, 44, CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT, true); + } + } + + if (pageURL.CompareTo(L"") != 0) + { + if (pItem != null) + { + pItem->AddElement(pageURLRect, IDA_FORMAT_URL_STRING, pageURL, 32, CUSTOM_COLOR_GREY, CUSTOM_COLOR_GREY, CUSTOM_COLOR_GREY, true); + } + } + + + if ( __pItemContext!= NULL) + { + if (pItem != null) + { + pItem->SetContextItem(__pItemContext); + } + } + if( pListIconImage != NULL) + { + delete pListIconImage; + pListIconImage = null; + } + + return pItem; +} + +bool +MainForm::DeleteItem (int index, Tizen::Ui::Controls::ListItemBase *pItem, int itemWidth) +{ + delete pItem; + return true; +} + +int +MainForm::GetItemCount (void) +{ + if(__pMostVisitedSites != null) + { + __pMostVisitedSites->RemoveAll(true); + } + HistoryPresentationModel::GetInstance()->GetMostVisitedSites(*__pMostVisitedSites); + if(__pMostVisitedSites != null) + { + return __pMostVisitedSites->GetCount(); + } + else + return 0; +} + +void +MainForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state) +{ + History* pHistory = static_cast < History* >(__pMostVisitedSites->GetAt(index)); + String url = pHistory->GetHistoryUrl(); + HistoryPresentationModel::GetInstance()->DeleteHistory(url); + __pMostVisitedListView->UpdateList(); +} + +void +MainForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + History* pHistory = static_cast < History* >(__pMostVisitedSites->GetAt(index)); + String url = pHistory->GetHistoryUrl(); + if (url != null) + { + LoadUrl(url); + } +} + +void +MainForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ + +} + +result +MainForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +MainForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + result r = E_SUCCESS; + + AppLogDebug("Clicked : %d", actionId); + switch (actionId) + { + case IDA_BACKBTN_CLICKED: + { + if (__pWebViewer && __pWebViewer->CanGoBack()) + { + __pWebViewer->GoBack(); + } + else + { + UiApp* pApp = null; + pApp = UiApp::GetInstance(); + if (pApp != null) + { + r = pApp->Terminate(); + if (IsFailed(r)) + { + AppLogException("OnActionPerformed failed with %s", GetErrorMessage(r)); + return; + } + } + } + } + break; + + case IDA_FORWARD_CLICKED: + if (__pWebViewer == null) + return; + + if (__pWebViewer->CanGoForward()) + { + __pWebViewer->GoForward(); + } + __pMenu->SetShowState(false); + __pMenu->Invalidate(false); + break; + + case IDA_FINDONPAGE_CLICKED: + { + AppLogDebug("MainForm::OnActionPerformed findword clicked"); + __currentSearchStr.Clear(); + + InitFindWordPanel(); + __pMenu->SetShowState(false); + __pMenu->Invalidate(false); + + __adressPanelPosition.y = 0; + + if (__pAddressbar != null && __pWebViewer != NULL) + { + __webControlPosition.y = __pAddressbar->GetHeight() - 12; + __pAddressbar->SetBounds(0,__adressPanelPosition.y,GetClientAreaBounds().width,__pAddressbar->GetHeight()); + __pAddressbar->Invalidate(true); + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width,__webControlHeight)); + __pWebViewer->Invalidate(true); + } + + ShowFindWordPanel(true); + } + break; + case IDA_PRIVATEON_CLICKED: + { + result r = E_SUCCESS; + int itemIndex = 0; + bool isPrivateBrowsing = SettingPresentationModel::GetInstance()->GetPrivateOn(); + Bitmap* pBitmap = null; + if (isPrivateBrowsing == true) + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_OFF); + if (IsFailed(r)) + { + AppLogException("Contextmenu additem:Find on page failed with %s", GetErrorMessage(r)); + return ; + } + + if (__pWebViewer != NULL) + { + __pWebViewer->SetPrivateBrowsingEnabled(false); + } + + SettingPresentationModel::GetInstance()->SetPrivateOn(false); + + if (__pAddressbar != null) + { + __pAddressbar->UpdateFaviconBitmap(false); + } + + } + else + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_ON); + if (IsFailed(r)) + { + AppLogException("Contextmenu additem:Find on page failed with %s", GetErrorMessage(r)); + return ; + } + + if (__pWebViewer != NULL) + { + __pWebViewer->SetPrivateBrowsingEnabled(true); + } + + SettingPresentationModel::GetInstance()->SetPrivateOn(true); + + if (__pAddressbar != null) + { + __pAddressbar->UpdateFaviconBitmap(true); + } + } + + + itemIndex = __pMenu->GetItemIndexFromActionId(IDA_PRIVATEON_CLICKED); + r = __pMenu->SetItemAt(itemIndex,CommonUtil::GetString(L"IDS_BR_BODY_PRIVACY"),IDA_PRIVATEON_CLICKED,*pBitmap); + AppLog("Result:: %s for index = %d", GetErrorMessage(r),itemIndex); + __pMenu->Invalidate(true); + + if ( pBitmap != NULL ) + { + delete pBitmap; + } + + } + break; + case IDA_SETTINGS_CLICKED: + { + + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList) + { + pArgList->Construct(); + pArgList->Add(*__pWindowInfo); + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_SETTINGS), pArgList); + } + __pMenu->SetShowState(false); + __pMenu->Invalidate(false); + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + + } + break; + + case IDA_ADDTOBOOKMARK_CLICKED: + { + + if (__pWindowInfo != NULL && __pWindowInfo->pageUrl != NULL) + { + int bookmarkCount=0; + bool exist = false; + String url=L""; + url=__pWindowInfo->pageUrl; + result r = E_SUCCESS; + Bitmap* pBitmap = null; + r=BookmarkPresentationModel::GetInstance()->DoesBookmarkExist(url,exist); + + if (IsFailed(r)) + { + return; + } + if ( exist == true) + { + String message = CommonUtil::GetString(L"IDS_BR_POP_BOOKMARK_REMOVED"); + BookmarkPresentationModel::GetInstance()->DeleteBookmark(url); + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_OFF_TEMP); + + NotificationPanel* pNotification = new (std::nothrow) NotificationPanel(*this); + if (pNotification != null) + { + pNotification->SetText(message); + pNotification->SetPositionDiff(__pFooterPanel->GetHeight()); + pNotification->ShowNotification(); + } + } + else + { + String title=__pWindowInfo->pageTitle; + String message = CommonUtil::GetString(L"IDS_BR_POP_BOOKMARK_ADDED"); + BookmarkData* pBookmark=new (std::nothrow) BookmarkData(); + + pBookmark->SetBookmarkTitle(title); + pBookmark->SetUrl(url); + String id = FaviconManager::GetInstance()->SaveFavicon(*__pWindowInfo->pFavicon, __pWindowInfo->faviconUrl); + pBookmark->SetFaviconId(id); + r = BookmarkPresentationModel::GetInstance()->SaveBookmark(*pBookmark); + delete pBookmark; + + NotificationPanel* pNotification = new (std::nothrow) NotificationPanel(*this); + if(pNotification != null) + { + pNotification->SetText(message); + pNotification->SetPositionDiff(__pFooterPanel->GetHeight()); + pNotification->ShowNotification(); + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_ON_TEMP); + } + } + if (pBitmap != null) + { + r = __pMenu->SetItemAt(0,CommonUtil::GetString(L"IDS_BR_OPT_BOOKMARK"), IDA_ADDTOBOOKMARK_CLICKED,*pBitmap); + delete pBitmap; + } + } + __pMenu->Invalidate(true); + + } + break; + case IDA_SHARE_CLICKED: + { + if(__pPopUp != null) + { + delete __pPopUp; + __pPopUp = null; + } + __pPopUp = new(std::nothrow) SharePopup(); + __pPopUp->Initialize(); + if (__pWindowInfo != null) + { + ShareInfo* pShareInfo = new(std::nothrow) ShareInfo(); + pShareInfo->SetPageTitle(__pWindowInfo->pageTitle); + pShareInfo->SetPageUrl(__pWindowInfo->pageUrl); + pShareInfo->SetImageAttached(false); + __pPopUp->RemoveAllShareInfo(); + __pPopUp->AddShareInfo(pShareInfo); + } + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + break; + case IDA_BOOKMARKBTN_CLICKED: + + AppLogDebug("ONACTION_PERFORMED:IDA_BOOKMARKBTN_CLICKED"); + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_BOOKMARK_VIEW, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); + break; + + case IDA_MOREBTN_CLICKED: + { + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED 1"); + Point p = Point(__pMoreButton->GetX() + __pMoreButton->GetWidth() / 2, GetClientAreaBounds().y + GetClientAreaBounds().height - __pMoreButton->GetHeight()); + AppLog("Anchot pos: %d %d", p.x, p.y); + InitContextMenu(p); + if (__pWindowInfo != NULL && __pWindowInfo->pageUrl != NULL) + { + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED 2"); + int bookmarkCount=0; + bool exist = false; + String url=L""; + url=__pWindowInfo->pageUrl; + result r = E_SUCCESS; + Bitmap* pBitmap = null; + + r=BookmarkPresentationModel::GetInstance()->DoesBookmarkExist(url,exist); + if (IsFailed(r)) + { + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED failed"); + return; + } + if ( exist == true) + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_ON_TEMP); + } + else + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_ICON_BOOKMARK_OFF_TEMP); + } + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED 3"); + + if (__pMenu->GetItemCount() == 6) + { + r = __pMenu->SetItemAt(0,CommonUtil::GetString(L"IDS_BR_OPT_BOOKMARK"), IDA_ADDTOBOOKMARK_CLICKED,*pBitmap); + } + else + { + r = __pMenu->InsertItemAt(0,CommonUtil::GetString(L"IDS_BR_OPT_BOOKMARK"), IDA_ADDTOBOOKMARK_CLICKED,*pBitmap); + } + + if (IsFailed(r)) + { + AppLogException("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED Add to Bookmark failed with %s", GetErrorMessage(r)); + delete pBitmap; + return ; + } + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED 4"); + if (__pMenu->GetItemCount() != 6) + { + __pMenu->InsertItemAt(1,CommonUtil::GetString(L"IDS_BR_OPT_SHARE"), IDA_SHARE_CLICKED); + __pMenu->InsertItemAt(2,CommonUtil::GetString(L"IDS_BR_OPT_FIND_ON_PAGE_ABB"), IDA_FINDONPAGE_CLICKED); + __pMenu->SetMaxVisibleItemsCount(6); + } + if( GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE) + { + AppLog(" Orientation landscape"); + __pMenu->SetMaxVisibleItemsCount(5); + } + else + { + AppLog(" Orientation potrait"); + __pMenu->SetMaxVisibleItemsCount(6); + } + + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED 5"); + delete pBitmap; + } + AppLogDebug("ONACTION_PERFORMED:IDA_MOREBTN_CLICKED end"); + __pMenu->SetShowState(true); + __pMenu->Invalidate(true); + __pMenu->Show(); + } + + break; + + case IDA_MULTIWINDOWBTN_CLICKED: + { + result r = SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_MULTIPLE_WINDOW, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); + AppLog("IDA_MULTIWINDOWBTN_CLICKED result %s",GetErrorMessage(r)); + } + break; + + case IDA_NEWWINDOWBTN_CLICKED: + { + WindowInfo* pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(); + + if (pNewWindowInfo == null) + { + return; + } + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == NULL) + { + return; + } + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList == NULL) + { + return; + } + r = pArgList->Construct(); + if (r == E_SUCCESS) + { + pArgList->Add(*pNewWindowInfo); + r = pSceneManager->GoForward(ForwardSceneTransition(pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + } + delete pArgList; + pArgList = null; + if (IsFailed(r)) + { + AppLogDebug("MainForm::OnActionPerformed Failed to GoBackward %s",GetErrorMessage(r)); + return; + } + } + break; + case IDA_SMALLFONT_BTN_CLICKED: + { + WebSetting setting = __pWebReader->GetSetting(); + setting.SetFontSize(15); + __pWebReader->SetSetting(setting); + } + break; + case IDA_LARGEFONT_BTN_CLICKED: + { + WebSetting setting = __pWebReader->GetSetting(); + setting.SetFontSize(25); + __pWebReader->SetSetting(setting); + } + break; + case IDA_READER_CLOSE_CLICKED: + { + if (__pArticleReaderPanel != null && __pBlankPanel != null) + { + //__pArticleReaderPanel->SetShowState(false); + //__pArticleReaderPanel->Show(); + RemoveControl(*__pBlankPanel); + //RemoveControl(*__pArticleReaderPanel); + __pArticleReaderPanel = null; + __pBlankPanel = null; + __pArticleReaderLabel = null; + } + if (__pAddressbar) + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING_COMPLETE); + } + break; + case IDA_FINDWORD_CANCEL_CLICKED: + { + __currentSearchStr = L""; + __currentWordIndex = 0; + __maxOccurrances = 0; + __pFindWordCountLabel->SetText(L" "); + __pFindWordEditField->SetText(L""); + __pFindWordNext->SetEnabled(false); + __pFindWordPrev->SetEnabled(false); + __pFindWordCountLabel->SetShowState(false); + __pWebViewer->SearchText(L"aaaabbbbcccc",true); + ShowFindWordPanel(false); + } + break; + case IDA_FINDWORD_SEARCH_CLICKED: + { + __currentSearchStr = __pFindWordEditField->GetText(); + if (__currentSearchStr.GetLength() > 0) + { + StartWordSearch(); + } + else + { + AppLogDebug("Enter something"); + } + } + break; + case IDA_FINDWORD_CLEAR_CLICKED: + { + __pFindWordCountLabel->SetText(L""); + __pFindWordCountLabel->SetShowState(false); + __pFindWordEditField->SetText(L""); + __pFindWordNext->SetEnabled(false); + __pFindWordPrev->SetEnabled(false); + __pFindWordPanel->Invalidate(true); + } + break; + case IDA_FINDWORD_NEXT_CLICKED: + { + FindNextWord(true); + } + break; + case IDA_FINDWORD_PREV_CLICKED: + { + FindNextWord(false); + } + break; + case IDA_BRIGHTNESS_BTN_CLICKED: + { + AppLogDebug("IDA_BRIGHTNESS_BTN_CLICKED"); + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_BRIGHTNESS, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); + } + break; + case IDA_COPY_IMAGE_CLICKED: + { + AppLogDebug("IDA_COPY_IMAGE_CLICKED"); + AppLogDebug("IDA_COPY_IMAGE_CLICKED"); + ClipboardItem item; + const Bitmap* pBitmap = null; + if (__pHitElementResult != null) + { + pBitmap = __pHitElementResult->GetImage(); + } + + String resourcePath = App::GetInstance()->GetAppResourcePath(); + item.Construct(CLIPBOARD_DATA_TYPE_IMAGE , *pBitmap); + + // copying the item to clipboard + Clipboard* pClipboard = Clipboard::GetInstance(); + if (pClipboard != null) + { + pClipboard->CopyItem(item); + } + } + break; + case IDA_VIEW_IMAGE_CLICKED: + { + AppLogDebug("IDA_VIEW_IMAGE_CLICKED"); + WindowInfo* pNewWindowInfo = null; + if (__pHitElementResult != null) + { + String srcUrl = __pHitElementResult->GetAttributeValue(L"src"); + AppLog("MainForm::OnTouchLongPressed srcUrl is %ls",srcUrl.GetPointer()); + LoadUrl(srcUrl); + + } + } + break; + case IDA_SAVE_IMAGE_CLICKED: + { + AppLogDebug("IDA_SAVE_IMAGE_CLICKED"); + const Bitmap* pSaveBitmap = null; + String imageName = GetImagePath(); + AppLog("Content manager image name %ls",imageName.GetPointer()); + String imagePath; + imagePath.Clear(); + imagePath.Append(imageName); + imagePath.Format(100, L"%ls/Downloads/%ls.jpg",Tizen::System::Environment::GetMediaPath().GetPointer(), imageName.GetPointer()); + AppLog("Content manager image path %ls",imagePath.GetPointer()); + if (__pHitElementResult != null) + { + pSaveBitmap = __pHitElementResult->GetImage(); + } + ByteBuffer* pBuffer = __pSaveImage->EncodeToBufferN(*pSaveBitmap, IMG_FORMAT_JPG); + + if(pBuffer) + { + UpdateImageContent(pBuffer, imageName); + delete pBuffer; + NotificationPanel *pNotification = new NotificationPanel(*this); + String msg; + AppResource::GetInstance()->GetString("IDS_COM_SK_SAVE", msg); + msg.Append(imagePath); + if (pNotification != null) + { + pNotification->SetText(msg); + pNotification->SetPositionDiff(__pFooterPanel->GetHeight()); + pNotification->ShowNotification(); + } + } + else + { + int __modalMsgBoxResult; + MessageBox* pMsgBox = new MessageBox(); + pMsgBox->Construct(CommonUtil::GetString(L"IDS_COM_FAILED_TO_SAVE_IMAGE"),CommonUtil::GetString(L"IDS_COM_FAILED_TO_SAVE_IMAGE"),MSGBOX_STYLE_OK,3000); + pMsgBox->ShowAndWait(__modalMsgBoxResult); + delete pMsgBox; + pMsgBox = null; + __modalMsgBoxResult = 0; + } + } + break; + case IDA_SHARE_IMAGE_CLICKED: + { + AppLogDebug("IDA_SHARE_IMAGE_CLICKED"); + if (__pPopUp != null) + { + delete __pPopUp; + __pPopUp = null; + } + __pPopUp = new(std::nothrow) SharePopup(); + __pPopUp->Initialize(); + if (__pHitElementResult != null) + { + const Bitmap* pSaveBitmap = null; + String imageName = GetImagePath(); + AppLog("Content manager image name %ls",imageName.GetPointer()); + String imagePath; + imagePath.Clear(); + imagePath.Append(imageName); + imagePath.Format(100, L"%lsDownloads/%ls.jpg",Tizen::System::Environment::GetMediaPath().GetPointer(), imageName.GetPointer()); + AppLog("Content manager image path %ls",imagePath.GetPointer()); + if (__pHitElementResult != null) + { + pSaveBitmap = __pHitElementResult->GetImage(); + } + __pSaveImage->EncodeToFile(*pSaveBitmap, IMG_FORMAT_JPG, imagePath, true); + + String srcUrl = __pHitElementResult->GetAttributeValue(L"src"); + AppLog("MainForm::OnTouchLongPressed srcUrl is %ls",srcUrl.GetPointer()); + + ShareInfo* pShareInfo = new(std::nothrow) ShareInfo(); + pShareInfo->SetPageTitle(L""); + pShareInfo->SetPageUrl(srcUrl); + pShareInfo->SetImageAttached(true); + pShareInfo->SetImagePath(imagePath); + __pPopUp->RemoveAllShareInfo(); + __pPopUp->AddShareInfo(pShareInfo); + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + } + break; + case IDA_FIND_TEXT__CLICKED: + { + AppLogDebug("MainForm::OnActionPerformed find word clicked"); + __currentSearchStr.Clear(); + __currentSearchStr.Append(__currentSelectedStr); + InitFindWordPanel(); + if(__pMenu != null) + { + __pMenu->SetShowState(false); + __pMenu->Invalidate(false); + } + + __adressPanelPosition.y = 0; + + if (__pAddressbar != null && __pWebViewer != NULL) + { + __webControlPosition.y = __pAddressbar->GetHeight() - 12; + __pAddressbar->SetBounds(0,__adressPanelPosition.y,GetClientAreaBounds().width,__pAddressbar->GetHeight()); + __pAddressbar->Invalidate(true); + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width,__webControlHeight)); + __pWebViewer->Invalidate(true); + } + + ShowFindWordPanel(true); + if (__currentSearchStr.GetLength() > 0) + { + StartWordSearch(); + } + else + { + AppLogDebug("Enter something"); + } + + } + break; + case IDA_SHARE_TEXT_CLICKED: + { + AppLogDebug("IDA_SHARE_TEXT_CLICKED"); + if(__pPopUp != null) + { + delete __pPopUp; + __pPopUp = null; + } + __pPopUp = new(std::nothrow) SharePopup(); + __pPopUp->Initialize(); + if (__pHitElementResult != null) + { + ShareInfo* pShareInfo = new(std::nothrow) ShareInfo(); + pShareInfo->SetPageTitle(L""); + pShareInfo->SetPageUrl(__currentSelectedStr); + pShareInfo->SetImageAttached(false); + __pPopUp->RemoveAllShareInfo(); + __pPopUp->AddShareInfo(pShareInfo); + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + } + break; + case IDA_COPY_TEXT_CLICKED: + { + // need to implement + //__currentSelectedStr + // Sets data to a clip board item + ClipboardItem item; + String resourcePath = App::GetInstance()->GetAppResourcePath(); + item.Construct(CLIPBOARD_DATA_TYPE_TEXT, __currentSelectedStr); + + // copying the item to clipboard + Clipboard* pClipboard = Clipboard::GetInstance(); + if (pClipboard != null) + { + pClipboard->CopyItem(item); + } + } + break; + case IDA_PASTE_TEXT_CLICKED: + { + Clipboard* pClipboard = Clipboard::GetInstance(); + + if(pClipboard == null) + { + return; + } + // Retrieves a latest item + ClipboardItem* pItem = pClipboard->RetrieveLatestItemN(CLIPBOARD_DATA_TYPE_TEXT | CLIPBOARD_DATA_TYPE_HTML); + + if(pItem == null) + { + return; + } + //Gets data from the clipboard item + String* pString = dynamic_cast(pItem->GetData()); + + if (pString != null) + { + String idElement = __pHitElementResult->GetAttributeValue(L"id"); + AppLog("MainForm::IDA_PASTE_TEXT_CLICKED id is %ls",idElement.GetPointer()); + String script = L"function insertAtCursor(myField, myValue) { if (document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = myValue; } else if (myField.selectionStart || myField.selectionStart == '0'){ var startPos = myField.selectionStart; var endPos = myField.selectionEnd; myField.value = myField.value.substring(0, startPos)+ myValue + myField.value.substring(endPos, myField.value.length); } else { myField.value += myValue; } } insertAtCursor("; + script.Append(idElement); + script.Append(","); + script.Append("\""); + script.Append(*pString); + script.Append("\");"); + AppLog("MainForm::OnTouchLongPressed script is %ls",script.GetPointer()); + String* pStr = __pWebViewer->EvaluateJavascriptN(script); + delete pStr; + } + delete pItem; + } + break; + default: + break; + } +} + +void +MainForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + + UiApp* pApp = UiApp::GetInstance(); + if (pApp == null) + { + return; + } + pApp->Terminate(); +} + +void +MainForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + String* pSelectedScene = NULL; + Object* pValue = NULL; + String* pUrl = null; + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &pValue); + pSelectedScene = (String*) pValue; + + if (pSelectedScene != null) + { + delete pSelectedScene; + } + MultipleWindowPresentationModel::GetInstance()->SetValue(SELECTED_SCENE_ID, null); + String* selectedSceneID = new(std::nothrow) String(currentSceneId); + AppLogDebug("current scene id is %ls", currentSceneId.GetPointer()); + AppLogDebug("selected scene id is %ls", currentSceneId.GetPointer()); + + // setting the current scene ID + MultipleWindowPresentationModel::GetInstance()->SetCurrentSceneID(currentSceneId); + + MultipleWindowPresentationModel::GetInstance()->SetValue(SELECTED_SCENE_ID, (Object*) selectedSceneID); + + if(pArgs != null && pArgs->GetCount() > 0 && pArgs->GetCount() == 2) + { + __pWindowInfo = dynamic_cast< WindowInfo* >(pArgs->GetAt(0)); + // if(__pWindowInfo == null) + { + pUrl = dynamic_cast< String* >(pArgs->GetAt(1)); + } + } + else if ( pArgs != null && pArgs->GetCount() == 1) + { + __pWindowInfo = dynamic_cast< WindowInfo* >(pArgs->GetAt(0)); + } + + InitFooter(); + InitAddressbar(); + + if(__pWebViewer != null) + { + __pWebViewer->Resume(); + } + + if(pUrl != null && pUrl->GetLength() > 0) + { + LoadUrl(*pUrl); + } + else if(__pWindowInfo != null) + { + if(__pWindowInfo->pageUrl.GetLength() > 0 && previousSceneId != IDSCN_MULTIPLE_WINDOW && previousSceneId != IDSCN_MULTIPLE_WINDOW_GRID && previousSceneId != IDSCN_BOOKMARK_VIEW && previousSceneId != IDSCN_SETTINGS && previousSceneId != IDSCN_MAIN_VIEW) + { + LoadUrl(__pWindowInfo->pageUrl); + } + else if (__pWindowInfo->isJavascriptInitiated == true) + { + AppLog("Called"); + InitWebControl(); + __pWindowInfo->pCurrentWeb = __pWebViewer; + } + } + + String homePage = SettingPresentationModel::GetInstance()->GetHomepage(); + AppLog("Homepage Value in Onsceneactivated is %ls",homePage.GetPointer()); + if(homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + InitMostVisitedSitesView(GetOrientationStatus()); + } + + if (__pAddressbar != null && pArgs != null && (previousSceneId == IDSCN_BOOKMARK_VIEW || previousSceneId == IDSCN_HISTORY_LIST)) + { + String* pBookmarkUrl = dynamic_cast< String* >(pArgs->GetAt(0)); + + if (pBookmarkUrl == null) + return; + AppLogDebug("bookmarkUrl = %ls",pBookmarkUrl->GetPointer()); + __pAddressbar->SetUrl(*pBookmarkUrl); + + if (__pWebViewer != null && homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")) != 0) + __pWebViewer->LoadUrl(*pBookmarkUrl); + delete pBookmarkUrl; + } + + bool isPrivateBrowsing = SettingPresentationModel::GetInstance()->GetPrivateOn(); + Bitmap* pBitmap = null; + if (isPrivateBrowsing == true) + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_ON); + + if (__pWebViewer != null) + { + __pWebViewer->SetPrivateBrowsingEnabled(true); + } + + if (__pAddressbar != null) + { + __pAddressbar->UpdateFaviconBitmap(true); + } + + } + else + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_OFF); + + if (__pWebViewer != null) + { + __pWebViewer->SetPrivateBrowsingEnabled(false); + } + + if (__pAddressbar != null) + { + __pAddressbar->UpdateFaviconBitmap(false); + } + } + + if (__pMenu != null && __pMenu->GetItemCount() == 3) + { + __pMenu->SetItemAt(0,CommonUtil::GetString(L"IDS_BR_BODY_PRIVACY"),IDA_PRIVATEON_CLICKED,*pBitmap); + } + else if (__pMenu != null ) + { + __pMenu->SetItemAt(3,CommonUtil::GetString(L"IDS_BR_BODY_PRIVACY"),IDA_PRIVATEON_CLICKED,*pBitmap); + } + + if (pBitmap != null) + { + delete pBitmap; + } + + AppLog("ABC: OnSceneActivatedN started exit"); + +} + +void +MainForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + Canvas* pWebCanvas = null; + if (__pWebViewer != null) + { + pWebCanvas = __pWebViewer->GetCanvasN(); + __pWebViewer->Pause(); + + } + if (pWebCanvas == null) + { + return; + } + if (__pWindowInfo != null) + { + if (__pWindowInfo->pWebCanvasBitmap != null) + { + delete __pWindowInfo->pWebCanvasBitmap; + } + __pWindowInfo->pWebCanvasBitmap = new(std::nothrow) Bitmap(); + result r = __pWindowInfo->pWebCanvasBitmap->Construct(*pWebCanvas,Rectangle(0,0,pWebCanvas->GetBounds().width,pWebCanvas->GetBounds().height)); + AppLog("Bitmap Construction result %s",GetErrorMessage(r)); + } + Bitmap* pBitmap = GetCapturedBitmapN(); + AppLog("Coming here"); + Canvas* pCanvas = new(std::nothrow) Canvas(); + pCanvas->Construct(GetClientAreaBounds()); + if(pBitmap != null) + { + pCanvas->DrawBitmap(Point(0,0),*pBitmap); + delete pBitmap; + } + if(__pWebViewer != null && __pWindowInfo != null) + pCanvas->DrawBitmap(__pWebViewer->GetPosition(),*__pWindowInfo->pWebCanvasBitmap); + + WindowInfo::pFormCanvasBitmap = new(std::nothrow) Bitmap(); + WindowInfo::pFormCanvasBitmap->Construct(*pCanvas,Rectangle(0,0,GetClientAreaBounds().width,GetClientAreaBounds().height - __pFooterPanel->GetHeight())); + delete pCanvas; + AppLog("Coming here"); +} + +bool +MainForm::OnHttpAuthenticationRequestedN(const Tizen::Base::String& host, + const Tizen::Base::String& realm, + const Tizen::Web::Controls::AuthenticationChallenge& authentication) +{ + return false; +} + +void +MainForm::OnHttpAuthenticationCanceled(void) +{ +} + +void +MainForm::OnLoadingStarted(void) +{ + AppLogDebug("MainForm::OnLoadingStarted entered"); + __isLoaded = true; + if(__pAddressbar == NULL) + { + return; + } + Bitmap* pBitmap = FaviconManager::GetInstance()->GetDefaultFaviconN(); + __pAddressbar->SetFaviconBitmap(*pBitmap); + delete pBitmap; + if (__adressPanelPosition.y < (0 - __pAddressbar->GetHeight() + 12)) + { + // updating the address bar position with respect to web control + __adressPanelPosition.y = 0 - __pAddressbar->GetHeight() + 12; //-12 is for the progress label + __distanceMoved = 0; + MoveUiControls(); + } + + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING); + if (__pWebViewer) + { + AppLog("MainForm::OnLoadingStarted __pWebViewer->GetUrl() %ls",__pWebViewer->GetUrl().GetPointer()); + __pAddressbar->SetUrl(__pWebViewer->GetUrl()); + if (__pWindowInfo != NULL) + { + __pWindowInfo->pageUrl = __pWebViewer->GetUrl(); + } + __pAddressbar->Invalidate(true); + } + +} + +void +MainForm::OnLoadingCanceled(void) +{ + +} + + +void +MainForm::OnKeypadWillOpen(Tizen::Ui::Control& source) +{ + if(__pAddressbar != null) + { + OnAddressBarKeypadOpened(*__pAddressbar); + } +} + +void +MainForm::OnKeypadClosed(Tizen::Ui::Control& source){ + if(__pAddressbar != null) + { + OnAddressBarKeypadClosed(*__pAddressbar); + } +} + +void +MainForm::OnLoadingErrorOccurred(LoadingErrorType error, + const Tizen::Base::String& reason) +{ + AppLogDebug("Error: %d, %ls", error, reason.GetPointer()); +} + +void +MainForm::OnLoadingCompleted(void) +{ + DateTime date; + result r = E_SUCCESS; + + if (__pWebViewer == null) + { + return; + } + + if (__pAddressbar == null) + { + return; + } + if (__pWebViewer->CanGoForward()) + { + __pAddressbar->SetForwardButtonEnabled(true); + } + else + { + __pAddressbar->SetForwardButtonEnabled(false); + } + + if (__pWebViewer->CanGoBack()) + { + __pAddressbar->SetBackButtonEnabled(true); + } + else + { + __pAddressbar->SetBackButtonEnabled(false); + } + if (__pAddressbar->GetAddressbarMode() != ADDRESSBAR_MODE_EDIT) + { + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING_COMPLETE); + + __pAddressbar->UpdateProgress(0); + } + + AppLog("PrivateBrowsing %d",__pWebViewer->IsPrivateBrowsingEnabled()); + bool isPrivateBrowsing = SettingPresentationModel::GetInstance()->GetPrivateOn(); + if (isPrivateBrowsing == false) + { + History* pHistory = new(std::nothrow) History; + + HistoryPresentationModel::GetCurrentDateTime(date); + if(__pWindowInfo) + { + pHistory->SetHistoryTitle(__pWindowInfo->pageTitle); + AppLogDebug("MainForm::OnLoadingCompleted pagetitle = %ls", __pWindowInfo->pageTitle.GetPointer()); + + pHistory->SetHistoryUrl(__pWindowInfo->pageUrl); + AppLogDebug("MainForm::OnLoadingCompleted pageUrl = %ls", __pWindowInfo->pageUrl.GetPointer()); + } + pHistory->SetVisitedTime(date); + String id = ""; + if(__pWindowInfo) + id = FaviconManager::GetInstance()->SaveFavicon(*__pWindowInfo->pFavicon, __pWindowInfo->faviconUrl); + pHistory->SetFaviconId(id); + Canvas* pCanvas = __pWebViewer->GetCanvasN(); + Bitmap* pBitmap = new(std::nothrow) Bitmap(); + if ( pCanvas != null && pCanvas != null && pBitmap != null) + { + pBitmap->Construct(*pCanvas, pCanvas->GetBounds()); + pBitmap->Scale(Dimension(pBitmap->GetWidth()/4, pBitmap->GetHeight()/4)); + pHistory->SetThumbnail(pBitmap); + } + HistoryPresentationModel::GetInstance()->SaveHistory(*pHistory); + delete pHistory; + } + else + { + return; + } + if (__pWindowInfo && __pWindowInfo->faviconUrl == "") + { + // temperary fixed (webpage can be not loaded) + UpdateFavicon(); + } +} + +void +MainForm::OnEstimatedProgress(int progress) +{ + AppLogDebug("MainForm::OnEstimatedProgress entered"); + if (progress < DEFAULT_PROGRESS_PERCENTAGE) + progress = DEFAULT_PROGRESS_PERCENTAGE; + if(__pAddressbar) + __pAddressbar->UpdateProgress(progress); +} + +void +MainForm::OnUrlSubmitted(Addressbar& addBar) +{ + String url = addBar.GetUrl(); + LoadUrl(url); + __pFooterPanel->SetShowState(true); + __pFooterPanel->Invalidate(true); + RequestRedraw(true); +} + +void +MainForm::LoadUrl(String& url) +{ + AppLogDebug("MainForm::LoadUrl enter"); + + if (url.CompareTo(L"") == 0) + { + return; + } + if(__pFooterPanel != null) + { + __pFooterPanel->SetShowState(true); + __pFooterPanel->Invalidate(true); + } + InitWebControl(); + + bool ret = false; + bool flag = false; + + String firstPattern(L"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)"); + String secondPattern(L"^[A-Za-z0-9\.\+-:#@%/;$~?]+\\.[A-Za-z0-9\+-=:#@%/;$~()_?\\\.&]{2,}$"); // URL of type abc.com (i.e without protocol in front of it) + + RegularExpression firstRegex; + RegularExpression secondRegex; + + firstRegex.Construct(firstPattern, REGEX_CASELESS); + secondRegex.Construct(secondPattern, REGEX_CASELESS); + + // Match + ret = firstRegex.Match(url, false); // This returns true value + flag = secondRegex.Match(url, false); // Checks whether URL typed is of type abc.com (i.e without protocol in front of it) + + if (ret == true && __pWebViewer != null) + { + __pWebViewer->LoadUrl(url); + } + else if(__pWebViewer != null) + { + String tempUrl = L"http://"; + tempUrl.Append(url); + + if (flag == true) + { + __pWebViewer->LoadUrl(tempUrl); + } + else + { + __pWebViewer->LoadUrl(SettingPresentationModel::GetInstance()->GetSearchUrl(url)); + } + } + if (__pAddressbar != null) + { + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING); + } + + AppLogDebug("MainForm::LoadUrl exit"); + + return; + +} + +void +MainForm::OnStopClicked(Addressbar& addBar) +{ + AppLogDebug("MainForm::OnStopClicked called"); + if (__pWebViewer) + { + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING_COMPLETE); + __pWebViewer->StopLoading(); + RequestRedraw(true); + } +} + +void +MainForm::OnReaderClicked(const Addressbar& addBar) +{ + int bodyWidth = ((double)(GetClientAreaBounds().width))*0.73; + + CreateReaderPanel(); + AppLogDebug("MainScene::OnReaderClicked entered"); + + + /*if (__pArticleReaderPanel) + { + AppLogDebug("showstate true for reader panel"); + __pArticleReaderPanel->SetShowState(true); + __pArticleReaderPanel->Show(); + }*/ + int xPos = __pArticleReaderPanel->GetX(); + int yPos = __pArticleReaderPanel->GetY(); + AppLog("OnReaderClicked() xPos = %d",xPos); + AppLog("OnReaderClicked() yPos = %d",yPos); + + if (__pReaderData == null) + { + return; + } + + String loadData = L"\ + \ + \ + \ + \ + "); + AppLogDebug("data->GetLength %d",__pReaderData->GetLength()); + loadData.Append(*__pReaderData); + loadData.Append(L""); + + ByteBuffer buf ; + buf.Construct(loadData.GetLength()); + AppLogDebug("data->GetLength %d",loadData.GetLength()); + for (int z=0;zLoadData(L"",buf,L"text/html"); + AppLogDebug("LoadData result %s",GetErrorMessage(GetLastResult())); + } + else + { + AppLogDebug("cannot LoadData __pWebReader is null"); + } + +} + +void +MainForm::OnBackClicked(const Addressbar& addBar) +{ + if (__pWebViewer == null) + return; + + if (__pWebViewer->CanGoBack()) + { + __pWebViewer->GoBack(); + } + +} + +void +MainForm::OnForwardClicked(const Addressbar& addBar) +{ + if (__pWebViewer == null) + return; + + if (__pWebViewer->CanGoForward()) + { + __pWebViewer->GoForward(); + } +} + +void +MainForm::OnAddressCancelledClicked(const Addressbar& addBar) +{ + __pFooterPanel->SetShowState(true); + __pFooterPanel->Invalidate(false); +} + +void +MainForm::OnAddressBarModeChanged(const Addressbar& addBar) +{ + __prevAddressBarMode = __curAddressBarMode; + + if (__pAddressbar != null) + { + __curAddressBarMode = __pAddressbar->GetAddressbarMode(); + } + + if (__curAddressBarMode == ADDRESSBAR_MODE_EDIT) + { + __adressPanelPosition.y = 0; + if (__pAddressbar != null) + { + __webControlPosition.y = __pAddressbar->GetHeight() - 12; + __pAddressbar->SetBounds(Rectangle(0,0,GetClientAreaBounds().width,__pAddressbar->GetHeight())); + __pAddressbar->Invalidate(true); + } + if (__pWebViewer != null) + { + __pWebViewer->StopLoading(); + + } + + } + if (__pWebViewer != null) + { + if(__pFooterPanel->GetShowState() == false) + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, GetClientAreaBounds().height)); + else + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, __webControlHeight)); + __pWebViewer->Invalidate(true); + } +} + +void +MainForm::OnAddressBarKeypadClosed(const Addressbar& addBar) +{ + + if(__pFooterPanel != null) + { + String homePage = SettingPresentationModel::GetInstance()->GetHomepage(); + if (homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + InitMostVisitedSitesView(GetOrientationStatus()); + } + __pFooterPanel->SetShowState(true); + __pFooterPanel->Invalidate(false); + } + + + + //AppLogDebug("MainForm::OnAddressBarKeypadClosed enterd"); + + if (__pWebViewer != null && __pFooterPanel != null) + { + AppLog("MainForm::OnAddressBarKeypadClosed GetClientAreaBounds().height %d ", GetClientAreaBounds().height); + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + + if(__pFooterPanel->GetShowState() == false) + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, GetClientAreaBounds().height)); + else + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, __webControlHeight)); + __pWebViewer->Invalidate(false); + //__pWebViewer->SetBounds(Rectangle(0, 82, GetClientAreaBounds().width,webControlHeight)); + } + +} + +void +MainForm::OnAddressBarKeypadOpened(const Addressbar& addBar) +{ + __pFooterPanel->SetShowState(false); + __pFooterPanel->Invalidate(false); +} + +void +MainForm::OnAddressBarKeypadWillOpen(const Addressbar& addBar) +{ + __pFooterPanel->SetShowState(false); + __pFooterPanel->Invalidate(false); +} + +void +MainForm::OnPageTitleReceived(const Tizen::Base::String& title) +{ + if (__pWindowInfo) + { + __pWindowInfo->pageTitle = title; + if (__pWebViewer != null) + { + __pWindowInfo->pageUrl = __pWebViewer->GetUrl(); + } + } + if (__pAddressbar != null && __pWebViewer != null) + { + __pAddressbar->SetUrl(__pWebViewer->GetUrl()); + __pAddressbar->UpdateFaviconBitmap(SettingPresentationModel::GetInstance()->GetPrivateOn()); + __pAddressbar->Invalidate(true); + } + +} + +void +MainForm::UpdateFavicon(void) +{ + bool urlImageType = false; + String *tempPath = __pWebViewer->EvaluateJavascriptN(L"var getFavicon = function() { var favicon = '/favicon.ico'; var nodeList = document.getElementsByTagName('link'); if(nodeList) { for (var i = 0; i < nodeList.length; i++) { if ((nodeList[i].getAttribute('rel') == 'icon')||(nodeList[i].getAttribute('rel') == 'shortcut icon')) { favicon = nodeList[i].getAttribute('href'); } } } return favicon; }; getFavicon();"); + Bitmap* pBitmap = null; + + if (tempPath && tempPath->GetLength() > 0 && tempPath->CompareTo(L"undefined") != 0) + { + if (__pWindowInfo != null) + { + Uri url; + url.SetUri(*tempPath); + if (url.GetHost().GetLength() == 0) + { + Uri webUrl; + webUrl.SetUri(__pWebViewer->GetUrl()); + result r = url.SetHost(webUrl.GetHost()); + if(IsFailed(r)) + { + delete tempPath; + return; + } + } + if (url.GetScheme().GetLength() == 0) + { + Uri webUrl; + webUrl.SetUri(__pWebViewer->GetUrl()); + url.SetScheme(webUrl.GetScheme()); + } + __pWindowInfo->faviconUrl = url.ToString(); + + pBitmap = __pWebViewer->GetFaviconN(); + + if (pBitmap != null) + { + if (__pWindowInfo->pFavicon != NULL) + { + // delete __pWindowInfo->pFavicon; + __pWindowInfo->pFavicon = null; + } + __pWindowInfo->pFavicon = new(std::nothrow) Bitmap(); + __pWindowInfo->pFavicon->Construct(*pBitmap,Rectangle(0,0,pBitmap->GetWidth(),pBitmap->GetHeight())); + //bool isPrivateBrowsing = __pWebViewer->IsPrivateBrowsingEnabled(); + + __pAddressbar->SetFaviconBitmap(*__pWindowInfo->pFavicon); + + FaviconManager::GetInstance()->SaveFavicon(*__pWindowInfo->pFavicon, __pWindowInfo->faviconUrl); + } + else if(__pWindowInfo->pFavicon != null) + { + __pAddressbar->SetFaviconBitmap(*__pWindowInfo->pFavicon); + } + else + { + __pAddressbar->SetFaviconBitmap(*FaviconManager::GetInstance()->GetDefaultFaviconN()); + } + + AppLogDebug("Favicon download requested: url: %ls", url.ToString().GetPointer()); + } + delete tempPath; + } + else + { + delete tempPath; + AppLogDebug("Error occured: %s", GetErrorMessage(GetLastResult())); + } + +} + + +bool +MainForm::OnLoadingRequested(const Tizen::Base::String& url, + Tizen::Web::Controls::WebNavigationType type) +{ + if (__pWebViewer && __pAddressbar) + { + AppLog("__pWebViewer->GetUrl() %ls",__pWebViewer->GetUrl().GetPointer()); + __pAddressbar->SetUrl(__pWebViewer->GetUrl()); + __pAddressbar->UpdateProgress(DEFAULT_PROGRESS_PERCENTAGE); + + if (__pWindowInfo) + { + __pWindowInfo->pageTitle = CommonUtil::GetString(L"IDS_BR_BODY_ABOUT_C_BLANK"); + __pWindowInfo->pageUrl = __pWebViewer->GetUrl(); + __pWindowInfo->faviconUrl = ""; + __pWindowInfo->faviconFilePath = ""; + + if (__pWindowInfo->pFavicon != NULL) + { + // delete __pWindowInfo->pFavicon; + __pWindowInfo->pFavicon = null ; + } + __pWindowInfo->pFavicon = FaviconManager::GetInstance()->GetDefaultFaviconN(); + + } + + __pAddressbar->Invalidate(true); + } + return false; +} + +DecisionPolicy +MainForm::OnWebDataReceived(const Tizen::Base::String& mime, + const Tizen::Net::Http::HttpHeader& httpHeader) +{ + return Tizen::Web::Controls::WEB_DECISION_CONTINUE; +} + + +void +MainForm::OnWebPageBlockSelected(Tizen::Web::Controls::Web& source, Tizen::Graphics::Point& startPoint, Tizen::Graphics::Point& endPoint) +{ + AppLog("MainForm::OnWebPageBlockSelected"); + + if (__pHitElementResult != null) + { + delete __pHitElementResult; + __pHitElementResult = null; + } + + if (__pWebViewer != null) + { + AppLog("MainForm::OnWebPageBlockSelected web not null"); + __pHitElementResult = __pWebViewer->GetElementByPointN(startPoint); + } + + if (__pHitElementResult == null) + { + return; + } + + if (__pHitElementResult->HasImage() != true) + { + String tagName = __pHitElementResult->GetTagName(); + String type = __pHitElementResult->GetAttributeValue("type"); + + __currentSelectedStr.Clear(); + __currentSelectedStr = __pWebViewer->GetTextFromBlock(); + + if ((tagName.CompareTo(L"INPUT") == 0) || tagName.CompareTo(L"TEXTAREA") == 0) + { + AppLog("MainForm::OnWebPageBlockSelected show paste option"); + + InitSelectTextContextMenu(startPoint,true); + __pImageMenu->SetShowState(true); + __pImageMenu->Show(); + __pImageMenu->Invalidate(true); + } + else if (__pHitElementResult->HasUrl() == true || __currentSelectedStr.GetLength() > 0) + { + AppLog("MainForm::OnWebPageBlockSelected no paste option"); + + if(__pHitElementResult->GetUrl().GetLength() > 0) + { + __currentSelectedStr.Clear(); + __currentSelectedStr = __pHitElementResult->GetUrl(); + } + InitSelectTextContextMenu(startPoint,false); + __pImageMenu->SetShowState(true); + __pImageMenu->Show(); + __pImageMenu->Invalidate(true); + } + + AppLog("MainForm::OnWebPageBlockSelected block text is %ls",__currentSelectedStr.GetPointer()); + AppLog("MainForm::OnWebPageBlockSelected tag name is %ls",tagName.GetPointer()); + AppLog("MainForm::OnWebPageBlockSelected type name is %ls",type.GetPointer()); + } +} + +void +MainForm::OnWebPageShowRequested(Tizen::Web::Controls::Web& source) +{ + +} + +Web* +MainForm::OnWebWindowCreateRequested(void) +{ + WindowInfo* pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(); + + if (pNewWindowInfo == null) + { + return null; + } + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == NULL) + { + return null; + } + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList == NULL) + { + return null; + } + r = pArgList->Construct(); + if (r == E_SUCCESS) + { + pNewWindowInfo->isJavascriptInitiated = true; + pArgList->Add(*pNewWindowInfo); + r = pSceneManager->GoForward(ForwardSceneTransition(pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + delete pArgList; + if (IsFailed(r)) + { + AppLogDebug("EditHistoryListForm::OnFormBackRequested Failed to GoBackward %s",GetErrorMessage(r)); + return null; + } + } else { + delete pArgList; + } + + return pNewWindowInfo->pCurrentWeb; +} + +void +MainForm::RelayoutControls(bool showAddressbar) +{ + if (showAddressbar == false) + { + __pAddressbar->SetShowState(false); + __pWebViewer->SetBounds(__pWebViewer->GetX(), 0, __pWebViewer->GetWidth(), __webControlHeight); + __pFooterPanel->SetBounds(__pFooterPanel->GetX(), GetClientAreaBounds().height - __pFooterPanel->GetHeight(), __pFooterPanel->GetWidth(), __pFooterPanel->GetHeight()); + } + else + { + __pAddressbar->SetShowState(true); + __pWebViewer->SetBounds(__pWebViewer->GetX(), __pWebViewer->GetY(), __pWebViewer->GetWidth(), __webControlHeight); + __pFooterPanel->SetBounds(__pFooterPanel->GetX(), GetClientAreaBounds().height - __pFooterPanel->GetHeight(), __pFooterPanel->GetWidth(), __pFooterPanel->GetHeight()); + } + RequestRedraw(true); +} + +void MainForm::ShowFindWordPanel(bool show , bool isTouchPressed) +{ + if (__pFindWordPanel == null) + { + return; + } + if (show == true) + { + InitFindWordPanel(); + __pFindWordEditField->SetText(__currentSearchStr); + //__pFindWordCountLabel->SetText(L""); + __pFindWordCountLabel->SetShowState(false); + + } + + AppLog("MainForm::ShowFindWordPanel %d",show); + if (show && !isTouchPressed) + { + if (__pFindWordEditField) + __pFindWordEditField->ShowKeypad(); + } + else + { + if (__pFindWordEditField) + __pFindWordEditField->HideKeypad(); + } + + if (__pAddressbar != null) + { + __pAddressbar->SetShowState(!show); + __pAddressbar->Invalidate(true); + } + if (__pFindWordPanel != null) + { + __pFindWordPanel->SetShowState(show); + __pFindWordPanel->Invalidate(true); + } + Invalidate(true); +} + +void +MainForm::StartWordSearch() +{ + //Get the count of occurances of the word in the current page + __maxOccurrances = 0; + __currentWordIndex = 0; + + __pFindWordPrev->SetEnabled(false); + String *pCountStr = null; + __pWebViewer->SearchTextAllAsync(__currentSearchStr, false); + /*__pWebViewer->EvaluateJavascriptN(L"document.body.textContent.match(/" + __currentSearchStr + "/gi).length;"); + if (pCountStr != null) + { + Integer::Parse(*pCountStr, 10, __maxOccurrances); + delete pCountStr; + } + + AppLogDebug("'%ls' is found %d times", __currentSearchStr.GetPointer(), __maxOccurrances); + */ + +} + +void MainForm::OnTextFound(int totalCount, int currentOrdinal) +{ + AppLog("MainForm::OnTextFound totalCount %d",totalCount); + AppLog("MainForm::OnTextFound currentOrdinal %d",currentOrdinal); + + if(totalCount == -1 || totalCount == 0) + { + return; + } + + __maxOccurrances = totalCount; + __currentWordIndex = currentOrdinal; + + //Reset the UI controls as per the maxOccurrance value + if (totalCount <= 0) + { + AppLog("Word not found"); + //Show error notification to user + __pFindWordNext->SetEnabled(false); + __pFindWordCountLabel->SetText(L""); + __pFindWordNext->Invalidate(false); + __pFindWordPrev->Invalidate(false); + __pFindWordCountLabel->Invalidate(false); + return; + } + + if (totalCount == 1) + { + __pFindWordNext->SetEnabled(false); + } + else + { + __pFindWordNext->SetEnabled(true); + } + + String countStr = L""; + countStr.Append(__currentWordIndex); + countStr.Append(L"/"); + countStr.Append(__maxOccurrances); + __pFindWordCountLabel->SetText(countStr); + __pFindWordCountLabel->SetShowState(true); + __pFindWordCountLabel->Invalidate(false); + + //FindNextWord(true); + //Update the controls + __pFindWordNext->Invalidate(false); + __pFindWordPrev->Invalidate(false); + __pFindWordCountLabel->Invalidate(false); +} + +void +MainForm::FindNextWord(bool next) +{ + if (next == true) + { + if (__pWebViewer->SearchText(__currentSearchStr, true) == true) + { + if(__currentWordIndex < __maxOccurrances) + { + __currentWordIndex++; + } + } + } + else + { + if (__pWebViewer->SearchText(__currentSearchStr, false) == true) + { + if(__currentWordIndex > 0) + { + __currentWordIndex--; + } + } + } + + String countStr = L""; + countStr.Append(__currentWordIndex); + countStr.Append(L"/"); + countStr.Append(__maxOccurrances); + __pFindWordCountLabel->SetText(countStr); + __pFindWordCountLabel->SetShowState(true); + __pFindWordCountLabel->Invalidate(false); + if (__currentWordIndex >= __maxOccurrances) + { + __pFindWordNext->SetEnabled(false); + } + else + { + __pFindWordNext->SetEnabled(true); + } + if (__currentWordIndex <= 0) + { + __pFindWordPrev->SetEnabled(false); + } + else + { + __pFindWordPrev->SetEnabled(true); + } + __pFindWordPrev->Invalidate(false); + __pFindWordNext->Invalidate(false); + __pFindWordCountLabel->Invalidate(false); + __pFindWordPanel->Invalidate(true); +} +void +MainForm::OnWebKeypadWillOpen(Tizen::Web::Controls::Web& source) +{ + OnAddressBarKeypadOpened(*__pAddressbar); +} + +void +MainForm::OnWebKeypadOpened(Tizen::Web::Controls::Web& source) +{ + + if (__pWebViewer != null && __pFooterPanel != null) + { + AppLog("MainForm::OnOrientationChanged GetClientAreaBounds().height %d ", GetClientAreaBounds().height); + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + + if(__pFooterPanel->GetShowState() == false) + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, GetClientAreaBounds().height)); + else + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, __webControlHeight)); + + //__pWebViewer->SetBounds(Rectangle(0, 82, GetClientAreaBounds().width,webControlHeight)); + } +} + +void +MainForm::OnWebKeypadClosed(Tizen::Web::Controls::Web& source) +{ + OnAddressBarKeypadClosed(*__pAddressbar); +} + +void +MainForm::OnTouchDoublePressed(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + Control* temp = const_cast< Control* >(&source); + Header* pHeader = dynamic_cast< Header* >(temp); + if (pHeader != null) + { + //Header double - clicked + AppLog("Header double clicked"); + } + if(__pFindWordPanel) + { + AppLog("MainForm::OnTouchPressed %d",__pFindWordPanel->GetShowState()); + ShowFindWordPanel(__pFindWordPanel->GetShowState(), true); + } + + + AppLog("MainScene::OnTouchDoublePressed"); + bool isReaderEnabled = SettingPresentationModel::GetInstance()->IsRunReaderEnabled(); + if (isReaderEnabled == true) + { + if (__pReaderData) + { + delete __pReaderData; + __pReaderData = null; + } + String filePath = Tizen::App::UiApp::GetInstance()->GetAppRootPath(); + filePath.Append(L"data/reader.js"); + File file; + char buffer[10]; + char buffer2[5]; + int i; + int readCnt; + result r = E_SUCCESS; + FileAttributes attr; + + File::GetAttributes(filePath,attr); + // Creates file + r = file.Construct(filePath, L"r+"); + if (IsFailed(r)) + { + AppLogDebug("File construct failed with %s", GetErrorMessage(r)); + return; + } + char* pScript = new(std::nothrow) char[attr.GetFileSize()+1]; + if(pScript == null) + { + AppLogDebug("Memory allocation for file failed %s", GetErrorMessage(r)); + return; + } + file.Read(pScript,attr.GetFileSize()); + + AppLogDebug("scipt length %d",strlen(pScript)); + String strScript = L""; + strScript.Append(pScript); + __pReaderData = __pWebViewer->EvaluateJavascriptN(strScript); + if (!__pReaderData) + { + AppLog("MainScene::data is null Error :%s",GetErrorMessage(GetLastResult())); + return; + } + AppLogDebug("evaluateJavascript result %s , __pReaderData %ls",GetErrorMessage(GetLastResult()),__pReaderData->GetPointer()); + if (__pReaderData->CompareTo(L"undefined") != 0 && __pReaderData->CompareTo(L"") != 0) + { + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_READER); + } + delete[] pScript; + } +} + +void MainForm::OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLog("MainForm::OnTouchLongPressed"); + + if (__pHitElementResult != null) + { + delete __pHitElementResult; + __pHitElementResult = null; + } + + if (__pWebViewer != null) + { + AppLog("MainForm::OnTouchLongPressed web not null"); + __pHitElementResult = __pWebViewer->GetElementByPointN(currentPosition); + } + + if (__pHitElementResult == null) + { + return; + } + + if (__pHitElementResult->HasImage() == true) + { + InitImageContextMenu(currentPosition); + __pImageMenu->SetShowState(true); + __pImageMenu->Show(); + __pImageMenu->Invalidate(true); + } + else + { + String tagName = __pHitElementResult->GetTagName(); + String type = __pHitElementResult->GetAttributeValue("type"); + String value = __pHitElementResult->GetAttributeValue(L"value"); + String innerHtml = __pHitElementResult->GetAttributeValue(L"innerHTML"); + + __currentSelectedStr.Clear(); + __currentSelectedStr = __pWebViewer->GetTextFromBlock(); + + if (((tagName.CompareTo(L"INPUT") == 0) || tagName.CompareTo(L"TEXTAREA") == 0) && value.GetLength() == 0 && innerHtml.GetLength() == 0) + { + AppLog("MainForm::OnWebPageBlockSelected show paste option"); + + InitSelectTextContextMenu(currentPosition,true, true); + __pImageMenu->SetShowState(true); + __pImageMenu->Show(); + __pImageMenu->Invalidate(true); + } + __pWebViewer->SetBlockSelectionPosition(currentPosition); + + } + __inputEventToBeSupressed = true; +} + +void +MainForm::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLog("MainForm::OnTouchReleased"); + + HitElementResult* pHitElement = __pWebViewer->GetElementByPointN(currentPosition); + if(pHitElement != null && pHitElement->HasUrl() == true && __inputEventToBeSupressed == true) + { + __pWebViewer->ConsumeInputEvent(); + delete pHitElement; + } + __inputEventToBeSupressed = false; +} + +void +MainForm::OnOrientationChanged (const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + int widthContextItem = 0; + int heightContextItem = 72; + + + if( GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + widthContextItem = 800; + } + else + { + widthContextItem = 336; + } + + if( __pItemContext != NULL) + { + delete __pItemContext; + __pItemContext = null; + + } + __pItemContext= new(std::nothrow) ListContextItem(); + __pItemContext->Construct(); + Bitmap* pBitmapNormal = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete.9.png", widthContextItem,heightContextItem); + Bitmap* pBitmapPressed = CommonUtil::GetNinepatchedBitmapN(L"00_button_sweep_delete_press.9.png", widthContextItem, heightContextItem); + + if (pBitmapNormal != null && pBitmapPressed != null) + { + __pItemContext->AddElement(IDA_CONTEXT_ITEM_DELETE, CommonUtil::GetString(L"IDS_BR_SK_DELETE_ABB"), *pBitmapNormal, *pBitmapPressed, pBitmapPressed); + } + + if (pBitmapNormal != null) + { + delete pBitmapNormal; + } + + if (pBitmapPressed != null) + { + delete pBitmapPressed; + } + + + if (__pFindWordPanel != null && __pFindWordPanel->GetShowState() == true) + { + __pFindWordPanel->SetBounds(0,0,GetClientAreaBounds().width,__pFindWordPanel->GetHeight()); + __pFindWordControl->SetBounds(0,0, __pFindWordPanel->GetWidth(), __pFindWordPanel->GetHeight()); + __pFindWordControl->SetShowState(true); + __pFindWordControl->Invalidate(true); + __pFindWordPanel->SetShowState(true); + __pFindWordPanel->Invalidate(true); + } + + if (__pWebViewer != null && __pFooterPanel != null) + { + AppLog("MainForm::OnOrientationChanged GetClientAreaBounds().height %d ", GetClientAreaBounds().height); + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + + if(__pFooterPanel->GetShowState() == false) + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, GetClientAreaBounds().height)); + else + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, __webControlHeight)); + + //__pWebViewer->SetBounds(Rectangle(0, 82, GetClientAreaBounds().width,webControlHeight)); + } + if (__pAddressbar != null) + { + __pAddressbar->SetBounds(Rectangle(0,0,GetClientAreaBounds().width,__pAddressbar->GetHeight())); + __pAddressbar->SetAddressbarMode(__pAddressbar->GetAddressbarMode()); + __pAddressbar->UpdateFaviconBitmap(SettingPresentationModel::GetInstance()->GetPrivateOn()); + } + if (__pFindWordBgLabel != null) + { + // __pFindWordBgLabel->SetSize(GetClientAreaBounds().width,GetClientAreaBounds().height); + Bitmap *pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_search_input_field_bg.9.png", __pFindWordBgLabel->GetWidth(), __pFindWordBgLabel->GetHeight()); + if (pBitmap != null) + { + __pFindWordBgLabel->SetBackgroundBitmap(*pBitmap); + delete pBitmap; + } + } + if (__pFooterPanel /*&& __pFooterPanel->GetShowState() == true*/) + { + AppLog("__pFooterPanel->GetShowState() is true"); + InitFooter(); + } + InitAddressbar(); + + if(__pMoreButton && __pMenu) + { + Point p = Point(__pMoreButton->GetX() + __pMoreButton->GetWidth() / 2, GetBounds().height - __pMoreButton->GetHeight()); + __pMenu->SetAnchorPosition(p); + __pMenu->Invalidate(true); + } + + if (__pFooterPanel) + { + __pFooterPanel->Invalidate(true); + } + String homePage = SettingPresentationModel::GetInstance()->GetHomepage(); + if (homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + InitMostVisitedSitesView(orientationStatus); + } + + AppLog("OnOrientationChanged 0"); + if (__pArticleReaderPanel != null) + { + + if (__pArticleReaderPanel->GetShowState() == true) + { + __pArticleReaderPanel->SetBounds((GetClientAreaBounds().width - __pArticleReaderPanel->GetWidth())/2,(GetClientAreaBounds().height - __pArticleReaderPanel->GetHeight())/2, __pArticleReaderPanel->GetWidth(), __pArticleReaderPanel->GetHeight()); + + if (__pBlankPanel != null) + __pBlankPanel->SetBounds(0,0,GetClientAreaBounds().width,GetClientAreaBounds().height); + + if (__pWebReader != null) + { + __pWebReader->SetBounds(Rectangle(2,2, __pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight() - 96)); + } + Bitmap* pBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_popup_bg.9.png",__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()); + Bitmap* pSrcBitmap = CommonUtil::GetNinepatchedBitmapN(L"I01_popup_bottom_bg.9.png",__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight()); + + if ( pBitmap != null && pSrcBitmap != null) + { + AppLog("CreateReaderPanel ninepatchbitmap found"); + pBitmap->Merge(Point(0,__pArticleReaderPanel->GetHeight() - 96),*pSrcBitmap,Rectangle(0,0,pSrcBitmap->GetWidth(),pSrcBitmap->GetHeight())); + } + + __pArticleReaderLabel->SetBounds(Rectangle(__pArticleReaderPanel->GetX(),__pArticleReaderPanel->GetY(),__pArticleReaderPanel->GetWidth(),__pArticleReaderPanel->GetHeight())); + __pArticleReaderLabel->SetBackgroundBitmap(*pBitmap); + if (pBitmap != null) + { + delete pBitmap; + pBitmap = null; + } + if (pSrcBitmap != null) + { + delete pSrcBitmap; + pSrcBitmap = null; + } + } + } + Invalidate(true); + if(__pAddressbar != null) + { + __pAddressbar->OrientationChanged(); + } +} + +void +MainForm::OnSettingsChange(int settingvalue) +{ + AppLogDebug("MainForm::OnSettingsChange entered"); + if (__pWebViewer == null) + { + AppLogDebug("Webviewer is not initialized yet."); + return; + } + if (settingvalue == (int) REGISTRY_SETTING_DEFAULT_VIEW) + { + WebSetting settings = __pWebViewer->GetSetting(); + if (SettingPresentationModel::GetInstance()->GetDefaultView().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_FIT_TO_WIDTH")) == 0) + { + settings.SetAutoFittingEnabled(true); + } + else if (SettingPresentationModel::GetInstance()->GetDefaultView().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_READABLE")) == 0) + { + settings.SetAutoFittingEnabled(false); + } + __pWebViewer->SetSetting(settings); + } + else if (settingvalue == (int) REGISTRY_SETTING_RUN_JAVASCRIPT) + { + WebSetting settings = __pWebViewer->GetSetting(); + settings.SetJavascriptEnabled(SettingPresentationModel::GetInstance()->IsRunJavascriptEnabled()); + __pWebViewer->SetSetting(settings); + } + else if (settingvalue == (int) REGISTRY_SETTING_DISPLAY_IMAGES) + { + WebSetting settings = __pWebViewer->GetSetting(); + settings.SetAutoImageLoadEnabled(SettingPresentationModel::GetInstance()->IsDisplayImagesEnabled()); + __pWebViewer->SetSetting(settings); + } + else if (settingvalue == (int) REGISTRY_SETTING_BLOCK_POPUP) + { + WebSetting settings = __pWebViewer->GetSetting(); + settings.SetJavaScriptPopupEnabled(SettingPresentationModel::GetInstance()->IsBlockPopUp()); + __pWebViewer->SetSetting(settings); + } + else if (settingvalue == (int) REGISTRY_SETTING_ACCEPT_COOKIES) + { + if (__pWebViewer) + { + __pWebViewer->SetCookieEnabled(SettingPresentationModel::GetInstance()->IsCookiesEnabled()); + } + } + + else if (settingvalue == (int) REGISTRY_SETTING_SHOW_SECURITY_WARNINGS) + { + WebSetting settings = __pWebViewer->GetSetting(); + if (SettingPresentationModel::GetInstance()->IsSecurityWarningsEnabled() == true) + { + settings.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM); + } + else + { + settings.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_CONTINUE); + } + __pWebViewer->SetSetting(settings); + } + else if (settingvalue == (int) REGISTRY_SETTING_READER_FONT_SIZE) + { + if (__pWebReader) + { + AppLogDebug("IntMainForm fontsize Changed to %d",SettingPresentationModel::GetInstance()->GetReaderFontSize()); + WebSetting settings = __pWebReader->GetSetting(); + settings.SetFontSize(SettingPresentationModel::GetInstance()->GetReaderFontSize()); + __pWebReader->SetSetting(settings); + } + } +} + +void +MainForm::OnSettingsReset() +{ + if (__pWebViewer) + { + __pWebViewer->SetCookieEnabled(SettingPresentationModel::GetInstance()->IsCookiesEnabled()); + __pWebViewer->SetSetting(SettingPresentationModel::GetInstance()->GetWebSettings()); + } +} + +void +MainForm::OnClearCache() +{ + result r = E_SUCCESS; + + if (__pWebViewer != NULL) + { + r = __pWebViewer->ClearCache(); + if (r == E_SUCCESS) + { + AppLogDebug("Cache cleared success"); + } + else + { + AppLogDebug("Cache cleared fail"); + } + } +} + +void +MainForm::OnClearCookie() +{ + result r = E_SUCCESS; + + if (__pWebViewer != NULL) + { + __pWebViewer->ClearCookie(); + } + if (r == E_SUCCESS) + { + AppLogDebug("Cookie cleared success"); + } + else + { + AppLogDebug("Cache cleared fail"); + } +} + +double +MainForm::findDistance(int x1,int y1,int x2, int y2) +{ + int deltaX = Math::Abs(x2 - x1); + int deltaY = Math::Abs(y2 - y1); + double num = deltaX*deltaX + deltaY*deltaY; + + if (num >= 0) + { + double x = num; + int i; + for (i = 0; i < 20; i++) + { + x = (((x*x)+ num)/(2*x)); + } + return num; + } + else + { + return 0.0; + } +} + +void +MainForm::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + if(__pFindWordPanel) + { + AppLog("MainForm::OnTouchPressed %d",__pFindWordPanel->GetShowState()); + ShowFindWordPanel(__pFindWordPanel->GetShowState(), true); + } + + if (__pFindWordEditField != null) + { +// __pWebViewer->SearchText(L"aaaabbbbcccc",true); +// __pFindWordEditField->HideKeypad(); + } + + Touch touch; + IList* pList = null; + pList = touch.GetTouchInfoListN(source); + + if (pList != null) + { + int count = pList->GetCount(); + if (count == 1) + { + TouchInfo* pTouchInfo = static_cast(pList->GetAt(0)); + __touchPoint1 = pTouchInfo->position; + + if (__pAddressbar != null) + { + if (__pAddressbar->GetAddressbarMode() != ADDRESSBAR_MODE_LOADING_COMPLETE && __pAddressbar->GetAddressbarMode() != ADDRESSBAR_MODE_LOADING) + { + if (__pAddressbar->GetAddressbarMode() == ADDRESSBAR_MODE_EDIT) + { + __pAddressbar->SaveAddressbarEditText(); + } + __pAddressbar->SetAddressbarMode((AddressBarMode)ADDRESSBAR_MODE_LOADING_COMPLETE); + } + + __pAddressbar->Invalidate(true); + } + } + else if (count == 2) + { + AppLogDebug("MainForm::OnTouchPressed count is two"); + TouchInfo* pTouchInfo = static_cast(pList->GetAt(0)); + __touchPoint1 = pTouchInfo->position; + + pTouchInfo = static_cast(pList->GetAt(1)); + __touchPoint2 = pTouchInfo->position; + } + } + if( pList != NULL) + + { + pList->RemoveAll(true); + delete pList; + } + return; +} + +void +MainForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLog("Start MainForm::OnTouchMoved MoveUiControls"); + if(__pFindWordPanel) + { + AppLog("MainForm::OnTouchPressed %d",__pFindWordPanel->GetShowState()); + ShowFindWordPanel(__pFindWordPanel->GetShowState(), true); + } + + if (__pFindWordEditField != null) + { + __pFindWordEditField->HideKeypad(); + } + + if (__pAddressbar->GetAddressbarMode() == ADDRESSBAR_MODE_EDIT) + { + return; + } + static int Count=0; + Touch touch; + IList* pList = null; + pList = touch.GetTouchInfoListN(source); + + if (pList != null) + { + int count = pList->GetCount(); + if (count == 1) + { + AppLogDebug("MainForm::OnTouchMoved count 1"); + TouchInfo* pTouchInfo = static_cast(pList->GetAt(0)); + + if( pTouchInfo == NULL ) + { + return; + } + pTouchInfo->position.y += __pWebViewer->GetY(); + AppLog("MainForm::OnTouchMoved MoveUiControls %d,%d",pTouchInfo->position.x,pTouchInfo->position.y); + + if (__isLoaded == false) + return; + + __distanceMoved = pTouchInfo->position.y - __touchPoint1.y; + __touchPoint1 = pTouchInfo->position; + + // move the address bar and web control according to distance moved + MoveUiControls(); + } + else if (count == 2) + { + AppLogDebug("MainForm::OnTouchMoved count 2"); + + if(Count == 10) + { + TouchInfo* pTouchInfo = static_cast(pList->GetAt(0)); + + if( pTouchInfo == NULL ) + { + return; + } + Point firstPoint = pTouchInfo->position; + + pTouchInfo = static_cast(pList->GetAt(1)); + if( pTouchInfo == NULL ) + { + return; + } + Point secondPoint = pTouchInfo->position; + + if (__touchPoint1 == Point(-1,-1) || __touchPoint2 == Point(-1,-1)) + { + __touchPoint1 = firstPoint; + __touchPoint2 = secondPoint; + delete pList; + return; + } + + int currX1 = firstPoint.x; + int currY1 = firstPoint.y; + int currX2 = secondPoint.x; + int currY2 = secondPoint.y; + + double prevDist = findDistance(__touchPoint1.x,__touchPoint1.y,__touchPoint2.x,__touchPoint2.y); + double dist = findDistance(currX1, currY1, currX2, currY2); + __distanceMoved = prevDist - dist; + + __touchPoint1 = firstPoint; + __touchPoint2 = secondPoint; + MoveUiControls(); + Count = 0; + } + } + Count++; + delete pList; + } + +} + +void +MainForm::MoveUiControls() +{ + __adressPanelPosition.y = __adressPanelPosition.y + __distanceMoved; + if(__pAddressbar == NULL) + { + return; + } + + if (__adressPanelPosition.y > 0) + { + __adressPanelPosition.y = 0; + __webControlPosition.y = __pAddressbar->GetHeight() - 12; + } + else if (__adressPanelPosition.y < (0-(__pAddressbar->GetHeight() - 12))) // -12 is for the progress label + { + __adressPanelPosition.y = 0-(__pAddressbar->GetHeight() - 12); + __webControlPosition.y = 0; + // result r = __pWebViewer->SetScrollEnabled(true); + // AppLog("letmetestscrollenabled true %s pos %d,%d",GetErrorMessage(r),__adressPanelPosition.x,__adressPanelPosition.y); + } + else + { + // result r = __pWebViewer->SetScrollEnabled(false); + // __pWebViewer->Invalidate(true); + // AppLog("letmetestscrollenabled false %s pos %d,%d",GetErrorMessage(r),__adressPanelPosition.x,__adressPanelPosition.y); + __webControlPosition.y = __adressPanelPosition.y + (__pAddressbar->GetHeight() - 12); + } + + AppLogDebug("__adressPanelPosition.y = %d, __webControlPosition.y = %d", __adressPanelPosition.y, __webControlPosition.y); + + __pAddressbar->SetBounds(0,__adressPanelPosition.y,__pAddressbar->GetWidth(),__pAddressbar->GetHeight()); + __pAddressbar->Invalidate(false); + + if (__pWebViewer != NULL) + { + if(__pFooterPanel->GetShowState() == true) + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + else + __webControlHeight = GetClientAreaBounds().height; + __pWebViewer->SetBounds(Rectangle(0,__webControlPosition.y,GetClientAreaBounds().width, __webControlHeight)); + __pWebViewer->Invalidate(false); + } +} + +void +MainForm::OnTextValueChanged (const Tizen::Ui::Control &source) +{ + if (__pFindWordEditField != null) + { + __currentSearchStr = __pFindWordEditField->GetText(); + __pFindWordNext->SetEnabled(false); + __pFindWordPrev->SetEnabled(false); + __pFindWordNext->Invalidate(true); + __pFindWordPrev->Invalidate(true); + __pFindWordCountLabel->SetText(""); + __pFindWordCountLabel->SetShowState(false); + __pFindWordCountLabel->Invalidate(true); + } + AppLog("__currentSearchStr %ls",__currentSearchStr.GetPointer()); + if (__currentSearchStr.GetLength() > 0) + { + StartWordSearch(); + } + else + { + AppLogDebug("Enter something"); + } +} + +result +MainForm::InitMostVisitedSitesPanel(Tizen::Ui::OrientationStatus orientationStatus) +{ + return E_SUCCESS; + +} + +result +MainForm::InitMostVisitedSitesView(Tizen::Ui::OrientationStatus orientationStatus) +{ + if(__pWebViewer != null) + return E_SUCCESS; + + AppLog("MainForm::InitMostVisitedSitesView"); + result r = E_SUCCESS; + + + if (__pWebViewer != null && __pMostVisitedListView != null) + { + return E_SUCCESS; + } + + if (__pMostVisitedListView != null) + { + RemoveControl(*__pMostVisitedListView); + } + if(__pMostVisitedSites != null) + { + __pMostVisitedSites->RemoveAll(true); + } + + HistoryPresentationModel::GetInstance()->GetMostVisitedSites(*__pMostVisitedSites); + + __webControlHeight = GetClientAreaBounds().height - __pFooterPanel->GetHeight(); + __pMostVisitedListView = new(std::nothrow) ListView(); + if(__pFooterPanel->GetShowState() == false) + { + r = __pMostVisitedListView->Construct(Tizen::Graphics::Rectangle(0,__pAddressbar->GetBounds().y + __pAddressbar->GetHeight() , GetClientAreaBounds().width, GetClientAreaBounds().height),true,false); + } + else + { + r = __pMostVisitedListView->Construct(Tizen::Graphics::Rectangle(0,__pAddressbar->GetBounds().y + __pAddressbar->GetHeight() , GetClientAreaBounds().width, __webControlHeight),true,false); + } + + if (r != E_SUCCESS) + { + delete __pMostVisitedListView; + AppLogDebug("Addressbar init failed with %s", GetErrorMessage(r)); + return r; + } + __pMostVisitedListView->SetItemProvider(*this); + __pMostVisitedListView->AddListViewItemEventListener(*this); + // __pMostVisitedListView->SetBackgroundColor(Color(0,0,0)); + __pMostVisitedListView->SetTextOfEmptyList(CommonUtil::GetString(L"IDS_BR_BODY_NO_RECENTLY_VISITED_SITES")); + AddControl(*__pMostVisitedListView); + AppLog("__pMostVisitedSitesPanel addcontrol %s",GetErrorMessage(r)); + if(__pFooterPanel->GetShowState() == false) + __pMostVisitedListView->SetBounds(Tizen::Graphics::Rectangle(0,__pAddressbar->GetBounds().y + __pAddressbar->GetHeight()-12 , GetClientAreaBounds().width, GetClientAreaBounds().height - __pAddressbar->GetHeight() + 14)); + else + __pMostVisitedListView->SetBounds(Tizen::Graphics::Rectangle(0,__pAddressbar->GetBounds().y + __pAddressbar->GetHeight()-12 , GetClientAreaBounds().width, GetClientAreaBounds().height - __pAddressbar->GetHeight() - __pFooterPanel->GetHeight() + 14)); + + __pMostVisitedListView->UpdateList(); + // __pMostVisitedSitesPanel->Invalidate(true); + + // Invalidate(true); + return E_SUCCESS; + +} + +String +MainForm::GetImagePath(void) +{ + + String str; + String formattedTime; + DateTime currentTime; + LocaleManager localManager; + SystemTime::GetCurrentTime(TIME_MODE_WALL, currentTime); + + localManager.Construct(); + Locale locale = localManager.GetSystemLocale(); + //Locale locale(LANGUAGE_ENG, COUNTRY_US); + + // Get date formatter + DateTimeFormatter* pTimeFormatter = DateTimeFormatter::CreateDateTimeFormatterN(locale, DATE_TIME_STYLE_DEFAULT); + + if (pTimeFormatter) + { + pTimeFormatter->Format(currentTime, formattedTime); + } + + AppLog("current time stamp is %ls", formattedTime.GetPointer()); + String delim(L" :"); + StringTokenizer strTok(formattedTime, delim); + String token; + String imageName; + String str1("GMT+00"); + while (strTok.HasMoreTokens()) + { + strTok.GetNextToken(token); // Osp, StringTokenizer, Sample, code + if(token.Equals(str1)) + break; + AppLog("token is %ls", token.GetPointer()); + imageName.Append(token); + } + return imageName; + +} + +void MainForm::UpdateImageContent(ByteBuffer* aBuffer, String imageName) +{ + result r = E_FAILURE; + AppLog("Content manager 1"); + ContentId contentId; + ContentManager contentManager; + r = contentManager.Construct(); + if(IsFailed(r)) + { + AppLog("Content manager update content result %s" ,GetErrorMessage(r)); + return; + } + Tizen::Base::String contentPath = Tizen::System::Environment::GetMediaPath() + L"Downloads/"; + contentPath.Append(imageName); + contentPath.Append(".jpg"); + contentId = contentManager.CreateContent(*aBuffer, contentPath); + AppLog("Content manager update content result %s" ,GetErrorMessage(GetLastResult())); +} diff --git a/src/IntMainFrame.cpp b/src/IntMainFrame.cpp new file mode 100644 index 0000000..cc7f5a1 --- /dev/null +++ b/src/IntMainFrame.cpp @@ -0,0 +1,57 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet InternetFrame class +/*@file: IntInternetFrame.cpp + *@brief: Internet Frame + */ + +#include "IntMainFrame.h" +#include "IntSceneRegister.h" + +using namespace Tizen::Base; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +MainFrame::MainFrame(void) +{ +// SetBackgroundColor(Tizen::Graphics::Color(255,255,255)); +} + +MainFrame::~MainFrame(void) +{ +} + +result +MainFrame::OnInitializing(void) +{ + result r = E_SUCCESS; + + // SceneManagement initializing + SceneRegister::RegisterAllScenes(); + + + return r; +} + +result +MainFrame::OnTerminating(void) +{ + result r = E_SUCCESS; + + return r; +} diff --git a/src/IntMultipleWindowForm.cpp b/src/IntMultipleWindowForm.cpp new file mode 100644 index 0000000..133968c --- /dev/null +++ b/src/IntMultipleWindowForm.cpp @@ -0,0 +1,611 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet MultipleWindowForm class +/*@file: MultipleWindowForm.cpp + *@brief: The MultipleWindowForm provides multiple instance of mainscenes and displays them in a Listview + * + */ + +#include +#include + +#include "IntCommonLib.h" +#include "IntConfirmationPopup.h" +#include "IntMainForm.h" +#include "IntMultipleWindowForm.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntSceneRegister.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +MultipleWindowForm::MultipleWindowForm(void) +: __pList(null) +, __pListIconImage(null) +, __pListDeleteImage(null) +{ +} + +MultipleWindowForm::~MultipleWindowForm(void) +{ + if (__pListIconImage) + { + delete __pListIconImage; + __pListIconImage = null; + } + if (__pListDeleteImage) + { + delete __pListDeleteImage; + __pListDeleteImage = null; + } +} + +bool +MultipleWindowForm::Initialize(void) +{ + result r = E_SUCCESS; + + r = Construct(L"IDL_MULTIPLE_WINDOW"); + if (r == E_SUCCESS) + { + return true; + } + else + { + return false; + } +} + +result +MultipleWindowForm::OnInitializing(void) +{ + result r = E_SUCCESS; + FooterItem closeButton; + FooterItem newButton; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return E_FAILURE; + } + + Footer* pFooter = GetFooter(); + + if (pFooter == NULL) + { + return E_FAILURE; + } + + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_INDICATOR | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + + r = pSceneManager->AddSceneEventListener(IDSCN_MULTIPLE_WINDOW, *this); + + // Setup back event listener + SetFormBackEventListener(this); + pFooter->AddActionEventListener(*this); + + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + + if (pAppResource) + { + __pListIconImage = pAppResource->GetBitmapN(L"ListIcon.png"); + __pListDeleteImage = pAppResource->GetBitmapN(L"deleteIcon.png"); + } + + __pList = static_cast< ListView* >(GetControl(L"IDC_LISTVIEW")); + + if (__pList != null) + { + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + } + + AddOrientationEventListener(*this); +// r = pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + r = closeButton.Construct(IDA_BUTTON_CLOSEALL); + r = closeButton.SetText(CommonUtil::GetString(L"IDS_BR_CLOSE_ALL")); + r = pFooter->AddItem(closeButton); + r = newButton.Construct(IDA_BUTTON_NEW); + r = newButton.SetText(CommonUtil::GetString(L"IDS_BR_SK1_NEW_WINDOW")); + r = pFooter->AddItem(newButton); + + return r; +} + +void +MultipleWindowForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + if (MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList()->GetCount() >= 9) + { + GetFooter()->SetItemEnabled(1,false); + } + else + { + GetFooter()->SetItemEnabled(1,true); + } + if (__pList) + { + __pList->UpdateList(); + } + GetFooter()->Invalidate(true); + return; +} + +void +MultipleWindowForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + if (__pListIconImage) + { + delete __pListIconImage; + __pListIconImage = NULL; + } + return; +} + +result +MultipleWindowForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + if (__pListIconImage) + { + delete __pListIconImage; + __pListIconImage = NULL; + } + if (__pListDeleteImage) + { + delete __pListDeleteImage; + __pListDeleteImage = NULL; + } + + return r; +} + +void +MultipleWindowForm::OnActionPerformed(const Control& source, int actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return; + } + + String closeWarning = CommonUtil::GetString(L"IDS_BR_CLOSE_ALL_WINDOWS_Q"); + + switch (actionId) + { + case IDA_BUTTON_NEW: + { + WindowInfo* pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(); + + if (pNewWindowInfo == null) + { + return; + } + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == NULL) + { + return; + } + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList == NULL) + { + return; + } + pArgList->Construct(); + + pArgList->Add(*pNewWindowInfo); + r = pSceneManager->GoForward(ForwardSceneTransition(pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("MultipleWindowForm::OnActionPerformed GoForward failed %s",GetErrorMessage(r)); + return; + } + } + break; + + case IDA_BUTTON_BACK: + { + String* pSelectedScene = NULL; + Object* value = NULL; + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &value); + pSelectedScene = (String*) value; + + if (pSelectedScene) + { + result r = pSceneManager->GoBackward(BackwardSceneTransition(*pSelectedScene, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); + delete pSelectedScene; + pSelectedScene = null; + if(IsFailed(r)) + { + AppLogDebug("MultipleWindowForm::OnActionPerformed GoForward failed %s",GetErrorMessage(r)); + return; + } + } + } + break; + + case IDA_BUTTON_CLOSEALL: + { + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(closeWarning); + __pConfirmationPopup->Show(); + + } + break; + case IDA_CONFIRMATION_NO: + { + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + } + break; + case IDA_CONFIRMATION_YES: + { + ArrayList* pAllWindowList = MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList(); + if (pAllWindowList == NULL) + { + return; + } + int totalCount = pAllWindowList->GetCount(); + + for (int count = 0; count < totalCount; count++) + { + WindowInfo* pWindowInfo = dynamic_cast< WindowInfo* >(pAllWindowList->GetAt(count)); + SceneRegister::DestroyAndUnRegisterScene(pWindowInfo->sceneID); + } + pAllWindowList->RemoveAll(true); + WindowInfo* pNewWindowInfo = MultipleWindowPresentationModel::GetInstance()->CreateNewMainViewScene(); + + if (pNewWindowInfo == null) + { + return; + } + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == NULL) + { + return; + } + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList == NULL) + { + return; + } + r = pArgList->Construct(); + if (r == E_SUCCESS) + { + pArgList->Add(*pNewWindowInfo); + result r = pSceneManager->GoForward(ForwardSceneTransition(pNewWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + if(IsFailed(r)) + { + AppLogDebug("MultipleWindowForm::OnActionPerformed GoForward failed %s",GetErrorMessage(r)); + return; + } + } + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + } + break; + default: + break; + } + +} + +void +MultipleWindowForm::OnFormBackRequested(Form& source) +{ + + String* pSelectedScene = NULL; + Object* value = NULL; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &value); + pSelectedScene = (String*) value; + if (pSelectedScene != NULL) + { + result r = pSceneManager->GoBackward(BackwardSceneTransition(*pSelectedScene, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); +// delete pSelectedScene; + if(IsFailed(r)) + { + AppLogDebug("MultipleWindowForm::OnFormBackRequested GoForward failed %s",GetErrorMessage(r)); + return; + } + } + return; +} + +void +MultipleWindowForm::OnListViewContextItemStateChanged(ListView& listView, int index, int elementId, ListContextItemStatus state) +{ + return; +} + +void +MultipleWindowForm::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status) +{ + result r = E_SUCCESS; + ArrayList* pAllWindowList = MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList(); + int count = 0; + + if (elementId == IDA_FORMAT_DELETE_BITMAP) + { + // get current scene ID and check if it is matching with deleted scene id + WindowInfo* pWindowInfo = dynamic_cast< WindowInfo* >(pAllWindowList->GetAt(index)); + String* pSelectedScene = NULL; + Object* pValue = NULL; + + if (pWindowInfo) + { + SceneRegister::DestroyAndUnRegisterScene(pWindowInfo->sceneID); + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &pValue); + pSelectedScene = (String*) pValue; + pAllWindowList->RemoveAt(index, true); + if (pSelectedScene->CompareTo(pWindowInfo->sceneID) == 0) + { + //set current scene id to last scene id + int totalCount = pAllWindowList->GetCount() - 1; + WindowInfo* pLastIndexWindowInfo = dynamic_cast< WindowInfo* >(pAllWindowList->GetAt(totalCount)); + if (pLastIndexWindowInfo != NULL) + { + String* pSelectedSceneID = new(std::nothrow) String(pLastIndexWindowInfo->sceneID); + if (pSelectedSceneID != NULL) + { + MultipleWindowPresentationModel::GetInstance()->SetValue(SELECTED_SCENE_ID, (Object*) pSelectedSceneID); + + } + } + } + } + + count = MultipleWindowPresentationModel::GetInstance()->GetInstance()->GetAllWindowArrayList()->GetCount(); + + if (count >= 9) + { + GetFooter()->SetItemEnabled(1,false); + } + else + { + GetFooter()->SetItemEnabled(1,true); + } + + if ( count <= 1) + { + GetFooter()->SetItemEnabled(0,false); + } + + GetFooter()->Invalidate(true); + __pList->RefreshList(index, LIST_REFRESH_TYPE_ITEM_REMOVE); + __pList->UpdateList(); + } + else if(elementId == IDA_FORMAT_BITMAP || elementId == IDA_FORMAT_TITLE_STRING + || elementId == IDA_FORMAT_URL_STRING || elementId == -1) + { + + // launch the browser + WindowInfo* pWindowInfo = dynamic_cast< WindowInfo* >(pAllWindowList->GetAt(index)); + if (pWindowInfo == NULL) + { + return; + } + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == NULL) + { + return; + } + ArrayList* pArgList = new(std::nothrow) ArrayList(); + if (pArgList == NULL) + { + return; + } + r = pArgList->Construct(); + if (IsFailed(r)) + { + return; + } + pArgList->Add(*pWindowInfo); + result r = pSceneManager->GoForward(ForwardSceneTransition(pWindowInfo->sceneID, SCENE_TRANSITION_ANIMATION_TYPE_NONE),pArgList); + + if (r == E_SUCCESS) + { + AppLogDebug("go forward success"); + } + else + { + AppLogDebug("go forward failed"); + } + if (pArgList != null) + { + delete pArgList; + pArgList = null; + } + + } + + return; +} + +void +MultipleWindowForm::OnListViewItemSwept(ListView& listView, int index, SweepDirection direction) +{ + return; +} + +void +MultipleWindowForm::OnListViewItemLongPressed(ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + return; +} + +ListItemBase* +MultipleWindowForm::CreateItem(int index, int itemWidth) +{ + Rectangle listImageRect; + Rectangle pagetTitleRect; + Rectangle pageURLRect; + Rectangle deleteImageRect; + String pageTitle(L""); + String pageURL(L""); + result r = E_SUCCESS; + int width = 72; + + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + ArrayList* pAllWindowList = MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList(); + + if (pAllWindowList == null) + { + return null; + } + WindowInfo* pWindowInfo = dynamic_cast< WindowInfo* >(pAllWindowList->GetAt(index)); + if(pWindowInfo == null) + { + return NULL; + } + CustomItem* pItem = new(std::nothrow) CustomItem(); + pageTitle = pWindowInfo->pageTitle; + pageURL = pWindowInfo->pageUrl; + if (pageURL.GetLength() == 0) + { + String nourl; + pAppResource->GetString(L"IDS_BR_BODY_ABOUT_C_BLANK", nourl); + pageURL = L"<"+ nourl +">"; + } + + Rectangle screenBounds = GetBounds(); + r = pItem->Construct(Dimension(itemWidth, 128), style); + if (IsFailed(r)) + { + return NULL; + } + + if (pWindowInfo->pFavicon) + { + + if( __pListIconImage != NULL) + { + delete __pListIconImage; + __pListIconImage = null; + } + + __pListIconImage = new Bitmap(); + __pListIconImage->Construct(*(pWindowInfo->pFavicon),Rectangle(0,0,pWindowInfo->pFavicon->GetWidth(),pWindowInfo->pFavicon->GetHeight())); + } + else + { + if( __pListIconImage != NULL) + { + delete __pListIconImage; + __pListIconImage = null; + } + + __pListIconImage = pAppResource->GetBitmapN(L"I01_icon_default_favicon.png"); + } + AppLog("deleteimg %d %d",__pListDeleteImage->GetWidth(),__pListDeleteImage->GetHeight()); + + listImageRect.SetBounds(screenBounds.x + 16, screenBounds.y + 28,width, 72); + pagetTitleRect.SetBounds(listImageRect.x + width + 16,10, screenBounds.width - 2 * width - 64, 60); + pageURLRect.SetBounds(pagetTitleRect.x, pagetTitleRect.y + pagetTitleRect.height, screenBounds.width - 2 * width - 120, 48); + deleteImageRect.SetBounds(screenBounds.width - __pListDeleteImage->GetWidth() - 24, (128 - __pListDeleteImage->GetHeight() - 8)/2, __pListDeleteImage->GetWidth() + 8, __pListDeleteImage->GetHeight() + 8); + pItem->AddElement(listImageRect, IDA_FORMAT_BITMAP, *__pListIconImage, null, null); + + if (pageTitle.CompareTo(L"") != 0) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, pageTitle, 44, CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT, true); + } + + if (pageURL.CompareTo(L"") != 0) + { + pItem->AddElement(pageURLRect, IDA_FORMAT_URL_STRING, pageURL, 32, CUSTOM_COLOR_GREY, CUSTOM_COLOR_GREY, CUSTOM_COLOR_GREY, true); + } + + if (pAllWindowList) + { + if (pAllWindowList->GetCount() > 1) + { + pItem->AddElement(deleteImageRect, IDA_FORMAT_DELETE_BITMAP, *__pListDeleteImage, null, null); + pItem->SetElementSelectionEnabled(IDA_FORMAT_DELETE_BITMAP, true); + } + } + return pItem; +} + +bool +MultipleWindowForm::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +int +MultipleWindowForm::GetItemCount(void) +{ + ArrayList* pAllWindowList = MultipleWindowPresentationModel::GetInstance()->GetAllWindowArrayList(); + int windowCount = 0; + + if (pAllWindowList != null) + { + windowCount = pAllWindowList->GetCount(); + } + if (windowCount < 2) + { + GetFooter()->SetItemEnabled(0, false); + } + else + { + GetFooter()->SetItemEnabled(0, true); + } + GetFooter()->Invalidate(true); + return windowCount; +} + +void +MultipleWindowForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + if (__pList) + { + __pList->UpdateList(); + } +} diff --git a/src/IntMultipleWindowPresentationModel.cpp b/src/IntMultipleWindowPresentationModel.cpp new file mode 100644 index 0000000..4b7afb6 --- /dev/null +++ b/src/IntMultipleWindowPresentationModel.cpp @@ -0,0 +1,261 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet MultipleWindowScene class +/*@file: IntMultipleWindowScene.cpp + *@brief: The MultipleWindowScene provides multiple instance of mainscenes and displays them in a Listview + * + */ +#include + +#include "IntCommonLib.h" +#include "IntMultipleWindowPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +MultipleWindowPresentationModel* MultipleWindowPresentationModel::__pMultiWindowManager = NULL; +ArrayList* MultipleWindowPresentationModel::__pAllWindowList = NULL; +HashMapT< Key, Object* > MultipleWindowPresentationModel::__keyAndValues; +int WindowInfo::__windowId = 0; +String MultipleWindowPresentationModel::__currentSceneId = L"" ; +WindowInfo* MultipleWindowPresentationModel::__pCurWindowInfo = null; +Bitmap* WindowInfo::pFormCanvasBitmap = null; + +WindowInfo::WindowInfo(void) +{ + __windowId++; + ID = __windowId; + sceneID.Clear(); + sceneID.Append(IDSCN_MAIN_VIEW); + sceneID.Append(ID); + formID.Clear(); + formID.Append(IDL_FORM_MAIN_VIEW_SCENE); + formID.Append(ID); + isAppcontrolTriggered = false; + isJavascriptInitiated = false; + faviconFilePath = ""; + faviconUrl = ""; + pageUrl = L""; + pFavicon = FaviconManager::GetInstance()->GetDefaultFaviconN(); + pCurrentWeb = null; + pWebCanvasBitmap = null; + pFormCanvasBitmap = null; +} + +WindowInfo::~WindowInfo(void) +{ +// if ( pFavicon != NULL) +// { +// delete pFavicon; +// pFavicon = null; +// } +} + +MultipleWindowPresentationModel::MultipleWindowPresentationModel(void) +{ + +} + +MultipleWindowPresentationModel::~MultipleWindowPresentationModel(void) +{ + if (__pAllWindowList) + { + delete __pAllWindowList; + __pAllWindowList = NULL; + } + __keyAndValues.RemoveAll(); +} + +void +MultipleWindowPresentationModel::CreateInstance(void) +{ + if (__pMultiWindowManager == NULL) + { + __pMultiWindowManager = new(std::nothrow) MultipleWindowPresentationModel(); + result r = __pMultiWindowManager->Construct(); + if(IsFailed(r)) + { + delete __pMultiWindowManager; + __pMultiWindowManager = null; + } + } +} + +MultipleWindowPresentationModel* +MultipleWindowPresentationModel::GetInstance(void) +{ + if (__pMultiWindowManager == NULL) + { + CreateInstance(); + } + return __pMultiWindowManager; +} + + +void +MultipleWindowPresentationModel::DestroyInstance(void) +{ + if (__pMultiWindowManager) + { + delete __pMultiWindowManager; + __pMultiWindowManager = null; + } +} + +result +MultipleWindowPresentationModel::Construct(void) +{ + result r = E_SUCCESS; + __pAllWindowList = new(std::nothrow) ArrayList(); + r = __pAllWindowList->Construct(); + if(IsFailed(r)) + { + return r; + } + r = __keyAndValues.Construct(); + if(IsFailed(r)) + { + return r; + } + return E_SUCCESS; +} + +void +MultipleWindowPresentationModel::UnInitialize(void) +{ + AppLogDebug(" MultiWindowManager::Denitialize"); + return; +} + +result +MultipleWindowPresentationModel::AddWindoInfo(WindowInfo* pWindowInfo) +{ + result r = E_FAILURE; + + if (pWindowInfo != NULL) + { + r = __pAllWindowList->Add(*pWindowInfo); + } + + return r; +} + +ArrayList* +MultipleWindowPresentationModel::GetAllWindowArrayList(void) +{ + return __pAllWindowList; +} + +result +MultipleWindowPresentationModel::GetValue(Key key, Object** value) +{ + result r = E_FAILURE; + bool containKey = false; + + AppLogDebug("Workspace::GetValue"); + r = __keyAndValues.ContainsKey(key, containKey); + TryCatch(!IsFailed(r),,"ContainsKey failed %s",GetErrorMessage(r)); + + if (containKey == true) + r = __keyAndValues.GetValue(key, *value); + + CATCH: + return r; +} + +result +MultipleWindowPresentationModel::SetValue(Key key, Object* value) +{ + result r = E_FAILURE; + bool containKey = false; + + r = __keyAndValues.ContainsKey(key, containKey); + TryCatch(!IsFailed(r),,"ContainsKey failed %s",GetErrorMessage(r)); + + if (containKey == false) + r = __keyAndValues.Add(key, value); + else + r = __keyAndValues.SetValue(key, value); + + CATCH: + return r; +} + +WindowInfo* +MultipleWindowPresentationModel::CreateNewMainViewScene(const String& Url, bool isAppControlTriggered) +{ + + if (GetInstance()->GetAllWindowArrayList()->GetCount() >= 9) + { + return null; + } + WindowInfo* pWindowInfo = new(std::nothrow) WindowInfo(); + if (pWindowInfo == NULL) + { + return null; + } + pWindowInfo->pageTitle = CommonUtil::GetString(L"IDS_BR_BODY_ABOUT_C_BLANK"); + pWindowInfo->pageUrl = Url; + pWindowInfo->isAppcontrolTriggered = isAppControlTriggered; + MultipleWindowPresentationModel::GetInstance()->AddWindoInfo(pWindowInfo); + SceneRegister::RegisterNewMainView(pWindowInfo->sceneID, pWindowInfo->formID); + + return pWindowInfo; +} + + +void +MultipleWindowPresentationModel::SetCurrentSceneID(const String& currentSceneId) +{ + + __currentSceneId.Clear(); + __currentSceneId.Append(currentSceneId); + for (int index = 0; index < GetInstance()->GetAllWindowArrayList()->GetCount(); index ++) + { + WindowInfo* pWindowInfo = static_cast< WindowInfo* >(GetInstance()->GetAllWindowArrayList()->GetAt(index)); + + if ( pWindowInfo == NULL ) + { + return; + } + + if (pWindowInfo->sceneID.CompareTo(__currentSceneId) == 0) + { + __pCurWindowInfo = pWindowInfo; + } + } + + return ; +} + +void +MultipleWindowPresentationModel::GetCurrentSceneId(String& currentSceneId) +{ + currentSceneId = __currentSceneId; + return ; +} + +WindowInfo* +MultipleWindowPresentationModel::GetActiveWindowInfo() +{ + return __pCurWindowInfo; +} + diff --git a/src/IntNotificationPanel.cpp b/src/IntNotificationPanel.cpp new file mode 100644 index 0000000..a8778a4 --- /dev/null +++ b/src/IntNotificationPanel.cpp @@ -0,0 +1,114 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +// !Internet +/*@file: IntNotification.cpp + *@brief: This defines the behaviour of the Notification Class + * + */ + +#include +#include + +#include "IntNotificationPanel.h" +#include "IntSceneRegister.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +NotificationPanel::NotificationPanel(Form& aForm) +:__pTimer(null) +,__pLabel(null) +,__form(aForm) +,__position(0) +{ + Construct("IDL_NOTIFICATION_PANEL"); +} + +NotificationPanel::~NotificationPanel() +{ + if (__pTimer) + { + __pTimer->Cancel(); + delete __pTimer; + } +} + +void +NotificationPanel::SetText(Tizen::Base::String& message) +{ + __pLabel = static_cast(GetControl(L"IDC_NOTIFICATION_LABEL")); + if (__pLabel == null) + { + return; + } + __pLabel->SetText(message); +} + +void +NotificationPanel::OnTimerExpired(Tizen::Base::Runtime::Timer& timer) +{ + SetShowState(false); + Invalidate(true); +} + +void +NotificationPanel::ShowNotification(void) +{ + SceneManager* pSceneManager = null; + if ( __pLabel != NULL) + { + AddControl(*__pLabel); + __pLabel->SetBackgroundColor(CUSTOM_COLOR_INFO_LABEL); + } + __form.AddControl(*this); + + SceneId sceneId = pSceneManager->GetInstance()->GetCurrentSceneId(); + + if (sceneId == IDSCN_EDIT_HISTORY_LIST || sceneId == IDSCN_EDIT_BOOKMARK_LIST /*|| sceneId == IDSCN_SETTINGS*/) + { + SetPosition(0,__form.GetClientAreaBounds().height - GetHeight()); + SetSize(__form.GetWidth(),GetHeight()); + } + else + { + // Since there is a footer panel for the Main form need to subtract __position which is equal to footer panel height. + SetPosition(0,__form.GetClientAreaBounds().height -__position - GetHeight()); + } + Invalidate(true); + + __pTimer = new (std::nothrow) Timer; + if (__pTimer != NULL) + { + __pTimer->Construct(*this); + __pTimer->Start(2000); + } + +} + +void +NotificationPanel::SetPositionDiff(int pos) +{ + __position = pos ; +} diff --git a/src/IntPresentationModelBase.cpp b/src/IntPresentationModelBase.cpp new file mode 100644 index 0000000..be8a44c --- /dev/null +++ b/src/IntPresentationModelBase.cpp @@ -0,0 +1,595 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntPresentationModelBase.cpp + *@brief: Defines the database/storage functions. + */ + +#include +#include + +#include "IntPresentationModelBase.h" +#include "IntTypes.h" + +const wchar_t* BOOKMARK_URL_TABLE = L"Bookmark"; +const wchar_t* BOOKMARK_FOLDER_TABLE = L"BookmarkFolder"; +const wchar_t* HISTORY_DATA_TABLE = L"HistoryData"; + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Io; +using namespace Tizen::Locales; +using namespace Tizen::System; + +Database* PresentationModelBase::__pDataBase = null; +DbEnumerator* PresentationModelBase::__pDbEnum = null; +DbStatement* PresentationModelBase::__pDbStatement = null; +bool PresentationModelBase::__isBeginTransaction = false; + +String PresentationModelBase::DB_FILE_PATH = L"/data/bookmark.db" ; +const int PresentationModelBase::MAX_DB_QUERY_SIZE = 21474836; +const int PresentationModelBase::QUERY_TYPE_LENGTH = 6; + +PresentationModelBase::PresentationModelBase(void) +{ + +} + +PresentationModelBase::~PresentationModelBase(void) +{ + +} + +result +PresentationModelBase::Initialize(void) +{ + result r = E_FAILURE; + + r = PresentationModelBase::OpenDb(); + + return r; +} + +result +PresentationModelBase::UnInitialize(void) +{ + result r = E_FAILURE; + + r = PresentationModelBase::CloseDb(); + + return r; +} + +result +PresentationModelBase::OpenDb(void) +{ + result r = E_FAILURE; + + if (__pDataBase != null) + { + if (__pDbEnum != null) + { + delete __pDbEnum; + __pDbEnum = null; + } + if (__pDbStatement != null) + { + delete __pDbStatement; + __pDbStatement = null; + } + return r; + } + __pDataBase = new(std::nothrow) Database(); + if (null == __pDataBase) + { + return E_OUT_OF_MEMORY; + } + String dbName = App::GetInstance()->GetAppRootPath() + DB_FILE_PATH; + + r = __pDataBase->Construct(dbName, true); + if (IsFailed(r)) + { + AppLogDebug("DB construction failed:%s", GetErrorMessage(r)); + delete __pDataBase; + __pDataBase = null; + return r; + } + __isBeginTransaction = false; + if (File::IsFileExist(dbName)) + { + r = InitializeDBTables(); + if (IsFailed(r)) + { + delete __pDataBase; + __pDataBase = null; + return r; + } + } + return r; +} + +result +PresentationModelBase::CloseDb(void) +{ + if (__pDbEnum != null) + { + delete __pDbEnum; + __pDbEnum = null; + } + if (__pDbStatement != null) + { + delete __pDbStatement; + __pDbStatement = null; + } + if (__pDataBase != null) + { + delete __pDataBase; + __pDataBase = null; + } + + __isBeginTransaction = false; + + return E_SUCCESS; +} + +result +PresentationModelBase::CreateDBTables(BrowserDbTableTypes tableType) +{ + result r = E_FAILURE; + String query; + int resultCount = -1; + + switch (tableType) + { + case DB_TYPE_BOOKMARKURLS: + { + query.Append(L"CREATE TABLE IF NOT EXISTS "); + query.Append(BOOKMARK_URL_TABLE); + query.Append(L" ( ID INTEGER PRIMARY KEY AUTOINCREMENT, TITLE TEXT, URL TEXT, PARENT_BOOKMARK_ID INTEGER DEFAULT -1, CREATED_TIME DATETIME, MODIFIED_TIME DATETIME, ICON_PATH TEXT, FAVICON_ID INTEGER)"); + break; + } + case DB_TYPE_BOOKMARKFOLDERS: + { + query.Append(L"CREATE TABLE IF NOT EXISTS "); + query.Append(BOOKMARK_FOLDER_TABLE); + query.Append(L" ( ID INTEGER PRIMARY KEY AUTOINCREMENT, TITLE TEXT, CREATED_TIME DATETIME, MODIFIED_TIME DATETIME)"); + break; + } + + case DB_TYPE_HISTORYDATA: + { + query.Append(L"CREATE TABLE IF NOT EXISTS "); + query.Append(HISTORY_DATA_TABLE); + query.Append(L" ( ID INTEGER PRIMARY KEY AUTOINCREMENT, TITLE TEXT, URL TEXT, VISITED_TIME DATETIME, ICON_PATH TEXT, FAVICON_ID INTEGER, THUMBNAIL_PATH TEXT)"); + break; + } + + case DB_TYPE_FAVICON: + { + query.Append(L"CREATE TABLE IF NOT EXISTS FaviconData ( ID INTEGER PRIMARY KEY AUTOINCREMENT, URL TEXT, FILE_PATH TEXT )"); + break; + } + + default: + { + AppLogDebug("PresentationModelBase::CreateDBTables: Table Type:%d is invalid", tableType); + break; + } + + } + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch(!IsFailed(r),,"PresentationModelBase::CreateDBTables query failed %s",GetErrorMessage(r)); + + CATCH: return r; +} + +result +PresentationModelBase::InitializeDBTables(void) +{ + result r = E_FAILURE; + + for (register int nDbTblIndex = DB_TYPE_INVALID + 1; nDbTblIndex < DB_TYPE_MAX; nDbTblIndex++) + { + r = CreateDBTables((BrowserDbTableTypes) nDbTblIndex); + TryCatch(!IsFailed(r),,"PresentationModelBase::InitializeDBTables failed %s",GetErrorMessage(r)); + } + + CATCH: return r; +} + +result +PresentationModelBase::DropDBTables(void) +{ + result r = E_FAILURE; + String query; + int resultCount = -1; + + for (register int tableIndex = DB_TYPE_INVALID + 1; tableIndex < DB_TYPE_MAX; tableIndex++) + { + switch (tableIndex) + { + case DB_TYPE_BOOKMARKURLS: + { + query.Clear(); + query.Format(MAX_DB_QUERY_SIZE, L"DROP TABLE IF EXISTS Bookmark"); + break; + } + case DB_TYPE_BOOKMARKFOLDERS: + { + query.Clear(); + query.Format(MAX_DB_QUERY_SIZE, L"DROP TABLE IF EXISTS BookmarkFolder"); + break; + } + + case DB_TYPE_HISTORYDATA: + { + query.Clear(); + query.Format(MAX_DB_QUERY_SIZE, L"DROP TABLE IF EXISTS HistoryData"); + break; + } + + case DB_TYPE_FAVICON: + { + query.Clear(); + query.Format(MAX_DB_QUERY_SIZE, L"DROP TABLE IF EXISTS FaviconData"); + break; + } + + default: + { + AppLogDebug("PresentationModelBase::CreateDBTables: Table Type:%d is invalid", tableIndex); + break; + } + + } + + r = PresentationModelBase::ExecuteQuery(query, resultCount); + TryCatch( !IsFailed(r),,"PresentationModelBase::DropDBTables query failed %s",GetErrorMessage(r)); + } + + CATCH: return r; +} + +result +PresentationModelBase::ExecuteQuery(const String& formatQuery, int& count) +{ + AppLogDebug("Query: %ls", formatQuery.GetPointer()); + + result r = E_FAILURE; + String queryType; + + if (__pDataBase == null) + { + return E_INIT_FAILED; + } + + if (__pDbEnum != null) + { + delete __pDbEnum; + __pDbEnum = null; + } + + if (__pDbStatement != null) + { + delete __pDbStatement; + __pDbStatement = null; + } + + +#if defined(FBK_DB_QUERY_LOG) + { + File file; + file.Construct(L"/Home/Query.txt", "a+", true); + file.Write(formatQuery); + file.Write(String("\r\n")); + } +#endif + + r = formatQuery.SubString(0, QUERY_TYPE_LENGTH, queryType); + if (r == E_SUCCESS) + { + if (queryType == "SELECT") + { + __pDbEnum = __pDataBase->QueryN(formatQuery); + r = GetLastResult(); + if (IsFailed(r)) + { + AppLogException("Failed Database::QueryN(). (error: %s, query: %ls)", GetErrorMessage(r), formatQuery.GetPointer()); + return r; + } + count = 0; + + if (__pDbEnum != null) + { + while (__pDbEnum->MoveNext() == E_SUCCESS) + { + count++; + } + __pDbEnum->Reset(); + } + + } + else + { + if (__isBeginTransaction == false && + (queryType == L"INSERT" || queryType == L"UPDATE" || queryType == L"DELETE")) + { + r = __pDataBase->BeginTransaction(); + if (IsFailed(r)) + { + AppLogException("Failed Database::BeginTransaction() . (error: %s)", GetErrorMessage(r)); + return r; + } + + __isBeginTransaction = true; + } + + r = __pDataBase->ExecuteSql(formatQuery, false); + if (IsFailed(r)) + { + AppLogException("Failed Database::ExecuteSql(). (error: %s, query: %ls)", GetErrorMessage(r), formatQuery.GetPointer()); + return r; + } + count = 0; + } + } + + return r; +} + +result +PresentationModelBase::DbIsNextRowPresent(bool& nextRowpresent) +{ + result r = E_FAILURE; + + if (null == __pDataBase || null == __pDbEnum) + { + if (__pDbEnum == null) + { + AppLogException("PresentationModelBase : pdbenum is null"); + } + if (__pDataBase == null) + { + AppLogException("PresentationModelBase : __pDataBase is null"); + } + return E_OUT_OF_MEMORY; + } + r = __pDbEnum->MoveNext(); + if (IsFailed(r)) + { + nextRowpresent = false; + return r; + } + nextRowpresent = true; + return r; +} + +result +PresentationModelBase::IsNullColumn(int index, bool& isColumNull) +{ + if (null == __pDataBase || null == __pDbEnum) + { + return E_DATABASE; + } + isColumNull = (__pDbEnum->GetColumnType(index) == DB_COLUMNTYPE_NULL ? true : false); + + return E_SUCCESS; +} + +result +PresentationModelBase::GetColumn(int index, String& stringValue) +{ + result r = E_FAILURE; + DbColumnType columnType; + + if (null == __pDataBase || null == __pDbEnum) + { + return E_OUT_OF_MEMORY; + } + // Find column type + columnType = __pDbEnum->GetColumnType(index); + + //if column type is null then assign empty string and return + if (columnType == DB_COLUMNTYPE_NULL) + { + stringValue = ""; + return E_SUCCESS; + } + //Get String value + r = __pDbEnum->GetStringAt(index, stringValue); + if (IsFailed(r)) + { + AppLogDebug("GetStringAt: Failed"); + return r; + } + return r; +} + +result +PresentationModelBase::GetColumn(int index, int& intValue) +{ + result r = E_FAILURE; + DbColumnType columnType; + + if (null == __pDataBase || null == __pDbEnum) + { + return E_OUT_OF_MEMORY; + } + // Find column type + columnType = __pDbEnum->GetColumnType(index); + + //if column type is null then assign empty string and return + if (columnType == DB_COLUMNTYPE_NULL) + { + intValue = 0; + return E_SUCCESS; + } + //Get String value + r = __pDbEnum->GetIntAt(index, intValue); + TryCatch(!IsFailed(r),,"GetIntAt:failed %s",GetErrorMessage(r)); + + CATCH: + return r; +} + +result +PresentationModelBase::GetColumn(int index, DateTime& dateValue) +{ + result r = E_FAILURE; + DbColumnType nType; + + if (null == __pDataBase || null == __pDbEnum) + { + AppLogDebug("__pDataBase or __pDbEnum is null"); + return E_OUT_OF_MEMORY; + } + // Find column type + nType = __pDbEnum->GetColumnType(index); + //if column type is null then assign empty string and return + if (nType == DB_COLUMNTYPE_NULL) + { + return E_SUCCESS; + } + //Get String value + r = __pDbEnum->GetDateTimeAt(index, dateValue); + if (IsFailed(r)) + { + AppLogDebug("GetDateTimeAt: Failed"); + return r; + } + + return r; +} + +result +PresentationModelBase::GetColumn(int index, double& doubleValue) +{ + result r = E_FAILURE; + DbColumnType columnType; + + if (null == __pDataBase || null == __pDbEnum) + { + return E_OUT_OF_MEMORY; + } + // Find column type + columnType = __pDbEnum->GetColumnType(index); + + //if column type is null then assign empty string and return + if (columnType == DB_COLUMNTYPE_NULL) + { + doubleValue = 0.0; + return E_SUCCESS; + } + //Get String value + r = __pDbEnum->GetDoubleAt(index, doubleValue); + if (IsFailed(r)) + { + AppLogDebug("GetDateTimeAt: Failed"); + return r; + } + + return r; +} + +result +PresentationModelBase::RollbackDb() +{ + result r = E_FAILURE; + + if (__pDataBase != null && __isBeginTransaction == true) + { + r = __pDataBase->RollbackTransaction(); + if (IsFailed(r)) + { + return r; + } + __isBeginTransaction = false; + } + return r; +} + +result +PresentationModelBase::CommitDb() +{ + + result r = E_FAILURE; + + if (__pDataBase != null && __isBeginTransaction == true) + { + r = __pDataBase->CommitTransaction(); + TryCatch(!IsFailed(r),,"PresentationModelBase::Commit Transaction:failed %s",GetErrorMessage(r)); + + __isBeginTransaction = false; + } + + CATCH: + return r; +} + +result +PresentationModelBase::GetLastInsertedId(String& tableName, int& rowId) +{ + String query; + result r = E_FAILURE; + int count = -1; + bool nextRowpresent = false; + + query.Append(L"SELECT last_insert_rowid() FROM "); + query.Append(tableName); + + r = PresentationModelBase::ExecuteQuery(query, count); + TryCatch(!IsFailed(r),,"PresentationModelBase::GetLastInsertedId query failed %s",GetErrorMessage(r)); + + r = PresentationModelBase::DbIsNextRowPresent(nextRowpresent); + + if (nextRowpresent == true) + { + r = PresentationModelBase::GetColumn(0, rowId); + if (IsFailed(r)) + { + AppLogDebug("PresentationModelBase::GetLstInsertedId -(%s)\n", GetErrorMessage(r)); + return r; + } + } + CATCH: return r; +} + +bool +PresentationModelBase::GetCurrentDateTime(DateTime& dt) +{ + DateTime dtNow; + LocaleManager localManager; + result r = E_FAILURE; + TimeZone tz; + + r = SystemTime::GetCurrentTime(UTC_TIME, dtNow); + if (IsFailed(r)) + { + return false; + } + localManager.Construct(); + tz = localManager.GetSystemTimeZone(); + dt = tz.UtcTimeToWallTime(dtNow); + + return true; +} + + diff --git a/src/IntRadioCustomItem.cpp b/src/IntRadioCustomItem.cpp new file mode 100644 index 0000000..8376786 --- /dev/null +++ b/src/IntRadioCustomItem.cpp @@ -0,0 +1,120 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet RadioCustomItem class +/*@file: RadioCustomItem.cpp + *@brief: The RadioCustomItem + */ +#include +#include + +#include "IntRadioCustomItem.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +static const wchar_t* IDB_BUTTON_RADIO_PRESS2 = L"00_button_radio_selected.png"; +static const wchar_t* IDB_BUTTON_RADIO_PRESS1 = L"00_button_radio.png"; + +const int RadioCustomItem::IDA_FORMAT_STRING = 500; +const int RadioCustomItem::IDA_FORMAT_RADIO_BUTTON = 501; + +RadioCustomItem::RadioCustomItem(void) +{ + __width = 0; + __height = 0; + __text = L""; + __isSelected = false; +} + +RadioCustomItem::~RadioCustomItem(void) +{ + +} + +result +RadioCustomItem::Construct(int width, int height) +{ + result r = E_FAILURE; + + __width = width; + __height = height; + const Dimension dim(width, height); + r = CustomItem::Construct(dim, LIST_ANNEX_STYLE_NORMAL); + + return r; +} + +void +RadioCustomItem::SetText(Tizen::Base::String& text) +{ + __text = text; +} + +String +RadioCustomItem::GetText(void) +{ + return __text; +} + +result +RadioCustomItem::Make(void) +{ + result r = E_FAILURE; + Color textColor = CUSTOM_COLOR_LISTVIEW_TEXT2; + Color pressedTextColor = CUSTOM_COLOR_LISTVIEW_TEXT; + Bitmap* pBitmap = null; + + if (__isSelected == true) + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_RADIO_PRESS2); + } + else + { + pBitmap = AppResource::GetInstance()->GetBitmapN(IDB_BUTTON_RADIO_PRESS1); + } + + if ( pBitmap != NULL) + { + AddElement(Rectangle(26, (__height-pBitmap->GetHeight())/2, pBitmap->GetWidth(), pBitmap->GetHeight()), IDA_FORMAT_RADIO_BUTTON, *pBitmap, null); + AppLogDebug("RadioCustomItem::the text is %ls",__text.GetPointer()); + + r = AddElement(Rectangle(26 + pBitmap->GetWidth() + 10, 5, __width - 26 - 10 - pBitmap->GetWidth(), __height), IDA_FORMAT_STRING, __text, 40, textColor, textColor, textColor, true); + delete pBitmap; + } + TryCatch(!IsFailed(r),,"RadioCustomItem::the value is %s",GetErrorMessage(r)); + + r = SetElementSelectionEnabled(IDA_FORMAT_STRING, true); + TryCatch(!IsFailed(r),,"RadioCustomItem::the value is %s",GetErrorMessage(r)); + + CATCH: + return r; +} + +void +RadioCustomItem::SetSelected(bool selectedValue) +{ + __isSelected = selectedValue; +} + +bool +RadioCustomItem::GetSelected(void) +{ + return __isSelected; +} diff --git a/src/IntReaderFontSizeForm.cpp b/src/IntReaderFontSizeForm.cpp new file mode 100644 index 0000000..0e50df2 --- /dev/null +++ b/src/IntReaderFontSizeForm.cpp @@ -0,0 +1,163 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet IntFontSize class +/*@file: IntFontSize.cpp + *@brief: This class defines IntFontSize used to change the font size + * + */ + +#include +#include + +#include "IntCommonLib.h" +#include "IntReaderFontSizeForm.h" +#include "IntSceneRegister.h" +#include "IntSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +ReaderFontSizeForm::ReaderFontSizeForm(void) +{ + __pFontSlider = null; + __pFontValue = null; +} + +ReaderFontSizeForm::~ReaderFontSizeForm(void) +{ + +} + +bool +ReaderFontSizeForm::Initialize(void) +{ + Form::Construct(L"IDL_FONT_SIZE"); + + return true; +} + +result +ReaderFontSizeForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + r = pSceneManager->AddSceneEventListener(IDSCN_FONT_SIZE, *this); + TryCatch(!IsFailed(r),,"AddSceneEventListener failed with error %s",GetErrorMessage(r)); + } + + SetFormBackEventListener(this); + + r = GetHeader()->SetTitleText(CommonUtil::GetString(L"IDS_BR_BODY_FONT_SIZE")); + TryCatch(!IsFailed(r),,"OnInitialized failed with %s",GetErrorMessage(r)); + + __pFontSlider = static_cast< Slider* >(GetControl( + L"IDC_FONT_SLIDER", true)); + if (__pFontSlider == null) + { + return E_FAILURE; + } + __pFontSlider->AddSliderEventListener(*this); + + r = __pFontSlider->SetBounds(Rectangle(0, 10, GetClientAreaBounds().width, 120)); + TryCatch(!IsFailed(r),,"OnInitialized failed with %s",GetErrorMessage(r)); + + r = __pFontSlider->SetRange(10, 30); + TryCatch(!IsFailed(r),,"OnInitialized failed with %s",GetErrorMessage(r)); + + GetFooter()->AddActionEventListener(*this); + + CATCH: + return r; +} + +void +ReaderFontSizeForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + __pFontValue = dynamic_cast(pArgs->GetAt(0)); + + if (__pFontValue == null) + { + return; + } + + if (__pFontSlider != null && __pFontValue != null) + { + __pFontSlider->SetValue(__pFontValue->ToInt()); + } + return; +} + +void +ReaderFontSizeForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + return; +} + +void +ReaderFontSizeForm::OnSliderBarMoved(Tizen::Ui::Controls::Slider& source, int value) +{ + *__pFontValue = value; + return; +} + +void +ReaderFontSizeForm::OnFormBackRequested(Form& source) +{ + result r = E_FAILURE; + SceneManager* pSceneManager = SceneManager::GetInstance(); + ArrayList *pArgList = new(std::nothrow) ArrayList(); + + if (pArgList != null) + { + r = pArgList->Construct(); + TryCatch(!IsFailed(r),,"OnFormBackRequested failed with %s",GetErrorMessage(r)); + + SettingPresentationModel::GetInstance()->SetReaderFontSize(__pFontValue->ToInt()); + TryCatch(!IsFailed(r),,"OnFormBackRequested failed with %s",GetErrorMessage(r)); + + if (pSceneManager != null) + { + r = pSceneManager->GoBackward(BackwardSceneTransition()); + TryCatch(!IsFailed(r), "ReaderFontSizeForm::OnFormBackRequested Failed to GoBackward %s",GetErrorMessage(r)); + } + } + + CATCH: + + if( pArgList != NULL) + { + delete pArgList; + } + + return; +} + +void +ReaderFontSizeForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + +} diff --git a/src/IntSceneRegister.cpp b/src/IntSceneRegister.cpp new file mode 100644 index 0000000..bb924f8 --- /dev/null +++ b/src/IntSceneRegister.cpp @@ -0,0 +1,127 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntSceneRegister.cpp + *@brief: This header file contains the declarations of the %lsceneRegister class. + * + */ + +#include + +#include "IntSceneRegister.h" +#include "IntFormFactory.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Ui::Scenes; + +const wchar_t* IDSCN_MAIN_VIEW = L"ScnMainMenu"; +const wchar_t* IDSCN_BOOKMARK_VIEW = L"ScnBookmark"; +const wchar_t* IDSCN_HISTORY_LIST = L"ScnHistory"; +const wchar_t* IDSCN_FIND_WORD = L"ScnFindWord"; +const wchar_t* IDSCN_EDIT_HISTORY_LIST = L"ScnEditHistory"; +const wchar_t* IDSCN_SETTINGS_CLEAR_PRIVATE_DATA = L"ScnSettingsClearPrivateData"; +const wchar_t* IDSCN_MULTIPLE_WINDOW = L"ScnMultipleWindow"; +const wchar_t* IDSCN_MULTIPLE_WINDOW_GRID = L"ScnMultipleWindowGrid"; +const wchar_t* IDSCN_SETTINGS = L"ScnSettings"; +const wchar_t* IDSCN_ADD_BOOKMARK = L"ScnAddBookmark"; +const wchar_t* IDSCN_ARTICLE_READER = L"ScnArticleReader"; +const wchar_t* IDSCN_EDIT_BOOKMARK_LIST = L"ScnEditBookmarkList"; +const wchar_t* IDSCN_CREATE_BOOKMARK_FOLDER = L"ScnCreateBookmarkFolder"; +const wchar_t* IDSCN_FONT_SIZE = L"ScnFontSize"; +const wchar_t* IDSCN_EDIT_HOMEPAGE_VIEW = L"ScnEditHomePage"; +const wchar_t* IDSCN_BRIGHTNESS = L"ScnBrightness"; + +SceneRegister::SceneRegister(void) +{ + +} + +SceneRegister::~SceneRegister(void) +{ + +} + +void +SceneRegister::RegisterAllScenes(void) +{ + static const wchar_t* PANEL_BLANK = L""; + static FormFactory formFactory; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return; + } + pSceneManager->RegisterFormFactory(formFactory); + + pSceneManager->RegisterScene(IDSCN_BOOKMARK_VIEW, IDL_FORM_BOOKMARK_LIST_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_HISTORY_LIST, IDL_FORM_HISTORY_LIST_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_FIND_WORD, IDL_FORM_FIND_WORD_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_EDIT_HISTORY_LIST, IDL_FORM_EDIT_HISTORY_LIST_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_SETTINGS_CLEAR_PRIVATE_DATA, IDL_FORM_SETTINGS_CLEAR_PRIVATE_DATA_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_MULTIPLE_WINDOW, IDL_FORM_MULTIPLE_WINDOW_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_SETTINGS, IDL_FORM_SETTINGS_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_ADD_BOOKMARK, IDL_FORM_ADD_BOOKMARK_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_ARTICLE_READER, IDL_FORM_ARTICLE_READER_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_EDIT_BOOKMARK_LIST, IDL_FORM_EDIT_BOOKMARK_LIST_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_CREATE_BOOKMARK_FOLDER, IDL_FORM_CREATE_BOOKMARK_FOLDER_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_FONT_SIZE, IDL_FORM_FONT_SIZE_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_EDIT_HOMEPAGE_VIEW, IDL_FORM_EDIT_HOME_PAGE_SCENE, PANEL_BLANK); + pSceneManager->RegisterScene(IDSCN_BRIGHTNESS, IDL_FORM_BRIGHTNESS_SCENE, PANEL_BLANK); +} + +result +SceneRegister::RegisterNewMainView(const Tizen::Base::String& sceneID, const Tizen::Base::String& FormID) +{ + result r = E_SUCCESS; + static const wchar_t* PANEL_BLANK = L""; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return E_FAILURE; + } + + r = pSceneManager->RegisterScene(sceneID, FormID, PANEL_BLANK); + + if (GetLastResult() != E_SUCCESS) + { + AppLogDebug("fail Not registered"); + } + else + { + AppLogDebug("success registered"); + } + return r; +} + +result +SceneRegister::DestroyAndUnRegisterScene(const String& sceneID) +{ + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager == null) + { + return E_FAILURE; + } + pSceneManager->UnregisterScene(sceneID); + pSceneManager->DestroyScene(sceneID); + return r; +} diff --git a/src/IntSettingClearPrivateDataForm.cpp b/src/IntSettingClearPrivateDataForm.cpp new file mode 100644 index 0000000..ebed252 --- /dev/null +++ b/src/IntSettingClearPrivateDataForm.cpp @@ -0,0 +1,338 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet SettingsClearPrivateDataForm class +/*@file: IntSettingsClearPrivateDataForm.cpp + *@brief: The SettingsClearPrivateDataForm used to create private data scene + * + */ + +#include +#include +#include "IntSettingClearPrivateDataForm.h" +#include "IntSceneRegister.h" +#include "IntHistoryPresentationModel.h" +#include "IntSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const int SettingsClearPrivateDataForm::IDA_FORMAT_TITLE_STRING = 101; +const int SettingsClearPrivateDataForm::IDA_BUTTON_DELETE = 102; +const int SettingsClearPrivateDataForm::IDA_BUTTON_CANCEL = 103; + +SettingsClearPrivateDataForm::SettingsClearPrivateDataForm() + : __pList(null) + , __clearItem(5) +{ +} + +SettingsClearPrivateDataForm::~SettingsClearPrivateDataForm() +{ +} + +bool +SettingsClearPrivateDataForm::Initialize(void) +{ + Construct(L"IDL_SETTINGS_CLEAR_PRIVATE_DATA"); + //SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK)); + return true; +} + +result +SettingsClearPrivateDataForm::OnInitializing(void) +{ + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return E_FAILURE; + } + + Footer* pFooter = GetFooter(); + + if ( pFooter == null) + { + return E_FAILURE; + } + FooterItem deleteButton; + FooterItem cancelButton; + + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_INDICATOR | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + + r = pSceneManager->AddSceneEventListener(IDSCN_SETTINGS_CLEAR_PRIVATE_DATA, *this); + + // Setup back event listener + SetFormBackEventListener(this); + pFooter->AddActionEventListener(*this); + + __pList = static_cast< ListView* >(GetControl(L"IDC_CLEAR_LISTVIEW")); + if (__pList != null) + { + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + } + + AddOrientationEventListener(*this); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON); + deleteButton.Construct(IDA_BUTTON_DELETE); + deleteButton.SetText(L"Delete"); + + pFooter->AddItem(deleteButton); + cancelButton.Construct(IDA_BUTTON_CANCEL); + cancelButton.SetText(L"Cancel"); + + pFooter->AddItem(cancelButton); + pFooter->SetItemEnabled(0, false); + return r; +} + +result +SettingsClearPrivateDataForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +SettingsClearPrivateDataForm::OnActionPerformed(const Control& source, int actionId) +{ + Footer* pFooter = GetFooter(); + if ( pFooter == NULL ) + { + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + switch (actionId) + { + case IDA_BUTTON_DELETE: + { + AppLog("Delete button is called"); + if (__pList) + { + if (__pList->IsItemChecked(0) || __pList->IsItemChecked(1) || __pList->IsItemChecked(2) || __pList->IsItemChecked(3) || __pList->IsItemChecked(4)) + { + pFooter->SetItemEnabled(0, true); + pFooter->Invalidate(true); + + // Delete the specific index setting + if (__pList->IsItemChecked(0) == true) + { + // clear all private data + AppLog("Clear all private data"); + HistoryPresentationModel::GetInstance()->ClearHistory(); + SettingPresentationModel::GetInstance()->ClearCache(); + SettingPresentationModel::GetInstance()->ClearCookie(); + } + if (__pList->IsItemChecked(1) == true) + { + // clear History + AppLog("Clear all History data"); + HistoryPresentationModel::GetInstance()->ClearHistory(); + } + if (__pList->IsItemChecked(2) == true) + { + // clear cache + AppLog("Clear all cache data"); + SettingPresentationModel::GetInstance()->ClearCache(); + } + if (__pList->IsItemChecked(3) == true) + { + // clear cookie + AppLog("Clear all cookie data"); + SettingPresentationModel::GetInstance()->ClearCookie(); + } + else if (__pList->IsItemChecked(4) == true) + { + // clear saved ID and password + AppLog("Clear saved ID and password"); + } + } + else + { + pFooter->SetItemEnabled(0, false); + pFooter->Invalidate(true); + } + } + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition()); + } + break; + + case IDA_BUTTON_CANCEL: + { + AppLog("cancel button is called"); + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } +} + +void +SettingsClearPrivateDataForm::OnFormBackRequested(Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager == null) + { + return; + } + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_SETTINGS, SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); +} + +void +SettingsClearPrivateDataForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + if (__pList) + { + __pList->UpdateList(); + } + return; +} + +void +SettingsClearPrivateDataForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + return; +} + +void +SettingsClearPrivateDataForm::OnListViewContextItemStateChanged(ListView& listView, int index, int elementId, ListContextItemStatus state) +{ + return; +} + +void +SettingsClearPrivateDataForm::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status) +{ + + bool checkstatus = __pList->IsItemChecked(index); + + if (index == 0) + { + if (!checkstatus) + { + __pList->SetItemChecked(0, false); + __pList->SetItemChecked(1, false); + __pList->SetItemChecked(2, false); + __pList->SetItemChecked(3, false); + __pList->SetItemChecked(4, false); + } + else + { + __pList->SetItemChecked(0, true); + __pList->SetItemChecked(1, true); + __pList->SetItemChecked(2, true); + __pList->SetItemChecked(3, true); + __pList->SetItemChecked(4, true); + } + } + if (__pList->IsItemChecked(0) || __pList->IsItemChecked(1) || __pList->IsItemChecked(2) || __pList->IsItemChecked(3) || __pList->IsItemChecked(4)) + { + GetFooter()->SetItemEnabled(0, true); + GetFooter()->Invalidate(true); + } + else + { + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + } + return; +} + +void +SettingsClearPrivateDataForm::OnListViewItemSwept(ListView& listView, int index, SweepDirection direction) +{ + return; +} + +void +SettingsClearPrivateDataForm::OnListViewItemLongPressed(ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + return; +} + +ListItemBase* +SettingsClearPrivateDataForm::CreateItem(int index, int itemWidth) +{ + Rectangle pagetTitleRect; + CustomItem* pItem = new(std::nothrow) CustomItem(); + ListAnnexStyle style = LIST_ANNEX_STYLE_MARK; + pItem->Construct(Tizen::Graphics::Dimension(itemWidth, 112), style); + Rectangle screenBounds = GetBounds(); + + pagetTitleRect.SetBounds(screenBounds.x + 15, 38, screenBounds.width - 10, 40); + + if (index == 0) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, L"Select all", 38, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + } + else if (index == 1) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, L"History", 38, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + } + else if (index == 2) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, L"Cache", 38, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + } + else if (index == 3) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, L"Cookie", 38, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + } + else if (index == 4) + { + pItem->AddElement(pagetTitleRect, IDA_FORMAT_TITLE_STRING, L"Saved ID and password", 38, Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_BLACK), true); + } + + return pItem; +} + +bool +SettingsClearPrivateDataForm::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +int +SettingsClearPrivateDataForm::GetItemCount(void) +{ + return __clearItem; +} + +void +SettingsClearPrivateDataForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + if (__pList) + { + __pList->UpdateList(); + } + return; +} diff --git a/src/IntSettingForm.cpp b/src/IntSettingForm.cpp new file mode 100644 index 0000000..704e39a --- /dev/null +++ b/src/IntSettingForm.cpp @@ -0,0 +1,996 @@ +// +// Copyright (c) 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://floralicense.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. +// + +//!Internet SettingForm class +/*@file: IntSettingForm.cpp + *@brief: The SettingForm + */ + +#include +#include +#include + +#include "IntCommonLib.h" +#include "IntConfirmationPopup.h" +#include "IntDefaultCustomItem.h" +#include "IntDropDownCustomItem.h" +#include "IntHistoryPresentationModel.h" +#include "IntMultipleWindowPresentationModel.h" +#include "IntNotificationPanel.h" +#include "IntRadioCustomItem.h" +#include "IntSceneRegister.h" +#include "IntSettingForm.h" +#include "IntSettingPresentationModel.h" +#include "IntSettingToggleCustomItem.h" + + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +//static const int IDA_CONFIRMATION_NO = 1000; +//static const int IDA_CONFIRMATION_YES = 1001; + +static const wchar_t* IDB_EDIT_BACKGROUND = L"EditBackground.png"; + +SettingForm::SettingForm(void) +: __fontValue(0),__pResetPopup(null),__pWindowInfo(null) , __pConfirmationPopup(null) +{ + __currentURL = L""; + __pList = null; + InitializeSettingValues(); +} + +SettingForm::~SettingForm(void) +{ + if (pGroupItemCount) + { + delete[] pGroupItemCount; + pGroupItemCount = null; + } +} + +void +SettingForm::InitializeSettingValues(void) +{ + AppLog("SettingForm::InitializeSettingValues homepage %ls",SettingPresentationModel::GetInstance()->GetHomepage().GetPointer()); + groupCount = 5; + pGroupItemCount = new(std::nothrow) int[5]; + pGroupItemCount[0] = 5; //Homepage + pGroupItemCount[1] = 6; //Page content settings + pGroupItemCount[2] = 5; //Private and Security + pGroupItemCount[3] = 4; //Search + pGroupItemCount[4] = 1; //Website settings and Reset + + for (int iter = (int) SETTING_INVALID + 1; iter < (int) SETTING_MAX; iter++) + { + settingInfo[iter].isSelected = false; + } + + AppLogDebug("image display %d", (int) SettingPresentationModel::GetInstance()->IsDisplayImagesEnabled()); + settingInfo[SETTING_HOMEPAGE_TITLE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_HOMEPAGE"); + settingInfo[SETTING_HOMEPAGE_TITLE].subText = SettingPresentationModel::GetInstance()->GetHomepage(); + settingInfo[SETTING_HOMEPAGE_TITLE].itemType = ITEM_TYPE_DROPDOWN; + + settingInfo[SETTING_CURRENT_PAGE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_CURRENT_PAGE"); + settingInfo[SETTING_CURRENT_PAGE].subText = L""; + settingInfo[SETTING_CURRENT_PAGE].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_BLANK_PAGE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE"); + settingInfo[SETTING_BLANK_PAGE].subText = L""; + settingInfo[SETTING_BLANK_PAGE].itemType = ITEM_TYPE_RADIO; + if (SettingPresentationModel::GetInstance()->GetHomepage().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")) == 0) + { + settingInfo[SETTING_BLANK_PAGE].isSelected = true; + } + + settingInfo[SETTING_MOST_VISITED_SITE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES"); + settingInfo[SETTING_MOST_VISITED_SITE].subText = L""; + settingInfo[SETTING_MOST_VISITED_SITE].itemType = ITEM_TYPE_RADIO; + if (SettingPresentationModel::GetInstance()->GetHomepage().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + settingInfo[SETTING_MOST_VISITED_SITE].isSelected = true; + } + WindowInfo* pWindowInfo = null; + String curUrl = SettingPresentationModel::GetInstance()->GetFavoriteUrl(); + AppLog("SettingForm::OnSceneActivatedN check1"); + + settingInfo[SETTING_FAVORITE_URL].titleText = L"http://www.tizen.org"; + if (SettingPresentationModel::GetInstance()->GetFavoriteUrl().CompareTo(L"") == 0) + { + SettingPresentationModel::GetInstance()->SetFavoriteValue(L"http://www.tizen.org"); + } + settingInfo[SETTING_FAVORITE_URL].subText = L""; + settingInfo[SETTING_FAVORITE_URL].itemType = ITEM_TYPE_RADIO; + + if (SettingPresentationModel::GetInstance()->GetHomepage().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_USER_HOMEPAGE")) == 0) + { + settingInfo[SETTING_FAVORITE_URL].isSelected = true; + } + + settingInfo[SETTING_DEFAULT_VIEW_TITLE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_DEFAULT_VIEW"); + settingInfo[SETTING_DEFAULT_VIEW_TITLE].subText = SettingPresentationModel::GetInstance()->GetDefaultView(); + settingInfo[SETTING_DEFAULT_VIEW_TITLE].itemType = ITEM_TYPE_DROPDOWN; + + settingInfo[SETTING_FIT_TO_WIDTH].titleText = CommonUtil::GetString(L"IDS_BR_BODY_FIT_TO_WIDTH"); + settingInfo[SETTING_FIT_TO_WIDTH].subText = L""; + settingInfo[SETTING_FIT_TO_WIDTH].itemType = ITEM_TYPE_RADIO; + settingInfo[SETTING_FIT_TO_WIDTH].isSelected = !(String::Compare(settingInfo[SETTING_FIT_TO_WIDTH].titleText, settingInfo[SETTING_DEFAULT_VIEW_TITLE].subText)); + + settingInfo[SETTING_READABLE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_READABLE"); + settingInfo[SETTING_READABLE].subText = L""; + settingInfo[SETTING_READABLE].itemType = ITEM_TYPE_RADIO; + settingInfo[SETTING_READABLE].isSelected = !(String::Compare(settingInfo[SETTING_READABLE].titleText, settingInfo[SETTING_DEFAULT_VIEW_TITLE].subText)); + + settingInfo[SETTING_RUN_JAVASCRIPT].titleText = CommonUtil::GetString(L"IDS_BR_BODY_RUN_JAVASCRIPT"); + settingInfo[SETTING_RUN_JAVASCRIPT].subText = L""; + settingInfo[SETTING_RUN_JAVASCRIPT].itemType = ITEM_TYPE_TOGGLE; + settingInfo[SETTING_RUN_JAVASCRIPT].isSelected = SettingPresentationModel::GetInstance()->IsRunJavascriptEnabled(); + + settingInfo[SETTING_DISPLAY_IMAGES].titleText = CommonUtil::GetString(L"IDS_BR_BODY_DISPLAY_IMAGES"); + settingInfo[SETTING_DISPLAY_IMAGES].subText = L""; + settingInfo[SETTING_DISPLAY_IMAGES].itemType = ITEM_TYPE_TOGGLE; + settingInfo[SETTING_DISPLAY_IMAGES].isSelected = SettingPresentationModel::GetInstance()->IsDisplayImagesEnabled(); + + settingInfo[SETTING_BLOCK_POPUP].titleText = CommonUtil::GetString(L"IDS_BR_BODY_BLOCK_POP_UPS_ABB"); + settingInfo[SETTING_BLOCK_POPUP].subText = L""; + settingInfo[SETTING_BLOCK_POPUP].itemType = ITEM_TYPE_TOGGLE; + settingInfo[SETTING_BLOCK_POPUP].isSelected = !SettingPresentationModel::GetInstance()->IsBlockPopUp(); + + settingInfo[SETTING_CLEAR_CACHE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_CLEAR_CACHE"); + settingInfo[SETTING_CLEAR_CACHE].subText = L""; + settingInfo[SETTING_CLEAR_CACHE].itemType = ITEM_TYPE_NORMAL; + + settingInfo[SETTING_CLEAR_HISTORY].titleText = CommonUtil::GetString(L"IDS_BR_BODY_CLEAR_HISTORY"); + settingInfo[SETTING_CLEAR_HISTORY].subText = L""; + settingInfo[SETTING_CLEAR_HISTORY].itemType = ITEM_TYPE_NORMAL; + + settingInfo[SETTING_SHOW_SECURITY_WARNINGS].titleText = CommonUtil::GetString(L"IDS_BR_BODY_SHOW_SECURITY_WARNINGS"); + settingInfo[SETTING_SHOW_SECURITY_WARNINGS].subText = L""; + settingInfo[SETTING_SHOW_SECURITY_WARNINGS].itemType = ITEM_TYPE_TOGGLE; + settingInfo[SETTING_SHOW_SECURITY_WARNINGS].isSelected = SettingPresentationModel::GetInstance()->IsSecurityWarningsEnabled(); + + settingInfo[SETTING_ACCEPT_COOKIES].titleText = CommonUtil::GetString(L"IDS_BR_BODY_ACCEPT_COOKIES"); + settingInfo[SETTING_ACCEPT_COOKIES].subText = L""; + settingInfo[SETTING_ACCEPT_COOKIES].itemType = ITEM_TYPE_TOGGLE; + settingInfo[SETTING_ACCEPT_COOKIES].isSelected = SettingPresentationModel::GetInstance()->IsCookiesEnabled(); + + settingInfo[SETTING_CLEAR_COOKIE_DATA].titleText = CommonUtil::GetString(L"IDS_BR_BODY_CLEAR_ALL_COOKIE_DATA"); + settingInfo[SETTING_CLEAR_COOKIE_DATA].subText = CommonUtil::GetString(L"IDS_BR_HEADER_COOKIES"); + settingInfo[SETTING_CLEAR_COOKIE_DATA].itemType = ITEM_TYPE_NORMAL; + + settingInfo[SETTING_SEARCH_ENGINE_TITLE].titleText = CommonUtil::GetString(L"IDS_BR_BODY_SEARCH_ENGINE"); + settingInfo[SETTING_SEARCH_ENGINE_TITLE].subText = SettingPresentationModel::GetInstance()->GetSearchEngine(); + settingInfo[SETTING_SEARCH_ENGINE_TITLE].itemType = ITEM_TYPE_DROPDOWN; + + settingInfo[SETTING_SEARCH_ENGINE_YAHOO].titleText = CommonUtil::GetString(L"IDS_BR_BODY_YAHOO"); + settingInfo[SETTING_SEARCH_ENGINE_YAHOO].subText = L""; + settingInfo[SETTING_SEARCH_ENGINE_YAHOO].itemType = ITEM_TYPE_RADIO; + settingInfo[SETTING_SEARCH_ENGINE_YAHOO].isSelected = !(String::Compare(settingInfo[SETTING_SEARCH_ENGINE_YAHOO].titleText, settingInfo[SETTING_SEARCH_ENGINE_TITLE].subText)); + + settingInfo[SETTING_SEARCH_ENGINE_NAVER].titleText = CommonUtil::GetString(L"IDS_BR_BODY_NAVER"); + settingInfo[SETTING_SEARCH_ENGINE_NAVER].subText = L""; + settingInfo[SETTING_SEARCH_ENGINE_NAVER].itemType = ITEM_TYPE_RADIO; + settingInfo[SETTING_SEARCH_ENGINE_NAVER].isSelected = !(String::Compare(settingInfo[SETTING_SEARCH_ENGINE_NAVER].titleText, settingInfo[SETTING_SEARCH_ENGINE_TITLE].subText)); + + settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].titleText = CommonUtil::GetString(L"IDS_COM_BODY_GOOGLE"); + settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].subText = L""; + settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].itemType = ITEM_TYPE_RADIO; + settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].isSelected = !(String::Compare(settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].titleText, settingInfo[SETTING_SEARCH_ENGINE_TITLE].subText)); + + settingInfo[SETTING_RESET_TO_DEFAULT].titleText = CommonUtil::GetString(L"IDS_BR_BODY_RESET_TO_DEFAULT"); + settingInfo[SETTING_RESET_TO_DEFAULT].subText = L""; + settingInfo[SETTING_RESET_TO_DEFAULT].itemType = ITEM_TYPE_NORMAL; +} + +bool +SettingForm::Initialize(void) +{ + result r = E_FAILURE; + + r = Construct(L"IDL_SETTING_FORM"); + if (IsFailed(r)) + { + return false; + } + return true; +} + +result +SettingForm::OnInitializing(void) +{ + result r = E_FAILURE; + Footer* pFooter = NULL; + SceneManager* pSceneManager = NULL; + + __pList = static_cast< GroupedListView* >(GetControl(L"IDC_SETTING_LIST")); + if ( __pList != NULL ) + { + + r = __pList->SetItemProvider(*this); + TryCatch(!IsFailed(r),,"setItemProvider failed with error %s",GetErrorMessage(r)); + __pList->AddGroupedListViewItemEventListener(*this); + } + + pFooter = GetFooter(); + if (pFooter) + { + AppLogDebug("setting back button"); + pFooter->SetBackButtonEnabled(true); + SetFormBackEventListener(this); + } + pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + r = pSceneManager->AddSceneEventListener(IDSCN_SETTINGS, *this); + TryCatch(!IsFailed(r),,"AddSceneEventListener failed with error %s",GetErrorMessage(r)); + } + AddOrientationEventListener(*this); + + CATCH: + return r; +} + +void +SettingForm::OnGroupedListViewContextItemStateChanged(GroupedListView& listView, int groupIndex, int itemIndex, int elementId, ListContextItemStatus status) +{ + +} + +void +SettingForm::OnGroupedListViewItemStateChanged(GroupedListView& listView, int groupIndex, int itemIndex, int elementId, ListItemStatus status) +{ + int effectiveIndex = 0; + SettingPresentationModel* pSettingMgr = SettingPresentationModel::GetInstance(); + + if (pSettingMgr == null) + return; + + for (int i = 0; i < groupIndex; i++) + effectiveIndex = effectiveIndex + pGroupItemCount[i]; + effectiveIndex = effectiveIndex + itemIndex; + + if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_DROPDOWN) + { + AppLogDebug("refreshing data child count is %d", settingInfo[effectiveIndex].childCount); + if (settingInfo[effectiveIndex].isOpen == false) + { + settingInfo[effectiveIndex].isOpen = true; + settingInfo[effectiveIndex].childCount = 0; + for (int iter = effectiveIndex + 1; iter < SETTING_MAX; iter++) + { + if (settingInfo[iter].itemType == ITEM_TYPE_RADIO) + settingInfo[effectiveIndex].childCount++; + else + break; + } + listView.UpdateList(); + } + else + { + settingInfo[effectiveIndex].isOpen = false; + listView.UpdateList(); + } + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_RADIO) + { + int parentIndex = 0; + for (parentIndex = effectiveIndex; parentIndex > SETTING_INVALID; parentIndex--) + { + if (settingInfo[parentIndex].itemType == ITEM_TYPE_DROPDOWN) + break; + } + settingInfo[parentIndex].subText = settingInfo[effectiveIndex].titleText; + + for (int iter = 0; iter < settingInfo[parentIndex].childCount; iter++) + { + if (parentIndex + iter + 1 != effectiveIndex) + { + AppLogDebug("long effectiveIndex %d set to false", itemIndex - (effectiveIndex - parentIndex) + iter + 1); + settingInfo[parentIndex + iter + 1].isSelected = false; + } + else + { + AppLogDebug("effectiveIndex %d set to true", effectiveIndex); + settingInfo[effectiveIndex].isSelected = true; + } + if (effectiveIndex == SETTING_CURRENT_PAGE) + { + settingInfo[SETTING_CURRENT_PAGE].isSelected = false; + settingInfo[SETTING_FAVORITE_URL].isSelected = true; + } + //listView.RefreshList(groupIndex, itemIndex - (effectiveIndex - parentIndex) + iter + 1, LIST_REFRESH_TYPE_ITEM_MODIFY); + } +// listView.UpdateList(); + //listView.ScrollToItem(groupIndex, itemIndex, LIST_SCROLL_ITEM_ALIGNMENT_TOP); + Invalidate(true); + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_TOGGLE) + { + if (settingInfo[effectiveIndex].isSelected == true) + { + settingInfo[effectiveIndex].isSelected = false; + } + else + { + settingInfo[effectiveIndex].isSelected = true; + } +// listView.RefreshList(groupIndex, itemIndex, LIST_REFRESH_TYPE_ITEM_MODIFY); + if(__pList != null) + { + __pList->SetItemChecked(groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); + } + } + + switch (effectiveIndex) + { + case SETTING_CURRENT_PAGE: + //SettingPresentationModel::GetInstance()->SetHomepage(settingInfo[SETTING_FAVORITE_URL].titleText); + AppLog("setting current page currentURL is =%ls",__currentURL.GetPointer()); + if (__currentURL.CompareTo(L"") != 0) + { + AppLog("setting current page currentURL is =%ls",__currentURL.GetPointer()); + SettingPresentationModel::GetInstance()->SetHomepage(CommonUtil::GetString(L"IDS_BR_BODY_USER_HOMEPAGE")); + SettingPresentationModel::GetInstance()->SetFavoriteValue(__currentURL); + settingInfo[SETTING_FAVORITE_URL].titleText = __currentURL; +// listView.RefreshList(groupIndex, effectiveIndex, LIST_REFRESH_TYPE_ITEM_MODIFY); + listView.UpdateList(); + } + break; + case SETTING_BLANK_PAGE: + //SettingPresentationModel::GetInstance()->SetHomepage(settingInfo[SETTING_BLANK_PAGE].titleText); + SettingPresentationModel::GetInstance()->SetHomepage(CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")); + AppLog("GetHomepage() %ls",SettingPresentationModel::GetInstance()->GetHomepage().GetPointer()); + listView.UpdateList(); + + break; + case SETTING_MOST_VISITED_SITE: + SettingPresentationModel::GetInstance()->SetHomepage(settingInfo[SETTING_MOST_VISITED_SITE].titleText); + listView.UpdateList(); + break; + + case SETTING_FAVORITE_URL: + //SettingPresentationModel::GetInstance()->SetHomepage(settingInfo[SETTING_FAVORITE_URL].titleText); + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_EDIT_HOMEPAGE_VIEW, SCENE_TRANSITION_ANIMATION_TYPE_LEFT)); + break; + + case SETTING_FIT_TO_WIDTH: + SettingPresentationModel::GetInstance()->SetDefaultView(settingInfo[SETTING_FIT_TO_WIDTH].titleText); + listView.UpdateList(); + break; + + case SETTING_READABLE: + SettingPresentationModel::GetInstance()->SetDefaultView(settingInfo[SETTING_READABLE].titleText); + listView.UpdateList(); + break; + + case SETTING_RUN_JAVASCRIPT: + SettingPresentationModel::GetInstance()->SetRunJavascriptEnabled(settingInfo[SETTING_RUN_JAVASCRIPT].isSelected); + break; + + case SETTING_DISPLAY_IMAGES: + SettingPresentationModel::GetInstance()->SetDisplayImagesEnabled(settingInfo[SETTING_DISPLAY_IMAGES].isSelected); + break; + + case SETTING_BLOCK_POPUP: + SettingPresentationModel::GetInstance()->SetBlockPopUp(!settingInfo[SETTING_BLOCK_POPUP].isSelected); + break; + + case SETTING_CLEAR_CACHE: + ClearCache(); + break; + + case SETTING_CLEAR_HISTORY: + ClearHistory(); + break; + + case SETTING_SHOW_SECURITY_WARNINGS: + SettingPresentationModel::GetInstance()->SetSecurityWarningsEnabled(settingInfo[SETTING_SHOW_SECURITY_WARNINGS].isSelected); + break; + + case SETTING_ACCEPT_COOKIES: + SettingPresentationModel::GetInstance()->SetCookiesEnabled(settingInfo[SETTING_ACCEPT_COOKIES].isSelected); + break; + + case SETTING_CLEAR_COOKIE_DATA: + ClearCookie(); + break; + + case SETTING_SEARCH_ENGINE_YAHOO: + SettingPresentationModel::GetInstance()->SetSearchEngine(settingInfo[SETTING_SEARCH_ENGINE_YAHOO].titleText); + listView.UpdateList(); + break; + + case SETTING_SEARCH_ENGINE_NAVER: + SettingPresentationModel::GetInstance()->SetSearchEngine(settingInfo[SETTING_SEARCH_ENGINE_NAVER].titleText); + listView.UpdateList(); + break; + + case SETTING_SEARCH_ENGINE_GOOGLE: + SettingPresentationModel::GetInstance()->SetSearchEngine(settingInfo[SETTING_SEARCH_ENGINE_GOOGLE].titleText); + listView.UpdateList(); + break; + + case SETTING_RESET_TO_DEFAULT: + //OpenResetPopup(); + ResetToDefault(); + break; + + default: + break; + } +} + +void +SettingForm::OnGroupedListViewItemSwept(GroupedListView& listView, int groupIndex, int itemIndex, SweepDirection direction) +{ + +} + +GroupItem* +SettingForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + result r = E_FAILURE; + String text(L""); + GroupItem* pItem = null; + const Color ITEM_TEXT_COLOR = CUSTOM_COLOR_SETTINGS_GROUPTITLE; + + pItem = new(std::nothrow) GroupItem(); + if (pItem == null) + { + return null; + } + r = pItem->Construct(Dimension(itemWidth, 46)); + if (IsFailed(r)) + { + delete pItem; + return null; + } + + switch (groupIndex) + { + case 0: + text = CommonUtil::GetString(L"IDS_BR_BODY_HOMEPAGE"); // IDS_HOMEPAGE + settingInfo[SETTING_HOMEPAGE_TITLE].subText = SettingPresentationModel::GetInstance()->GetHomepage(); + break; + + case 1: + text = CommonUtil::GetString(L"IDS_BR_MBODY_PAGE_CONTENT_SETTINGS"); // IDS_BR_MBODY_PAGE_CONTENT_SETTINGS + break; + + case 2: + text = CommonUtil::GetString(L"IDS_BR_BODY_PRIVACY_AND_SECURITY_ABB"); // IDS_BR_BODY_PRIVACY_AND_SECURITY_ABB + break; + + case 3: + text = CommonUtil::GetString(L"IDS_BR_BODY_SEARCH"); // IDS_BR_BODY_SEARCH + break; + + case 4: + text = L""; + break; + + default: + break; + } + + pItem->SetElement(text, null); + + AppLogDebug("background color set result %s", GetErrorMessage(r)); + + pItem->SetTextColor(ITEM_TEXT_COLOR); + return pItem; +} + +ListItemBase* +SettingForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLog("SettingForm::CreateItem --> groupIndex : %d, itemIndex: %d itemWidth: %d ", groupIndex, itemIndex, itemWidth); + + result r = E_SUCCESS; + int effectiveIndex = 0; + const Color ITEM_BACKGROUND_COLOR = CUSTOM_COLOR_SETTINGS_LISTITEM_BACKGROUND; + const Color ITEM_RADIO_ITEM_BACKGROUND_COLOR = CUSTOM_COLOR_SETTINGS_LISTITEM_RADIO_BACKGROUND; + + for (int i = 0; i < groupIndex; i++) + effectiveIndex = effectiveIndex + pGroupItemCount[i]; + effectiveIndex = effectiveIndex + itemIndex; + AppLogDebug("SettingForm::CreateItem --> groupIndex : %d, itemIndex: %d itemWidth: %d effectiveIndex %d", groupIndex, itemIndex, itemWidth, effectiveIndex); + + if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_TOGGLE) + { + SettingToggleCustomItem* pItem = new(std::nothrow) SettingToggleCustomItem(); + r = pItem->Construct(itemWidth, 112); + if (IsFailed(r)) + { + delete pItem; + return null; + } +/* + Bitmap* pNormalBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG9,itemWidth,112); + Bitmap* pPressedBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG_PRESS9,itemWidth,112); + + if (pNormalBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_NORMAL,pNormalBackgroundBitmap); + delete pNormalBackgroundBitmap; + } + + if (pPressedBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_PRESSED,pPressedBackgroundBitmap); + delete pPressedBackgroundBitmap; + }*/ + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL,ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED,ITEM_BACKGROUND_COLOR); + if(__pList != null) + { + __pList->SetItemChecked(groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); + } + + pItem->SetText(settingInfo[effectiveIndex].titleText); + + //if (pBitmap != null) + // pItem->AddElement(Rectangle(0, 0, 10, 112), IDA_LIST_LEFT_SIDE_MARGIN, *pBitmap, null); + + pItem->Make(); +// if (__pList) +// { +// __pList->SetItemChecked(groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); +// AppLog("asdasda %s %d,%d-> %d",GetErrorMessage(r),groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); +// } + return pItem; + + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_DROPDOWN) + { + DropDownCustomItem* pItem = new(std::nothrow) DropDownCustomItem(); + r = pItem->Construct(itemWidth); + if (IsFailed(r)) + { + delete pItem; + return null; + } + +/* Bitmap* pNormalBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG9,itemWidth,128); + Bitmap* pPressedBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG_PRESS9,itemWidth,112); + + if (pNormalBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_NORMAL,pNormalBackgroundBitmap); + delete pNormalBackgroundBitmap; + } + + if (pPressedBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_PRESSED,pPressedBackgroundBitmap); + delete pPressedBackgroundBitmap; + }*/ + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL,ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED,ITEM_BACKGROUND_COLOR); + + pItem->SetMainText(settingInfo[effectiveIndex].titleText); + pItem->SetSubText(settingInfo[effectiveIndex].subText); + if (settingInfo[effectiveIndex].isOpen) + { + pItem->SetCurState(DROP_DOWN_ITEM_STATE_OPENED); + } + else + { + pItem->SetCurState(DROP_DOWN__ITEM_STATE_CLOSED); + } + r = pItem->Make(); + // if (pBitmap != null) + // pItem->AddElement(Rectangle(0, 0, 10, 128), IDA_LIST_LEFT_SIDE_MARGIN_DROPDOWN, *pBitmap, null); + + if (IsFailed(r)) + { + delete pItem; + return null; + } + + return pItem; + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_RADIO) + { + + + RadioCustomItem* pItem = new(std::nothrow) RadioCustomItem(); + int parentIndex = 0; + for (parentIndex = effectiveIndex; parentIndex > SETTING_INVALID; parentIndex--) + { + if (settingInfo[parentIndex].itemType == ITEM_TYPE_DROPDOWN) + break; + } + if (settingInfo[parentIndex].isOpen == false || (__isCurrentPageDisable == true && groupIndex == 0 && itemIndex == 1)) + { + r = pItem->Construct(itemWidth, 0); + AppLogDebug("construct with height 0 %s", GetErrorMessage(r)); + return pItem; + } + else + { + pItem->Construct(itemWidth, 112); + } +/* + Bitmap* pNormalBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG9,itemWidth,112); + Bitmap* pPressedBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG_PRESS9,itemWidth,112); + + if (pNormalBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_NORMAL,pNormalBackgroundBitmap); + delete pNormalBackgroundBitmap; + } + + if (pPressedBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_PRESSED,pPressedBackgroundBitmap); + delete pPressedBackgroundBitmap; + }*/ + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL,ITEM_RADIO_ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED,ITEM_RADIO_ITEM_BACKGROUND_COLOR); + + + pItem->SetText(settingInfo[effectiveIndex].titleText); + AppLogDebug("effectiveIndex %d SettingInfo[effectiveIndex].isSelected %d", effectiveIndex, settingInfo[effectiveIndex].isSelected); + + //if (pBitmap != null) + // pItem->AddElement(Rectangle(0, 0, 10, 112), IDA_LIST_LEFT_SIDE_MARGIN, *pBitmap, null); + + pItem->SetSelected(settingInfo[effectiveIndex].isSelected); + pItem->Make(); + + return pItem; + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_NORMAL) + { + DefaultCustomItem* pItem = new(std::nothrow) DefaultCustomItem(); + + r = pItem->Construct(itemWidth, 112); + if (IsFailed(r)) + { + delete pItem; + return null; + } + +/* + Bitmap* pNormalBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG9,itemWidth,112); + Bitmap* pPressedBackgroundBitmap = CommonUtil::GetNinepatchedBitmapN(IDB_LIST_GROUP_BG_PRESS9,itemWidth,112); + + if (pNormalBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_NORMAL,pNormalBackgroundBitmap); + delete pNormalBackgroundBitmap; + } + + if (pPressedBackgroundBitmap != NULL) + { + pItem->SetBackgroundBitmap(LIST_ITEM_DRAWING_STATUS_PRESSED,pPressedBackgroundBitmap); + delete pPressedBackgroundBitmap; + }*/ + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL,ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED,ITEM_BACKGROUND_COLOR); + + pItem->SetText(settingInfo[effectiveIndex].titleText); + + //if (pBitmap != null) + // pItem->AddElement(Rectangle(0, 0, 10, 112), IDA_LIST_LEFT_SIDE_MARGIN, *pBitmap, null); + + r = pItem->Make(); + if (IsFailed(r)) + { + delete pItem; + return null; + } + return pItem; + } + else + { + return null; + } +} + +bool +SettingForm::DeleteGroupItem(int groupIndex, GroupItem* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +bool +SettingForm::DeleteItem(int groupIndex, int itemIndex, ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +int +SettingForm::GetGroupCount(void) +{ + return groupCount; +} + +int +SettingForm::GetItemCount(int groupIndex) +{ + AppLog(" SettingForm::GetItemCount --> groupIndex : %d,", groupIndex); + return pGroupItemCount[groupIndex]; +} + +void +SettingForm::OnFormBackRequested(Form& source) +{ + String* pSelectedScene = NULL; + Object* value = NULL; + MultipleWindowPresentationModel::GetInstance()->GetValue(SELECTED_SCENE_ID, &value); + pSelectedScene = (String*) value; + if (pSelectedScene) + { + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(*pSelectedScene, SCENE_TRANSITION_ANIMATION_TYPE_NONE)); +// delete pSelectedScene; +// pSelectedScene = null; + } +} + +void +SettingForm::OnActionPerformed(const Control& source, int actionId) +{ + switch (actionId) + { + case IDA_BUTTON_NO: + if(__pConfirmationPopup) + { + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + delete __pConfirmationPopup; + __pConfirmationPopup = null; + } + break; + + case IDA_BUTTON_YES: + if(__pConfirmationPopup) + { + String message = L""; + __pConfirmationPopup->SetShowState(false); + __pConfirmationPopup->Show(); + if (__pConfirmationPopup->GetMessage() == CommonUtil::GetString(L"IDS_BR_POP_EMPTY_COOKIE_POPUP_BNO")) + { + message = CommonUtil::GetString(L"IDS_BR_POP_DELETED"); + SettingPresentationModel::GetInstance()->ClearCookie(); + } + else if (__pConfirmationPopup->GetMessage() == CommonUtil::GetString(L"IDS_BR_POP_DELETE_LOCALLY_CACHED_CONTENT_AND_DATABASES_Q")) + { + message = CommonUtil::GetString(L"IDS_BR_POP_DELETED"); + SettingPresentationModel::GetInstance()->ClearCache(); + } + else if (__pConfirmationPopup->GetMessage() == CommonUtil::GetString(L"IDS_BR_BODY_DELETE_BROWSER_HISTORY_Q")) + { + message = CommonUtil::GetString(L"IDS_BR_POP_DELETED"); + HistoryPresentationModel::GetInstance()->ClearHistory(); + } + else if (__pConfirmationPopup->GetMessage() == CommonUtil::GetString(L"IDS_BR_POP_RESET_ALL_SETTINGS_TO_DEFAULT_Q")) + { + message = CommonUtil::GetString(L"IDS_BR_SK_DONE"); + SettingPresentationModel::GetInstance()->ResetRegistry(); + InitializeSettingValues(); + if(__pList != null) + { + __pList->UpdateList(); + } + } + delete __pConfirmationPopup; + __pConfirmationPopup = null; + + NotificationPanel* pNotification = new (std::nothrow) NotificationPanel(*this); + pNotification->SetText(message); + pNotification->SetPositionDiff(0); + pNotification->ShowNotification(); + } + break; + + default: + break; + } +} + +void +SettingForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus) +{ + Rectangle rect = GetClientAreaBounds(); + if(__pList == null) + { + return; + } + __pList->SetBounds(rect); + __pList->UpdateList(); +} + +SettingForm::SettingItemInfo::SettingItemInfo(void) +{ + titleText = L""; + subText = L""; + childCount = 0; + isOpen = false; + isSelected = false ; +} +void +SettingForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + WindowInfo* pWindowInfo = null; + String curUrl = SettingPresentationModel::GetInstance()->GetFavoriteUrl(); + + pWindowInfo = MultipleWindowPresentationModel::GetInstance()->GetActiveWindowInfo(); + + if (previousSceneId == IDSCN_EDIT_HOMEPAGE_VIEW) + { + if (pArgs != null) + { + String* pValue = NULL; + pValue = dynamic_cast(pArgs->GetAt(0)); + if( pValue != NULL ) + { + if (pValue->CompareTo(L"Done") == 0) + { + SettingPresentationModel::GetInstance()->SetHomepage(CommonUtil::GetString(L"IDS_BR_BODY_USER_HOMEPAGE")); + } + else if (pValue->CompareTo(L"Cancel") == 0) + { + String homePage = SettingPresentationModel::GetInstance()->GetHomepage(); + if (homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES")) == 0) + { + settingInfo[SETTING_MOST_VISITED_SITE].isSelected = true; + settingInfo[SETTING_BLANK_PAGE].isSelected = false; + settingInfo[SETTING_CURRENT_PAGE].isSelected = false; + settingInfo[SETTING_FAVORITE_URL].isSelected = false; + + } + else if (homePage.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_BLANK_PAGE")) == 0) + { + settingInfo[SETTING_MOST_VISITED_SITE].isSelected = false; + settingInfo[SETTING_BLANK_PAGE].isSelected = true; + settingInfo[SETTING_CURRENT_PAGE].isSelected = false; + settingInfo[SETTING_FAVORITE_URL].isSelected = false; + } + } + } + } + } + + if (pWindowInfo != null) + { + __currentURL.Clear(); + __currentURL.Append(pWindowInfo->pageUrl); + AppLog("current url is %ls",__currentURL.GetPointer()); + + if (SettingPresentationModel::GetInstance()->GetFavoriteUrl().CompareTo(L"") == 0) + { + if (pWindowInfo->pageUrl.CompareTo(L"") == 0) + { + //settingInfo[SETTING_FAVORITE_URL].titleText = CommonUtil::GetString(L"IDS_SET_HOMEPAGE"); + settingInfo[SETTING_FAVORITE_URL].titleText = L"http://www.tizen.org"; + } + else + { + settingInfo[SETTING_FAVORITE_URL].titleText = pWindowInfo->pageUrl; + } + } + else + { + settingInfo[SETTING_FAVORITE_URL].titleText = SettingPresentationModel::GetInstance()->GetFavoriteUrl(); + } + } + + if (__pList != null) + { + __pList->UpdateList(); + if (pWindowInfo && pWindowInfo->pageUrl.CompareTo(L"") == 0) + { + __isCurrentPageDisable = true; + AppLog("set item enabled is false"); + __pList->SetItemEnabled(0, 1, false); + } + else + { + __isCurrentPageDisable = false; + AppLog("set item enabled is true"); + __pList->SetItemEnabled(0, 1, true); + } + for(int grpindex = 0; grpindex < groupCount; grpindex++) + { + for(int index = 0; index < *(pGroupItemCount+groupCount); index++) + { + int effectiveIndex = 0; + for (int i = 0; i < grpindex; i++) + effectiveIndex = effectiveIndex + pGroupItemCount[i]; + effectiveIndex = effectiveIndex + index; + + if(effectiveIndex >= SETTING_MAX) + { + continue; + } + if(settingInfo[effectiveIndex].itemType == ITEM_TYPE_TOGGLE || settingInfo[effectiveIndex].itemType == ITEM_TYPE_RADIO ) + { + __pList->SetItemChecked(grpindex, index, settingInfo[effectiveIndex].isSelected); + } + } + } + } + return; +} + +void +SettingForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + return; +} + +void +SettingForm::ClearHistory(void) +{ + String message = CommonUtil::GetString(L"IDS_BR_BODY_DELETE_BROWSER_HISTORY_Q"); + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(message); + __pConfirmationPopup->Show(); +} + +void +SettingForm::ClearCache(void) +{ + String message = CommonUtil::GetString(L"IDS_BR_POP_DELETE_LOCALLY_CACHED_CONTENT_AND_DATABASES_Q"); + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(message); + __pConfirmationPopup->Show(); +} + +void +SettingForm::ClearCookie(void) +{ + String message = CommonUtil::GetString(L"IDS_BR_POP_EMPTY_COOKIE_POPUP_BNO"); + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(message); + __pConfirmationPopup->Show(); +} + +void +SettingForm::ResetToDefault() +{ + String message = CommonUtil::GetString(L"IDS_BR_POP_RESET_ALL_SETTINGS_TO_DEFAULT_Q"); + __pConfirmationPopup = new(std::nothrow) ConfirmationPopup(); + __pConfirmationPopup->Initialize(); + __pConfirmationPopup->RemoveActionListener(*this); + __pConfirmationPopup->AddActionListener(*this); + __pConfirmationPopup->setMessage(message); + __pConfirmationPopup->Show(); +} diff --git a/src/IntSettingPresentationModel.cpp b/src/IntSettingPresentationModel.cpp new file mode 100644 index 0000000..341748b --- /dev/null +++ b/src/IntSettingPresentationModel.cpp @@ -0,0 +1,681 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet +/*@file: IntSettingsPresentationModel.cpp + *@brief: Used to define SettingsManager + */ + +#include +#include "IntCommonLib.h" +#include "IntSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Io; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Web::Controls; + +SettingPresentationModel* SettingPresentationModel::__pSettingsPresentationModel = null; + +SettingPresentationModel::SettingPresentationModel(void) +{ + __listenerList.Construct(); + SetDefaultValues(); + __isPrivateOn = false; +} + +SettingPresentationModel::SettingPresentationModel(const SettingPresentationModel& settingModelObj) +{ + +} + +SettingPresentationModel& SettingPresentationModel::operator=(const SettingPresentationModel& settingModelObj) +{ + return *this; +} + +SettingPresentationModel::~SettingPresentationModel(void) +{ + +} + +void +SettingPresentationModel::SetDefaultValues(void) +{ + //__homePage = CommonUtil::GetString(L"IDS_EMPTY_PAGE"); + __homePage = CommonUtil::GetString(L"IDS_BR_BODY_MOST_VISITED_SITES"); + __defaultViewLevel = CommonUtil::GetString(L"IDS_BR_BODY_FIT_TO_WIDTH"); // IDS_FIT_TO_WIDTH + __runJsEnabled = true; + __displayImages = true; + __html5Videos = true; + __wordWrap = true; + __blockPopUp = true; + __rememberFormData = false; + __rememberPassword = false; + __cookies = true; + __savePassword = CommonUtil::GetString(L"IDS_BR_BODY_ALWAYS_ASK"); // IDS_ALWAYS_ASK + __securityWarnings = true; + __searchEngine = CommonUtil::GetString(L"IDS_BR_BODY_YAHOO"); // L"Yahoo"; + __caseSensitive = false; + __runReader = true; + __fontSize = 24; + + __setting.SetInputStyle(INPUT_STYLE_OVERLAY); + __setting.SetAutoImageLoadEnabled(__displayImages); + __setting.SetJavascriptEnabled(__runJsEnabled); + __setting.SetJavaScriptPopupEnabled(__blockPopUp); + + if (__securityWarnings == true) + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM); + } + else + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_CONTINUE); + } +} + +void +SettingPresentationModel::CreateInstance(void) +{ + if (__pSettingsPresentationModel == null) + __pSettingsPresentationModel = new(std::nothrow) SettingPresentationModel(); + result r = __pSettingsPresentationModel->Construct(); + if (IsFailed(r)) + { + delete __pSettingsPresentationModel; + __pSettingsPresentationModel = null; + return; + } + std::atexit(DestroyInstance); +} + +SettingPresentationModel* +SettingPresentationModel::GetInstance(void) +{ + if (__pSettingsPresentationModel == null) + { + CreateInstance(); + } + return __pSettingsPresentationModel; +} + +void +SettingPresentationModel::DestroyInstance(void) +{ + if (__pSettingsPresentationModel) + { + delete __pSettingsPresentationModel; + __pSettingsPresentationModel = null; + } +} + +result +SettingPresentationModel::LoadRegistry(void) +{ + AppLog("SettingPresentationModel::LoadRegistry entered"); + result r = E_FAILURE; + + SetDefaultValues(); + for (int settingValueName = REGISTRY_SETTING_HOMEPAGE; settingValueName < MAX_REGISTRY_SETTING; settingValueName++) + { + r = AppRegistry::GetInstance()->Get(__entry[settingValueName], __values[settingValueName]); + if (r != E_SUCCESS && r != E_KEY_NOT_FOUND) + { + AppLog("Registry Load failed with result %s settingValueName %d", GetErrorMessage(r),settingValueName); + return r; + } + } + if (__values[REGISTRY_SETTING_HOMEPAGE].CompareTo(L"") != 0) + { + __homePage = __values[REGISTRY_SETTING_HOMEPAGE]; + AppLog("homepage Loading from registry %ls",__homePage.GetPointer()); + } + if (__values[REGISTRY_SETTING_DEFAULT_VIEW].CompareTo(L"") != 0) + { + __defaultViewLevel = __values[REGISTRY_SETTING_DEFAULT_VIEW]; + } + if (__values[REGISTRY_SETTING_RUN_JAVASCRIPT].CompareTo(L"") != 0) + { + __runJsEnabled = Boolean::Parse(__values[REGISTRY_SETTING_RUN_JAVASCRIPT], false); + AppLogDebug("LoadRegistry __runJsEnabled %d",__runJsEnabled); + } + if (__values[REGISTRY_SETTING_DISPLAY_IMAGES].CompareTo(L"") != 0) + { + __displayImages = Boolean::Parse(__values[REGISTRY_SETTING_DISPLAY_IMAGES], false); + AppLogDebug("LoadRegistry __displayImages %d",__displayImages); + } + if (__values[REGISTRY_SETTING_HTML5_VIDEOS].CompareTo(L"") != 0) + { + __html5Videos = Boolean::Parse(__values[REGISTRY_SETTING_HTML5_VIDEOS], false); + AppLogDebug("LoadRegistry __html5Videos %d",__html5Videos); + } + if (__values[REGISTRY_SETTING_WORD_WRAPPING].CompareTo(L"") != 0) + { + __wordWrap = Boolean::Parse(__values[REGISTRY_SETTING_WORD_WRAPPING], false); + AppLogDebug("LoadRegistry __wordWrap %d",__wordWrap); + } + if (__values[REGISTRY_SETTING_BLOCK_POPUP].CompareTo(L"") != 0) + { + __blockPopUp = Boolean::Parse(__values[REGISTRY_SETTING_BLOCK_POPUP], false); + AppLogDebug("LoadRegistry __blockPopUp %d",__blockPopUp); + } + if (__values[REGISTRY_SETTING_ACCEPT_COOKIES].CompareTo(L"") != 0) + { + __cookies = Boolean::Parse(__values[REGISTRY_SETTING_ACCEPT_COOKIES], false); + AppLogDebug("LoadRegistry __cookies %d",__cookies); + } + if (__values[REGISTRY_SETTING_AUTOSAVE_ID_PASSWORD].CompareTo(L"") != 0) + { + __savePassword = __values[REGISTRY_SETTING_AUTOSAVE_ID_PASSWORD]; + } + if (__values[REGISTRY_SETTING_SHOW_SECURITY_WARNINGS].CompareTo(L"") != 0) + { + __securityWarnings = Boolean::Parse(__values[REGISTRY_SETTING_SHOW_SECURITY_WARNINGS], false); + AppLogDebug("LoadRegistry __securityWarnings %d",__securityWarnings); + } + if (__values[REGISTRY_SETTING_SEARCH_ENGINE].CompareTo(L"") != 0) + { + __searchEngine = __values[REGISTRY_SETTING_SEARCH_ENGINE]; + } + if (__values[REGISTRY_SETTING_CASE_SENSITIVE].CompareTo(L"") != 0) + { + __caseSensitive = Boolean::Parse(__values[REGISTRY_SETTING_CASE_SENSITIVE], false); + AppLogDebug("LoadRegistry __caseSensitive %d",__caseSensitive); + } + if (__values[REGISTRY_SETTING_RUN_READER].CompareTo(L"") != 0) + { + __runReader = Boolean::Parse(__values[REGISTRY_SETTING_RUN_READER], false); + AppLogDebug("LoadRegistry __runReader %d",__runReader); + } + if (__values[REGISTRY_SETTING_READER_FONT_SIZE].CompareTo(L"") != 0) + { + Integer::Parse(__values[REGISTRY_SETTING_READER_FONT_SIZE], (int&)__fontSize); + } + if (__values[REGISTRY_SETTING_REMEMBER_FORM_DATA].CompareTo(L"") != 0) + { + __rememberFormData = Boolean::Parse(__values[REGISTRY_SETTING_REMEMBER_FORM_DATA], false); + AppLogDebug("LoadRegistry form data %d",__rememberFormData); + } + if (__values[REGISTRY_SETTING_REMEMBER_PASSWORD].CompareTo(L"") != 0) + { + __rememberPassword = Boolean::Parse(__values[REGISTRY_SETTING_REMEMBER_PASSWORD], false); + AppLogDebug("LoadRegistry form password %d",__rememberPassword); + } + // + for (int index = REGISTRY_SETTING_HOMEPAGE; index < MAX_REGISTRY_SETTING; index++) + { + AppLogDebug("registry loaded value :%ls at index %d", __values[index].GetPointer(), index); + } + __setting.SetInputStyle(INPUT_STYLE_OVERLAY); + __setting.SetAutoImageLoadEnabled(__displayImages); + __setting.SetJavascriptEnabled(__runJsEnabled); + __setting.SetJavaScriptPopupEnabled(__blockPopUp); + + if (__securityWarnings == true) + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM); + } + else + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_CONTINUE); + } + __favouriteURL.Clear(); + __favouriteURL = L""; + r = AppRegistry::GetInstance()->Get(__entry[REGISTRY_SETTING_FAVORITE_URL_VALUE], __favouriteURL); + AppLog("__favouriteURL taken from registry is %ls",__favouriteURL.GetPointer()); + + if (r != E_SUCCESS && r != E_KEY_NOT_FOUND) + { + AppLogDebug("Registry Load failed with result %s", GetErrorMessage(r)); + return r; + } + + return E_SUCCESS; +} + +result +SettingPresentationModel::ResetRegistry(void) +{ + result r = E_FAILURE; + + AppLogDebug("SettingsManager::ResetRegistry"); + for (int index = REGISTRY_SETTING_INVALID+1; index < MAX_REGISTRY_SETTING; index++) + { + r = AppRegistry::GetInstance()->Remove(__entry[index]); + AppLogDebug("Registry Remove result %s",GetErrorMessage(r)); + } + + AppRegistry::GetInstance()->Save(); + + for (int index = REGISTRY_SETTING_HOMEPAGE; index < MAX_REGISTRY_SETTING; index++) + { + __values[index] = L""; + } + + SetDefaultValues(); + for (int index = 0; index < __listenerList.GetCount(); index++) + { + ISettingChangeEventListener* pSettingsListener = static_cast< ISettingChangeEventListener* >(__listenerList.GetAt(index)); + if (pSettingsListener) + pSettingsListener->OnSettingsReset(); + } + + return E_SUCCESS; +} + +void +SettingPresentationModel::ClearCache(void) +{ + for (int index = 0; index < __listenerList.GetCount(); index++) + { + ISettingChangeEventListener* pSettingsListener = static_cast< ISettingChangeEventListener* >(__listenerList.GetAt(index)); + if (pSettingsListener) + pSettingsListener->OnClearCache(); + } +} + +void +SettingPresentationModel::ClearCookie(void) +{ + for (int index = 0; index < __listenerList.GetCount(); index++) + { + ISettingChangeEventListener* pSettingsListener = static_cast< ISettingChangeEventListener* >(__listenerList.GetAt(index)); + if (pSettingsListener) + pSettingsListener->OnClearCookie(); + } +} + +result +SettingPresentationModel::Construct(void) +{ + result r = E_FAILURE; + + for (int index = REGISTRY_SETTING_HOMEPAGE; index < MAX_REGISTRY_SETTING; index++) + { + __values[index] = L""; + } + + __entry[REGISTRY_SETTING_HOMEPAGE] = L"homePage"; + __entry[REGISTRY_SETTING_DEFAULT_VIEW] = L"defaultViewLevel"; + __entry[REGISTRY_SETTING_RUN_JAVASCRIPT] = L"runJs"; + __entry[REGISTRY_SETTING_DISPLAY_IMAGES] = L"displayImages"; + __entry[REGISTRY_SETTING_HTML5_VIDEOS] = L"html5Videos"; + __entry[REGISTRY_SETTING_WORD_WRAPPING] = L"wordWrap"; + __entry[REGISTRY_SETTING_BLOCK_POPUP] = L"blockPopUp"; + __entry[REGISTRY_SETTING_ACCEPT_COOKIES] = L"cookies"; + __entry[REGISTRY_SETTING_AUTOSAVE_ID_PASSWORD] = L"savePassword"; + __entry[REGISTRY_SETTING_SHOW_SECURITY_WARNINGS] = L"securityWarnings"; + __entry[REGISTRY_SETTING_SEARCH_ENGINE] = L"searchEngine"; + __entry[REGISTRY_SETTING_CASE_SENSITIVE] = L"caseSensitive"; + __entry[REGISTRY_SETTING_RUN_READER] = L"runReader"; + __entry[REGISTRY_SETTING_READER_FONT_SIZE] = L"fontSize"; + __entry[REGISTRY_SETTING_FAVORITE_URL_VALUE] = L"Favourite"; + __entry[REGISTRY_SETTING_REMEMBER_FORM_DATA] = L"formData"; + __entry[REGISTRY_SETTING_REMEMBER_PASSWORD] = L"rememberPassword"; + + r = LoadRegistry(); + return E_SUCCESS; +} + +result +SettingPresentationModel::SetValue(const int settingValueName, const String& val) +{ + result r = E_FAILURE; + + AppLogDebug("SettingsManager::SetValue settingValueName:%d val %ls", settingValueName, val.GetPointer()); + if (__values[settingValueName] == L"") + { + AppLogDebug("adding the new (std::nothrow) entry into registry"); + r = AppRegistry::GetInstance()->Add(__entry[settingValueName], val); + } + else + { + AppLogDebug("modifying entry into registry"); + r = AppRegistry::GetInstance()->Set(__entry[settingValueName], val); + } + TryCatch(!IsFailed(r),,"Adding into registry failed %s",GetErrorMessage(r)); + + r = AppRegistry::GetInstance()->Save(); + TryCatch(!IsFailed(r),,"Save Failed with error %s",GetErrorMessage(r)); + + for (int index = 0; index < __listenerList.GetCount(); index++) + { + ISettingChangeEventListener* pSettingsListener = static_cast< ISettingChangeEventListener* >(__listenerList.GetAt(index)); + if (pSettingsListener) + pSettingsListener->OnSettingsChange(settingValueName); + } + + __values[settingValueName] = val; + + CATCH: + return r; + +} + +result +SettingPresentationModel::SetFavoriteValue(const Tizen::Base::String& val) +{ + result r = E_FAILURE; + + if (__favouriteURL == L"") + r = AppRegistry::GetInstance()->Add(__entry[REGISTRY_SETTING_FAVORITE_URL_VALUE], val); + else + r = AppRegistry::GetInstance()->Set(__entry[REGISTRY_SETTING_FAVORITE_URL_VALUE], val); + TryCatch(!IsFailed(r),,"registry set failed with error %s",GetErrorMessage(r)); + r = AppRegistry::GetInstance()->Save(); + TryCatch(!IsFailed(r),,"registry set failed with error %s",GetErrorMessage(r)); + __favouriteURL.Clear(); + __favouriteURL.Append(val); + + CATCH: + return r; +} + +String +SettingPresentationModel::GetFavoriteUrl(void) +{ + __favouriteURL.Clear(); + __favouriteURL = L""; + AppRegistry::GetInstance()->Get(__entry[REGISTRY_SETTING_FAVORITE_URL_VALUE], __favouriteURL); + + return __favouriteURL; +} + +void +SettingPresentationModel::AddSettingsEventListener(const ISettingChangeEventListener& listener) +{ + __listenerList.Add(listener); +} + +void +SettingPresentationModel::RemoveSettingsEventListener(ISettingChangeEventListener& listener) +{ + __listenerList.Remove(listener, false); +} + +void +SettingPresentationModel::SetHomepage(const String& homePage) +{ + __homePage.Clear(); + __homePage.Append(homePage); + AppLog("SettingPresentationModel::SetHomepage %ls",__homePage.GetPointer()); + SetValue((int) REGISTRY_SETTING_HOMEPAGE, __homePage); +} + +String +SettingPresentationModel::GetHomepage(void) +{ + return __homePage; +} + +void +SettingPresentationModel::SetDefaultView(const String& viewLevel) +{ + __defaultViewLevel = viewLevel; + //CommonUtil::GetString(L"IDS_FIT_TO_WIDTH") + if (__defaultViewLevel.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_FIT_TO_WIDTH")) == 0) + { + __setting.SetAutoFittingEnabled(true); + } + else if (__defaultViewLevel.CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_READABLE")) == 0) + { + __setting.SetAutoFittingEnabled(false); + } + + SetValue((int) REGISTRY_SETTING_DEFAULT_VIEW, viewLevel); +} + +String +SettingPresentationModel::GetDefaultView(void) +{ + return __defaultViewLevel; +} + +void +SettingPresentationModel::SetRunJavascriptEnabled(bool runJsEnabled) +{ + __runJsEnabled = runJsEnabled; + SetValue((int) REGISTRY_SETTING_RUN_JAVASCRIPT, Boolean::ToString(runJsEnabled)); + __setting.SetJavascriptEnabled(runJsEnabled); +} + +bool +SettingPresentationModel::IsRunJavascriptEnabled(void) +{ + return __runJsEnabled; +} + +void +SettingPresentationModel::SetDisplayImagesEnabled(bool displayImages) +{ + __displayImages = displayImages; + SetValue((int) REGISTRY_SETTING_DISPLAY_IMAGES, Boolean::ToString(displayImages)); + __setting.SetAutoImageLoadEnabled(__displayImages); +} + +bool +SettingPresentationModel::IsDisplayImagesEnabled(void) +{ + return __displayImages; +} + +void +SettingPresentationModel::SetHtml5VideosEnabled(bool html5Videos) +{ + __html5Videos = html5Videos; + SetValue((int) REGISTRY_SETTING_HTML5_VIDEOS, Boolean::ToString(html5Videos)); +} + +bool +SettingPresentationModel::IsHtml5VideosEnabled(void) +{ + return __html5Videos; +} + +void +SettingPresentationModel::SetWordWrapEnabled(bool wordWrap) +{ + __wordWrap = wordWrap; + SetValue((int) REGISTRY_SETTING_WORD_WRAPPING, Boolean::ToString(wordWrap)); +} + +bool +SettingPresentationModel::IsWordWrapEnabled(void) +{ + return __wordWrap; +} + +void +SettingPresentationModel::SetBlockPopUp(bool blockPopUp) +{ + __blockPopUp = blockPopUp; + SetValue((int) REGISTRY_SETTING_BLOCK_POPUP, Boolean::ToString(blockPopUp)); + __setting.SetJavaScriptPopupEnabled(__blockPopUp); +} + +bool +SettingPresentationModel::IsBlockPopUp(void) +{ + return __blockPopUp; +} + +void +SettingPresentationModel::SetCookiesEnabled(bool cookiesEnabled) +{ + __cookies = cookiesEnabled; + SetValue((int) REGISTRY_SETTING_ACCEPT_COOKIES, Boolean::ToString(cookiesEnabled)); +} + +bool +SettingPresentationModel::IsCookiesEnabled(void) +{ + return __cookies; +} + +void +SettingPresentationModel::SetRememberFormData(bool formData) +{ + __rememberFormData = formData; + SetValue((int) REGISTRY_SETTING_REMEMBER_FORM_DATA, Boolean::ToString(__rememberFormData)); +} + +bool +SettingPresentationModel::IsRememberFormData(void) +{ + return __rememberFormData; +} + +void SettingPresentationModel::SetRememberPassword(bool rememberPassword) +{ + __rememberPassword = rememberPassword; + SetValue((int) REGISTRY_SETTING_REMEMBER_PASSWORD, Boolean::ToString(__rememberPassword)); +} + +bool SettingPresentationModel::IsRememberPassword(void) +{ + return __rememberPassword; +} + +void +SettingPresentationModel::SetSavePassword(const String& savePassword) +{ + __savePassword = savePassword; + SetValue((int) REGISTRY_SETTING_AUTOSAVE_ID_PASSWORD, savePassword); +} + +String +SettingPresentationModel::GetSavePassword(void) +{ + return __savePassword; +} + +void +SettingPresentationModel::SetSecurityWarningsEnabled(bool securityWarnings) +{ + __securityWarnings = securityWarnings; + SetValue((int) REGISTRY_SETTING_SHOW_SECURITY_WARNINGS, Boolean::ToString(securityWarnings)); + if (__securityWarnings == true) + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_USER_CONFIRM); + } + else + { + __setting.SetCertificateErrorHandlingMode(WEB_CERTIFICATE_ERROR_HANDLING_MODE_CONTINUE); + } +} + +bool +SettingPresentationModel::IsSecurityWarningsEnabled(void) +{ + return __securityWarnings; +} + +void +SettingPresentationModel::SetSearchEngine(const String& searchEngine) +{ + __searchEngine = searchEngine; + SetValue((int) REGISTRY_SETTING_SEARCH_ENGINE, searchEngine); +} + +String +SettingPresentationModel::GetSearchEngine(void) +{ + return __searchEngine; +} + +void +SettingPresentationModel::SetCaseSensitiveEnabled(bool caseSensitive) +{ + __caseSensitive = caseSensitive; + SetValue((int) REGISTRY_SETTING_CASE_SENSITIVE, Boolean::ToString(caseSensitive)); +} + +bool +SettingPresentationModel::IsCaseSensitiveEnabled(void) +{ + return __caseSensitive; +} + +void +SettingPresentationModel::SetRunReaderEnabled(bool runReader) +{ + __runReader = runReader; + SetValue((int) REGISTRY_SETTING_RUN_READER, Boolean::ToString(runReader)); +} + +bool +SettingPresentationModel::IsRunReaderEnabled(void) +{ + return __runReader; +} + +void +SettingPresentationModel::SetReaderFontSize(int fontSize) +{ + __fontSize = fontSize; + SetValue((int) REGISTRY_SETTING_READER_FONT_SIZE, Integer::ToString(__fontSize)); +} + +int +SettingPresentationModel::GetReaderFontSize(void) +{ + return __fontSize; +} + +String +SettingPresentationModel::GetSearchUrl(const String& searchText) +{ + String searchStr = L""; + if (GetSearchEngine().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_YAHOO")) == 0) + { + searchStr.Append(L"http://search.yahoo.com/search?p="); + searchStr.Append(searchText); + } + else if (GetSearchEngine().CompareTo(CommonUtil::GetString(L"IDS_BR_BODY_NAVER")) == 0) + { + searchStr.Append(L"http://search.naver.com/search.naver?query="); + searchStr.Append(searchText); + } + else if (GetSearchEngine().CompareTo(CommonUtil::GetString(L"IDS_COM_BODY_GOOGLE")) == 0) + { + searchStr.Append(L"http://www.google.com/search?q="); + searchStr.Append(searchText); + } + return searchStr; +} + +Tizen::Web::Controls::WebSetting& +SettingPresentationModel::GetWebSettings(void) +{ + return __setting; +} + +void +SettingPresentationModel::SetPrivateOn(bool isPrivateOn) +{ + __isPrivateOn = isPrivateOn; + return; +} + +bool +SettingPresentationModel::GetPrivateOn(void) +{ + return __isPrivateOn; +} diff --git a/src/IntSettingToggleCustomItem.cpp b/src/IntSettingToggleCustomItem.cpp new file mode 100644 index 0000000..6258922 --- /dev/null +++ b/src/IntSettingToggleCustomItem.cpp @@ -0,0 +1,85 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +//!Internet SettingToggleCustomItem class +/*@file: SettingToggleCustomItem.cpp + *@brief: The SettingToggleCustomItem + * + */ + +#include + +#include "IntSettingToggleCustomItem.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +static const int IDA_FORMAT_STRING = 101; + +SettingToggleCustomItem::SettingToggleCustomItem(void) +{ + __text = L""; + __width = 0 ; + __height = 0 ; +} + +SettingToggleCustomItem::~SettingToggleCustomItem(void) +{ + +} + +result +SettingToggleCustomItem::Construct(int width, int height) +{ + result r = E_FAILURE; + + __width = width; + __height = height; + const Dimension dim(width, height); + r = CustomItem::Construct(dim, LIST_ANNEX_STYLE_ONOFF_SLIDING); + + return r; +} + +void +SettingToggleCustomItem::SetText(Tizen::Base::String& text) +{ + __text = text; +} + +String +SettingToggleCustomItem::GetText(void) +{ + return __text; +} + +result +SettingToggleCustomItem::Make(void) +{ + const Color textColor = CUSTOM_COLOR_TRANSPARENT; + const Color pressedTextColor = CUSTOM_COLOR_TRANSPARENT; + const int X_Margin = 26; + const int Y_Margin = 26; + const int textSize = 40; + + AddElement(Rectangle(X_Margin, Y_Margin, __width - 60, 60), IDA_FORMAT_STRING, __text, textSize, textColor, pressedTextColor, pressedTextColor, true); + SetElementSelectionEnabled(IDA_FORMAT_STRING, false); + + return E_SUCCESS; +} diff --git a/src/IntSharePopup.cpp b/src/IntSharePopup.cpp new file mode 100644 index 0000000..3e1c97a --- /dev/null +++ b/src/IntSharePopup.cpp @@ -0,0 +1,412 @@ +// + +// Copyright (c) 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://floralicense.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. +// + +/* + * IntSharePopUp.cpp + *@file: IntSharePopup.cpp + *@brief: Share Popup for sharing bookmark via message, email etc + */ + +#include +#include +#include +#include + +#include "IntCommonLib.h" +#include "IntSharePopup.h" + +using namespace Tizen::App; +using namespace Tizen::Io; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const int SharePopup::IDA_CANCEL_BUTTON = 101; +const int SharePopup::ID_FORMAT_MESSAGE_STRING = 500; +const int SharePopup::ID_FORMAT_EMAIL_STRING = 501; +const int SharePopup::ID_FORMAT_FACEBOOK_STRING = 502; +const int SharePopup::ID_FORMAT_TWITTER_STRING = 503; + +ShareInfo:: ShareInfo(void) +{ + isImageAttached = false; +} + +ShareInfo:: ~ShareInfo(void) +{ + +} + +void +ShareInfo::SetPageTitle(Tizen::Base::String aPageTitle) +{ + __pageTitle.Clear(); + __pageTitle.Append(aPageTitle); +} + +void +ShareInfo::SetPageUrl(Tizen::Base::String aPageURL) +{ + __pageURL.Clear(); + __pageURL.Append(aPageURL); +} + +Tizen::Base::String +ShareInfo::GetPageTitle(void) +{ + return __pageTitle; +} + +Tizen::Base::String +ShareInfo::GetPageURL(void) +{ + return __pageURL; +} + +void +ShareInfo::SetImageAttached(bool imageAttached) +{ + isImageAttached = imageAttached; +} + +bool +ShareInfo::GetImageAttached() +{ + return isImageAttached; +} + +void +ShareInfo::SetImagePath(Tizen::Base::String aImagePath) +{ + __imagePath.Clear(); + __imagePath.Append(aImagePath); +} + +Tizen::Base::String +ShareInfo::GetImagePath(void) +{ + return __imagePath; +} + +SharePopup::SharePopup(void) +:__pList(null),__pShareList(null) +{ + +} + +SharePopup::~SharePopup(void) +{ + +} + +bool +SharePopup::Initialize(void) +{ + Button* pCancelButton = null; + + Popup::Construct(L"IDL_SHARE_POPUP"); + SetName(L"CommonPopup"); + + __pShareList = new(std::nothrow) ArrayList(); + __pShareList->Construct(); + + __pList = static_cast(GetControl(L"IDC_POPUP_LIST")); + if (__pList == null) + { + return false; + } + + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + + pCancelButton = static_cast< Button* >(GetControl(L"IDC_BUTTON", true)); + if (pCancelButton) + { + pCancelButton->AddActionEventListener(*this); + pCancelButton->SetActionId(IDA_CANCEL_BUTTON); + } + + return true; +} + +result +SharePopup::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +SharePopup::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + switch(actionId) + { + case IDA_CANCEL_BUTTON: + { + Popup::SetShowState(false); + Popup::Show(); + } + break; + default: + break; + } + return; +} + +void +SharePopup::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state) +{ + return; +} + +void +SharePopup::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + switch (index) + { + case 0: + { + Popup::SetShowState(false); + Popup::Show(); + // share via message + StartMessageAppControl(); + } + break; + case 1: + { + Popup::SetShowState(false); + Popup::Show(); + // share via email + StartEmailAppControl(); + } + break; + default: + break; + } +} + +void +SharePopup::OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ + return; +} + +void +SharePopup::OnListViewItemLongPressed(Tizen::Ui::Controls::ListView& listView, int index, int elementId, bool& invokeListViewItemCallback) +{ + return; +} + +Tizen::Ui::Controls::ListItemBase* +SharePopup::CreateItem(int index, int itemWidth) +{ + result r = E_FAILURE; + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + int textSize = 35; + int elementHeight = 50; + int listItemWidth = 112; + + CustomItem* pItem = new(std::nothrow) CustomItem(); + r = pItem->Construct(Dimension(GetClientAreaBounds().width, listItemWidth), style); + if (IsFailed(r)) + { + AppLogDebug("Create Item Failed with error %s", GetErrorMessage(r)); + delete pItem; + return null; + } + + switch(index) + { + case 0: + { + AppLogDebug("SharePopUp CreateItem 0"); + // IDS_SHARE_VIA_MESSAGE + pItem->AddElement(Rectangle(0,0, GetClientAreaBounds().width, listItemWidth), ID_FORMAT_MESSAGE_STRING, CommonUtil::GetString(L"IDS_BR_OPT_SHARE_VIA_MESSAGES"), true); + } + break; + case 1: + { + AppLogDebug("SharePopUp CreateItem 1"); + // IDS_SHARE_VIA_EMAIL + pItem->AddElement(Rectangle(0, 0, GetClientAreaBounds().width, listItemWidth), ID_FORMAT_EMAIL_STRING, CommonUtil::GetString(L"IDS_BR_OPT_SHARE_VIA_EMAIL"), true); + } + break; + default: + break; + } + return pItem; +} + +bool +SharePopup::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + return true; +} + +int +SharePopup::GetItemCount(void) +{ + return 2; +} + +result +SharePopup::AddShareInfo(ShareInfo* pShareInfo) +{ + result r = E_FAILURE; + + if (__pShareList != NULL) + { + r = __pShareList->Add(*pShareInfo); + } + return r; +} + +void SharePopup::RemoveAllShareInfo() +{ + __pShareList->RemoveAll(); +} + +void +SharePopup::StartEmailAppControl(void) +{ + HashMap extraData; + ShareInfo* pShareInfo = null; + result r = E_FAILURE; + bool imageAttachment = false; + + extraData.Construct(); + + if (__pShareList != null) + { + pShareInfo = dynamic_cast(__pShareList->GetAt(0)); + if (pShareInfo != null) + { + String testURL = pShareInfo->GetPageURL(); + AppLogDebug("getpageURL getpageURL is %ls", testURL.GetPointer()); + } + } + + String textVal; + + if (pShareInfo != null) + { + textVal.Append(pShareInfo->GetPageTitle()); + textVal.Append(L" <"); + AppLog("share info url is %ls",pShareInfo->GetPageURL().GetPointer()); + textVal.Append(pShareInfo->GetPageURL().GetPointer()); + textVal.Append(L">"); + } + + String subjectKey = L"subject"; + String subjectVal = L""; + String textKey = L"text"; + + String toKey = L"to"; + String toVal = L""; + String ccKey = L"cc"; + String ccVal = L""; + String bccKey = L"bcc"; + String bccVal = L""; + String attachKey = L"attachments"; + String attachVal; + if (pShareInfo != null) + { + imageAttachment = pShareInfo->GetImageAttached(); + if (imageAttachment) + { + attachVal = pShareInfo->GetImagePath(); + AppLog("SharePopup::StartEmailAppControl imagePath is %S",attachVal.GetPointer()); + } + else + { + attachVal = L""; + } + } + + extraData.Add(&subjectKey, &subjectVal); + extraData.Add(&textKey, &textVal); + extraData.Add(&toKey, &toVal); + extraData.Add(&ccKey, &ccVal); + extraData.Add(&bccKey, &bccVal); + extraData.Add(&attachKey, &attachVal); + + AppControl* pAc = AppManager::FindAppControlN(L"tizen.email", L"http://tizen.org/appcontrol/operation/compose"); + if (pAc) + { + pAc->Start(null, null, &extraData, null); + delete pAc; + } + if (pShareInfo != null) + { + delete pShareInfo; + } +} + +void +SharePopup::StartMessageAppControl(void) +{ + HashMap extraData; + ShareInfo* pShareInfo = null; + + extraData.Construct(); + + if (__pShareList != null) + { + pShareInfo = dynamic_cast(__pShareList->GetAt(0)); + if (pShareInfo != null) + { + String testURL = pShareInfo->GetPageURL(); + AppLogDebug("getpageURL getpageURL is %ls", testURL.GetPointer()); + } + } + + String textVal; + + if (pShareInfo != null) + { + textVal.Append(pShareInfo->GetPageTitle()); + textVal.Append(L" <"); + AppLog("share info url is %ls",pShareInfo->GetPageURL().GetPointer()); + textVal.Append(pShareInfo->GetPageURL().GetPointer()); + textVal.Append(L">"); + } + String typeKey = L"type"; + String typeVal = L"SMS"; + String textKey = L"text"; + extraData.Add(&typeKey, &typeVal); + extraData.Add(&textKey, &textVal); + AppControl* pAc = AppManager::FindAppControlN(L"tizen.messages", L"http://tizen.org/appcontrol/operation/compose"); + if (pAc) + { + pAc->Start(null, null, &extraData, null); + delete pAc; + } + if (pShareInfo != null) + { + delete pShareInfo; + } + +} + +void +SharePopup::OnAppControlCompleted(const Tizen::Base::String& providerId, const Tizen::Base::String& operationId, const Tizen::Base::Collection::IList* pResultList) +{ + +} -- 2.7.4

pq-`4iYebj#U;h9<`k0M`v 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%0AIaXczbD)e~Up<3IpHqBGj{--F} zS?3bQt5jNS8(t!(6{e`{V$5mBU1(1Xg+C8^BQ_D1b*+{Hqr3lh!*tlYw{$zYB8HMp zw|1+2qV-`*WnlyA%YdOF4iS5U7!bAfW>LtCQgw>$As{4>NZWALq{8A^V+l%r8MOU$ z+a$S>2Jdp1W3BW)Q-$iPTO_-^s{3EBK%L{A$Wpl_M4vNp8HW1R0q)4QvdDsH^Mva= zjS>SdoU(a;Ti0fe`A&~s<}!#`YYx?zbTw7lePH{l^V8U~Xwhm>GXmroWl<$;T%{TVXLK2E%%e2W5T z70ttSE{_o}EZSb)@?lu)*{h`bgnm$3*RHVg36<+rO>1*fBQMh_c2@fE1WUSeue6Kf64P=? zkwTAeQ{0kLGZ+7v3+C)oAxuQe1)oCrT+tx7U0y*(9)`h5c{;B`f!f%GvNbKo#7w{| zitLz@5lL^*A_?2m(g*arRv^5s)5)`Q&!}2n^Ktp6lwLiv#k&0&fpGiY{@L!KG6W;ptOjP1*N__zXLwwgQ;E#5yZ9uYcNs&8Qx zXlspFPCnU+G=CvVGrcG|9a~mMQfrZHlsn6rI_7)*wA?Mi020f00ozD1qZuhK5-u<4 zsh96E9FNs3EN(W>?y07$bKiIFFyqbhHBvM*__<1HBE1?Dcc;61DS~y3v>03X&&<=t zq)M0fETl`G5+8|cdHe3c0|qKPrCD=y?V`%K3a}wKcyvYFtF9TNeZ!PXZ()A=iJ-OCgzkmJ_Y#D=CkVcD0v{KRp^c?FuW-tzbaFr{t|>^b*xcL)m5ow#qTK-9qlC`$Kj z#<=H=ZDRAEAWlA6o^ar~FnKoP+0>iG=M30R8n%6O`xn(-^Alb$F;t901>;_px{Rw{ zyBjOCL)7Z{OIz7O73rPFV!uzQugzZ`{6pfW(nIu{^Ot|e{AJOkm%+7&9ra-LGMYct zNoKk=uzym{?u0@CRSerBU)9?u`0o%MiW)vGlBlm*cPA6N)0g%RQ`e0hcUb^Ldb?4E z8T4hq@T->?)X9x@XCX@G`TXp-Wmce9)Fwj`?NPIjQTWf5C`Pqpypzv#DcR~ix&C-; zkF2EMd!N*l@rL)+EHQmK$qFqtGCPe^_fIUOHqRQMsjTK)h@HeG<~ZK0K&aG@3?0b+ zoT&*;FdCVkLTmOSx4qFW@nU`zDj%g}IC0+Rj9EI1VPBrzwagG6t2=Zr zLk5P^j!Vo8^Gak}{#3V8jEIdMxp2H34Gx*){+{!pFZhQM)0##_z`IA{x#@U6hte`r zagw00<)FS=N@`UEgX|JPbIb}fdkih<-Gb(jT`ktIgn#T7CqC3Rwa1|qVYCCb?M^bS zyXwf~+~s%l)daAp3LbdF+|rifB)xpEh!qH(1vLA#0jMmpL(6*FEr>Fd(H_LMGK%T> zT*}s_lW$|rD7G3=+^>|wXL8WEVT_zUo#9G*GiqQuJWzhF`7&~z*GutKXWvft%GB&Y z9W>$exZ-p`w834p+4I?ESx=iM_SX0s`S}s9s#Do`4Ex>OMmQS4!KYbQb|K&LJwNUc zNTY=uC7QW3$}p{w;TkC;nn7rXc0M%DfH|4II2$l6J+(wJJS#RWlQf;B?Tp?VWpKCmo3prAoJ<^gUvr&VQ8aUH?>{^@U6WtD{}BD#R%q*{ z{Q7suua8RGmyV$V3KP(~%7xp!bLx(kYnestZlz6IUV7Ep9_4$LEL*jZN{OF``u?s; zzF@?mC8^~U%;C`(F%)McII?#+UVF@z$JZLg`GMeCO_^D@fS(@qq|dS?da7pG*MNL|x!Mo0M@nB~?m;BJ;w@>`6M&VfZW7g71r25mA z83_-1{1$7Dw=qLwAEwH}EbBzmD`I4A{K78j%InIrgqRrBj2c?0`ho+d;TghO|9OM| z=kyl`e_a0vq8UQK`uY9(M{b~h902)+FWw*Lj|E42hy?gv{pS`iS33Ab|H=0k@HYg! zqy7MYZBTy8FZ>Vv1^kTwZ{t6}-w5!x`NID{eg1_cB)KU+{~hvkSuNfN)!+lpNWXmO z>Anv{0%`>}lzsY4m`u!kLhAN-Z0~qO7R=6-=t>hIQwfo2DHJjt4tqGcq=OQXnl=m( zc@S#tNH3tNWoobSJ~oPF|CLhD*|Px=8T^II_c?nDB6OSL!rmPuEoj;0$gNxR=n;O) z7Up*|8F$|2u$#?#BLsOpvWarFOQ81U$=a>=Y3dH{oDRt`5O8-Gn^|m!>$TW zyca7a#T@$YE(xpMEedNlyyt1e6hlc&(NsXZ3n!@NZB39f`*Dxl-6q{upZ55m7~CXw zn-v+PRQGn1P}iq28%=V{yr_5;_>@K^u#3y;L%=C=x9rf#*DsrW9}BCgYRKZFLMszW zyGU+I3*1UUTSs$q|ZbGqnO|0-_bkV6kL^Y7WFYBx?X&-a?!qa$g3<0Id&XE?k~ez_ksc+K*4&<2 zQSy+0!^v{~*WnC@iMvjMB`t%eh z?kC6?P;N^h)wI`u1caLUNqHs3|&ax0fwDer7$#`)-dI0fbjKakdgE z!BPY_)AFYaHXaewiFaj`YM<_+5vt@v;CMIG6x766Amm*tXdA=Jig_BBvWPrW^TaPr zTx0cCY&=-Gm3{@Pn5w+rBic=Tzj;D<4pQoPh08YlwV}b{PnPNRJm93H0<`z(Y;i0cFZ%oH8ip4Ml(jR zRLRluDYl*J46xsqX(I`ZY{F)FkN8u!=vnS&K6vTbM3tCPoe(G9miQSly}sc}Q-R)M zzhdHPscYMAtGzJd3_sY;dPVH)@cjm%Da65Q%a1Q!$-Vp_^zP;Gf$}-l0)F}Q?e+EL z1-kOwEwO52M!5Mqm9P0w#PV@%yGDQ$ddC@S1=?49bJ-*No+(ac`*hGDs)ei$#_G;R zFIU#&qeU(<#p*3wT$*I9&+!XergTixIPa>yI>8s6iXEVI?)3uuw0ZB-lIO@9wA`L| z^}|fgR9>o)-W+%V?t}}a2~Cr zxZzJc%Dg5gOqHuGM95w5QxAIcf0{|2AUik4J<0858%`#>_IHDQ)HeDZ!W8{}km5#PMVO-h4^rId-w0C-_(6&reIj9s zfj>xbqaP(qG3W;=ZuGr`DF**U@sGxT7K8*h=WqX>`5QQz=0!bULlSP!#ZRf1RQ0hY}r{l;kuQ z&pSj$O+3h>5t@nHT9$^OepYq--gK7Di5=^vs$`fuw$ z-#U%{_htP?e{EQzg#08?{tU%~U-`qsF(Kg-egFJ;^f_MSdOvLVG=-bLN%Ql52iS+( z4Cph~r-jd?fW5rF&d)E;CEr*x@R8>zsjQiOkl%Fm~?uRjBReZJu{ zEpC4!<>!;T;Zw*B42_Jfu3FpJ+Sxm7#$T>_QC;(@x#e|h+ncxTef2IIZFZg3TEp?OtU$V9g%rQ2o>J-9M`bZ)WQKeV!o(wA zbH8$BP)81qqaLWAR@RGh;bp^qEoB*@Q-{Mj1DR z>l1V9-CQSqV*H#lDVN-lFN*{|#u45p*iOK_=Ye;-IGvT!qN?8AIBY@DJQjK}_B`%8 zj01CteA##Q^u=!9C4OnJw7ZW}Jw*+Nqw1V?jBBZa$ zU*k>rySe}MKfV7ov7X&Hx^#IoZks)QykDToDYm$6^WfW1%BkF{xmXWK8=ga?TJ2U; z@B(?(W_p2$e3bEae-7k?uvlk(>n4HdrWr}V#78*5;p^Z zBMJ6ZU`Ceihm;MGSot{um-a1t6y;Tsoe9-~jJ$q+SAfg=4j&12i#s19zdrEzN7sM+ ze}Vov0*o;5$ojqdcU$o6+!z1r!+!yPYe3KD5AeSR^xyBl@E7=T{;TDN%k;hF4+Q*$ zzxaO({zd#@-tYyo@w-3>SN_20Dq`^GBkNBvQMFa7#e+}ix1 z?;qlS{ol5J+nm4u>d7$QGk-rq1mXMeP0G8=5J7B0N%wkQxf)^_f;lhyt|U(8t8rU` zeGXO{DM`sr0|Rs2{!fW?MEgI*;lZ6I(d=fn|0`FLPZUVPMAkzFe#+PZp0^y-tb8oL zJn>c6THowH3t#XXu!22*zlHB|09@-oT>lXNKXHg;Q-ApH7(YHppxHDgJ5U^F(GC3> zH-stk4!ies?(cIZbKG`SWwtS{O5)Cy6A4RY7v^p5=%p*6Su^0LkD?oT5I2P1=N*39 z(|Nj&h-}-o>uR%%Zvq%tdMJ*~%aneYq^>&Y)UjxUtnP3^tU#IZE6@rg%MW(!E=A`( zCtjpIAo0nv5$kszXw{fh=!@pAlE^kFHzzX;N0>HQ`Dmk=gATfJ-Y3XSE% z9n{!-FSZ1}HK-6qxRn?-+z@AJeP3J=KeEu7d)L`&FgxZXsbGj~yX)f%r|z(^^t&oR z#+Y`*2b*rH6==e+WCd!flbz6Bfmlta-7%HE#LK(0U4G|2^g9paEN}qFad0f|wacR} z9I;grw4y?NJDZYnGoQ3sM|0T;BzB$Lr%6keKi{pl`!Lp}#b;L~dSXka6{5MHhoX1& z%X%#xdGa#v@Zl%#{gXHIEnDOY8#T7}kW#n*8wohr~bG5AENS zAO8;dv8X?B-7s zmDP)q%I$GO1}#27a@362flCJ@b|M?=z^L;%%~{W(N>ag`$SWc5a0O%%Y;r^FnZ}tWdyx4UU zouW&23fCh{z*D+mM?jK}QfgMFsxXP1m?8G$tgr38@sLp}4hn(BmyE$DQS*kwyJ>JP zQ`ZyLQ(W6YAUNW5bh=h`I?rPw=jrjqlOEhxOds|ae7tm!>r$%%p{mPu>J~U&@OoP&Yc|*89~KVPC5nX z3;fT)ri`kT(Yzg5XDi6|zYB_UWwty;UVo&ZqYY1hG9xnuXUN}R)&dn!@Sxk6uWQ6a zY~aILxy(8q<@yRQs8W&FSwRgPB%p&bSXzNby5}$m3_n7pNs@sJS;mEaj6r@fUtEE> zS0LI142^9?EZB0Bfb5<}qF+19N<&WIK!fdteGT(qh$xv_Dp@iv4w)W|?uzc6&z~R-A=gCnPjkfI`m!d!!~f*`Pw2<>4_H9$umYbD z4uAeuUf1sB0sTY57ySnhh#>WY``=gj!o1;YjmK|&)&Tw`U-Un}_1yQ~`^@?C@9$0X zS3dV6{C`w`_(%0eoAdvF&H2%jNTY^;E_PJ6|I&qC^T`uY37&oms{_|1Y7{#YiJn@zyhPF!srM-DLQ6dFZVwmeA}c7!Z3>sqH$TXkVEL$QAZ$M2 zOtsQYx3E53rB^cLLYUOn+SZzxXmwm>pez|kL(gF4fx(1c?xkBL zSjaaO_mHD!)o=ApQH;6>p~AgI<>Pgn^Q2q(P3n$R4%ZqkjqJ_0XLe4<;Zk=igJkTX zrd|f{=oVDC=aPI{r?ang(~ODOk%i$}BhlM?^5t2aQ??!6DgXSMq9AVDgB6HZY0(3C z8q%{awIJpgRv=5-lHbb7DJNhQ2+8a3UZl>ESmp=|yk7F*^b+0*q(>RC0wr0f{6rCd zjUawS2B;KZZOHTm!_=z+L-dIiXs`J*#Oy(%*aeN9&J2s1nA#HwqZmPS(p_T}X#)cT z+l(;>h37k2YrJX?y0tJw%!-&^@UNS56=ldWn8so#~@xi!?SKo6-ICSotVoSzpmHF%m<+&UkNz@!c#I!ZJL&o#7L zebh0ntIM4m%^m)o(QIw}dc3Ls+q574r|pMdDd>JrZ~gUsSfNJ(;jhO2IS&SO7>oem z2%4WfK6F<-Nt7W)NEZGt@N^LTvfhJ(3p~HNRpZO^@EN2= zt5G@O-}>Mj(e+Qmek!XIt1nMWe|h={h)t*mnSi{&@jI;nkF}FbKXZg5Aa0C_Xtjav zF+dl#@_p^c^0Obw8XZHBJ1dYgbHK@d1C5g)IlN2f_i4cAt=fRHT?Ek`*L;yS<_GrW zfp^?M8f4+VkALHbb+v{ruTroClz#Sr zUH_)OJ{NX9{o{Z%91-hl`d3zInSgS^bk}lfwpvrBpv0F!E;su9z-C^Y$-yiq6ulu~tbI$9&&$;LIzV9c&(%g`RNstKu02U*hzV*>e_&eaR zqi4I8OYhMHx@m2w3%nchvqSa`aL# z@SJ_1jh{#09hV#KfThdT>wya9=gy;UD=VB*IH{zxdE+qv@Ru0r>zogATDgo2wEdDh z-Gb5tLro>vr{OpX!$qsI#1lMXWm}(qCsln-dRBLJqnWdY|dx&PvkQX zD+NxP!wdmKK$SV^XT<;Ow=n@#8gyNv>p0eMW6c#?6mn6XwLB&Q>5#6GlfxKHL--jMojURN+|NXvT1yVzH5s%wp#pHo@imxd3Q zhJMtGrQ6JoJU3zOFRWs9yqR2XWMpNFT921O`$OXiUu}R_g5*)jd*9N`J|Ym~j8(1E zG(Gc_JL<~Aq4SHS%{zsm=B*KYk*XFCDE!LnGMMW9Z{A;OB4M2D^k~Z`#WU2{5U$QM zN;iL1&fb~XUn~s{o{sCy4qlUY__6=%E?<-OulZ2Fv(%!x(5^JD7dL+ujH-veEf>|e zU@L{zM<3yz3P4+#$fNxa9&bxV|A}Mm4_*2m*Szy6xI<3hBvIhkeHO9R`z%7g?*CY` z`_;b@(Rwv=6yt9Eje~HLncNh$a^SHrq-X}`tS-%wGC$ubvm>Ly=+TGU?`Mk)`sE8; z77$yrCFL+t&nLFtBM*NHU0pYS;kd}dEV#L?mGv^aqUwUJTSpmF8VS!T43dBF2ui&V zwDOYcz#lXThsuP=Or%i~-zIcglxmaEDo1f-mMFS%m27j^q_>^%RtHkh)Jwp$`;7~*aPCy|wr z-s{0!_nr4c{0>K+U(H&Y^C2R-`-W`(GAbA`V_ssShi6{r>I_pX4L^7EW3&cSaDb zZW{p};x(^WtMXY8tOTf`4v`DhmXB)NIBN+e9=drPJURCpiYX-9Y~veO)vH9wqmZyX z_M*HJc&EozP6nBe-kf(-d-Nr76c>Zox|>5qkv>Ew6~}n?yY2qZ zoQfY=Srbl;OA1x{2ef8k0$!gY$xhIDHV#GctIKgv!;c@ImbN7Fh3bGohcTeTG=>O~ zu&clr3opo?=(TJV11#H?*`u+Dg8^xTwM{dApUmjAO8GvKr$fvOm>pS0Dl%(RN(2zDU*9T#u=Pkoi#lx&Z7IwC&0TD-c{Oy1&wG+X{pOJW61UYiqSQ(v2aJ zWAV_I?C>iQkd&F2S(Q9D%YeY$lUs#}`h{b~mIrqMO~#9&g6(g2H=22uD?B=qkk_Ov zF5H8$211L#=ZOH1O=-Cvk}o7UZ7j@KnrI-0rYbE$0u@ooMOL6Gcpe4|_DZ8PXN#s` zueChfg&s<0g;R%vx{s;TYBy=WwG+xpW>g5eK(>M`KZ3M@^_vxOY8sO>Gpc{i3$ z4_Se6gp7b$gOSU@B{|U@3FC@n6WDli(IzOphfs!0fUN zloQN=MToJzUAQ};HU||iyyP)7vM_)neQK-mVxH|&!^ehH?mi@nJ*Jh?m1)mS&&xC( zC~pKSpldIj4s%L-pw`M{^C1P$C4A7opL&K+5EIiL47b+mB_IT&4Z-@d5axz5>^r_9 z)7kK=BNFL^VhAe-zCCT(UB#_n?z{=o`J-2s8KgGaf(a z+{Sr%5p4`90Gj0LxP9U`iU0;(uwn>Q_R5nERUxl2yhkh9v||*DjGTL-RAMpea0^~g zkmHaQWAbuqV&A-_#c1d-Wn52dysmYlbF=mlc-yn}N=p_{V58APkfL2rBbh;SIZ0S< zaTIfs6_LG{P)687wpv7ajXJurXdZYktqQ6kV6DXWF0B5!1LJWa>K$EcnCoUGtq8q_OVMF8w^l5q& zwP3IOg86W=t64=;*au97BAY^Lcl=Cp4ia+l?e~m5k`zfxv7b$MdbG~$qTM2Lw}#CM zt2RojRHo>lFm~*x9^e4)kW&FEj6+Obu7u>c>k;Z|9+`QlQ1-dBKiBZjOgwgO=>GXpLFkA| zWP{;sIIuim#qdlR<*mCNPiR|7g32>Kfe9+*zR2{3g`LPX%W#ei5gfOtej|>X6Gm%N zJZ5hHnjq7JwAr!I7Wbenl2|A>p0j9n6kX(_tE;!&g!M!_t6ooK4a7T#KtfxvSvq(e z=3#S}rqNOJ*d7<5m<{v6#4_~~y+tI>g6+s8k$8UI61xHC(`KG*m;}!9-l#5b70znW z-YxJYmd%fX_n0wR!^*+DAQgwcJGtxNrt2!>EA0=qDtEVIQdPoZ%T_2Bv?&3qIp~QD z!T-G!$XkXuaSQ=ZT1CRMtRUjVRW{SqB2RY7Tn2TM1eT^sBXZ57`;~bHBBnC$U2}zIiXZFN1qXzV7e3r7$a?MFA{M6LJG@0PHFTpigwhc0G*!ut9x3Fg=`&*+5DI8ExE<1P$Ew%8D^ z%MdQJK1nA4V}ymiH}R<1z~*N|m}dWW3{AQF_K6)2JZ6tvvneqTK0=iZj`~SJrv;o6 z(#!SOQjJ5$m_Z-bKhx~uX&iXO5O{qQK`B`H#3J^h@wMMQCo+@pJIIs_XxpwuNnL3J ziZSIrm3CC)Iv02nFzjPqQdn0JvIAlc& zDW1`kZ$ELVk&A2e&$p;Yp{n|6!4NBkdM(ALX}ck`@q?5!qhFh+D1G#FNj5i!9N9L( zLtQFm?961AU=SU0rzi(XPR7^U8;ykQZaW&ES>tkI6eEaG(LS3Qirs2&wtT z&GNYQ3;dw&KO9lmUBu&`6BwZ@!T2u8Tm{;z?hd#0Q>o1ibz#1S5F^gHC@2jJ&Zy1S z`=Eeh|68*tCXftmA^^GNM3_0^ky7TS`*s9814S<&U|Nb`0`@sIc$&ipV=1C90L9UA z1x`4KEN;XXW%>Y4Vq6n`vA$r$+bC!$mU#L2@vEDSJm|6Le5cmrM#7Y-bJoo4J#Kzt zD+^gwGM)xRD3CmV*@5Y`P_d{P_~I0EO+ryOio|b=B1Guox)**syms_#U{FsLCuPQL zMzvIS;?T(b4~wYln*Uj0Vtt&gfkm?$hhN|_sun=2 zF>qc<70LhV#a+pS4nl$dm5MzSMZE+>KuCTts)m#)Zl8~Uhf(Z6^jm!x+zZw~ZV9h5 zr`@Aa<1s^9-!MYXAP0yq#xedwxIZ2bOo5$n0>sEACCqrdR^+yv6961UpTrwgCyc>I@J4XP`+WRc|`}$hrHm8kq}3N z+s8=qh)_m2!#VL=#V|xNsdf+!#>U<>syadfhu&lo?%1^3`l6F{B4!7v+a%bsjtIAQ_IgLKn zuQ;FT{KM{3#$~plb)@)0hb^dKZrLdFcI|h&_t}?&9@lY_J@}DaZDoLR?*-^39v=+5 zj1?o%vr=SDZj()&cCxgp3>wB#r1y14{aOQq+KzP5&DM;SiWf)m2BFj&ta3viJS++p zPEFtFtwIhl&XJ{Ef7Q=0E}(#G)!$CKC+Ze&E@DRL%+M4lJCZAEjm9l*3M*!cz`(^# zA>%2d*Uri#x7oAeOwJ7LF70?xHRlHXSM?y*-PKbiOA@rkNW+F1*%1@-I<^(~YSM&? zN8gAK9n;N{0u*uqpVb08=enKLuRRla6R#g{DF`Q|Mdfx^qH(T4RpBDnM@ZgxcSBiP zG=F@GE?OUklIN*Txabwe$tw*bJ4y=%zgLoWq6as~^-&Aczg^l_``;6J4S``uHEWf? zNms%^Ab#6WBKoo*e_*RD`-2*IR9@=nwG-}Q+s-jxG|-?toqZ8OIJd-*YsSxrp<8b+ zS&Jn%H9XB-d#w5{Q_sl|5C_1lmOS9ii2?A!p=mtH)A*$s4E(H-(iS~&Qpygnc4=`6 zZ_Mm{gKmRS+tyq!-CfcB1gyzU6qoZGDFspZ%kJgPM;w1s3`O1J1{+)&<~q7Pu-$IO zQtI)6KbHS!Fw7`0J{Yj|uI`uJgL1O__+D@mH2TrFNJH#>uvYHe0z{zX9|)0UR*ms~ zticLTANFQQ0w$)wL986Z4p5vrynvz*j+QbAugH2|J3p|~TJ@IP5CNA9!yHkewyNv9Pfa*HKHge$EJgZ}am3Y5 zm7#04^@G|~Z+)gKMZ@XqN-O^nH57N^^v9Q2_)U^XRZ?q{;>2^pNMoPxQ6qM`+C;casJl8KA5bIvUnI%{jM?|T|qtGBl& z!vu-U>`hGkp?bo;`X+gq;oNk5eiUITQYo>D&2EUq;?=UmJ=UZ`OXPc1UL}bVi@^ zu>Kqe>?f4R##RKeQhYPCN>grXr0V1AZZS};5?`dM~2as)i_2KG!s>t8y6JE5l z4)vacp***4X%AXh90JB$jh9Wb>9kcAp$OI+!T^Q#%2%Y4RDc{zm_MBb?ds|}5+bpL z@9-gAd#NNg*ej83n=$QZ_?q4F_y%ZM5Bh*i=iM%Zjp4`#Y+A+p-D8J8>NTWh=HC{! z9grniQqRr4icDqJei8n}&(?O$8!smt0n=d8fLEx@f4C{M3U_|NzI~j;03VVWGab_$ zlNf_k8@gDuAMhF&J$pg)jpKPQVHCTD6&bDiT=M5LS4X3z=Ff+fmI7&PBN;$cOAwhO?}HLW>6KVPB3eC#Jj5SQp1$ST#TNUsgcwn}2- z4V#M5U?(z)l(K6w|K1W(OVJw@}()actNdB+HUI5|2&A{HLT3*^Pe{ zOP%HZtCSNC9^{7q%>1Xs@5xT=%?A9>NKCn=D(uFQR!=&P#k*gM)J*xGk(1O6FB_Vu;=>Heqchu`XfV_}MRPJPuwEoMd&r0RR%#e>Vh>k%bQch|1Oy z5-KWIj;@a1tQ?&{auO0CCl^NxYddoQ@LbJSvs70*#ua+lycJi74E(9!_yq?Z^hG>6 z5IcdIo*V&PK9W3t1xK|PLrMyoXe2KZDlRTC21k_<`8(ntxIOZMxRAog?_)1JK83bR z9S;YS?~TjChZQ&3_0w=Y@W?5$9I9M_$iKx&F}6d72Zna`m_>sSshj|G_p=vDLiD&M@G8IuVgsVyapJ!KQE7<4 z>@;dMAP*Wa8aFlB1yq;-BbtDNc_1+RG2I6O(EUk{1Cf^ifUwLXB>^h|pki9{yA+_! z3Se6(4DbPem;hEeEelzorWxp&LPx3t;E@4V)yOb90NMvI8lj~01VYmRZ0Tz)!G8=@ z=!f)RPo>uhwo>s)1?j>wIm2mbF_Y3x$>A|za~ne%XNWTQd8HGu2XUfp-%J2NUIGr- z+M74eDb%W|Dekx?R70kdZrBeB6O-Nd{poTiQ2^L+^`CubWT__%6o3u1e=qoS0c~Y~ zl;`#kZBd6N+6d$wuWH>m{pTC0{2#3=EBkwUf8+@N0O74BOA3I#rnt~Ggr2Zc-*|q8J7k^p&0J`!jNUPgo@)A3r03gq%3!WzvAsP?Ek)9G3dXv`p~9t3V^ z4{?w&shF(xXKkfFvZWwmDo%`51ReyaP}M#filkD72I@A9rvZEucD4v@Sw_kw%y=vo zbe~9x0Uj#MC<%6&)*p~^wMFW4m~+x|4qqsb8GmPT$`Vp0jjo#6*1_@pWCSscgzaVT z_3v@)5$%y*>mp{Gh&mTNs{N(?GG-%Bu#djaxesfe#xAB&nDJ$!G+!NqEB>o^Wq#9_ zYSoBREKau!zR3_=IfdfNg5-HZD?F*^!dHjIsAQl-=xt-0}InWNMrs9O(YlyIDo z;Ydqbf=qlkd`kik{OYvNzX;}|35L~KdDu?V4%5-n9W}J+o9KOU62=gd<&&wCiRf9> zf0z9#+bl!UxX~C_kN<6;=2s=H!J)SM8(|@(T%#;o9eMBsMQoFB7Xl@JbTOHyzAzi(n+(*30)`o;OVmCanwwk#zzMY~+KT(w;0 zw3EB)yd?Wqr&PPnOAxBqusn?(jf`dd6ioJ^+KSpn31SJZq7eUG6?2(wF;RZIq(`?y z$wgXDmqB38XUCFFug=3~Vn3EQ^*8(Hk~ZPvL1JD~}!vx0?-(y`KLG1fzRyHvaOL-s?3)Ued#)C!6xiWeDQ6kC7M{Sx>r z@OgN0VzOXzDV-}*h;5nuF!L~TIdiMo=&R>f#-`Gy7IV3}y|2G?E}A+V!oKq96l-gI z)vuSX%&z>j)Lz+Mf>F|{l%!Oivt-#{^RH>N>31_h&Hf+QwW=ojCO>0K6Fkf2!K(g? zq|PM2How?6AvlzX71VN)uO$B88eFjXHTgF)rm`+X{047Rj#(_Vr_rbXaO^f=jnfTS zXRBq-%UI%Bwtfq_iHwd?2p(rn6=u#P8rm4?+>>{`bJpMSp1aG=tk3K_FI}s?;J&cF zh*-~^;LN4V(c$x1=k4zI55vCO`66X}DO*qSz%H=V;F7a(k@>w!Pax>GCO_{HnNuG;dxQy9GaFwTx zvrS}(*+OSxQ9D~(&Q5`tkD0!T+rh4D>-GF5;&1j}q+K7pG?o#4C$IdezT2=8+~3TY zjQlC0pCgrce_n~9)0g7Le7eT+_!Nie)ko52Nx?G9JsbH)LXVzQ=~|Xv(L3=hp@Ykd zYLKItalbW`=J$_|&nTZaGWm0GGu%P;>_YsVY$1sWKb*zO$Q6^CEKe*CEZoN{%){#5 z2OXlDSxA%NMs4eVRKVykAvTHsI#T~iyG##PXKAiw(LEV8#+Oo_!!UV1Q9ri!gD2}U z_v0M14|6B6sW@Cgi-|=0ptHh;uTId}YYlN12ZkYB6ShLI<$Dvo{i1UDxmIeGepvTQmk+d>O;cOl%*b|qB@|gtTv!*X*QhS-Ak>pq)yVVwTCoG zv=(*?wse@6j807oh^QB-->N^Wb6?DDG#W2II?P@W`E=ZKo-MBFc09ZZk9MtTKxil~ zS}dBs$i37*h*U+D9Y3bL*y~p+**l*PL(M_G!BL_%Ew?T#lFSLIe~DjWIF&&iChL07 zzVu*1;YQJj%^Lbk=_Kj3cl>~`^+1Zkzv>?2Q?Ua#Pv%ZyNy1_yo^hQaovD`bqHCht zraU1$yL7VY{VKCYhL*)CsN*GnqdscAdK^5TWO+RulbxLH=g<7KZnRd=iLGqrKs>GcoyV`(vmPiUj_#@q2>@ZoL?cf;R>=51=ceZ_<3qOwD|!|+!0 zTx>;RBVtiR_kI1(<$8ckk4N6k?7GYYY*@(jd%|5jngmRIdi;1eO899GuP`6qUlEtL zn0B)=RaAE`i{AmDy=a^_XC=CEYt#XoL>Yl4-ejZu+i*6UqQ|I$C z=2R%MvJEPqF(UC*q{0f=6(QlyQvbvyrSdux)4(oBt8q%f5Q`k*t;wD7HXTcqPQ*}s zhsIQlv_aPZ*?lh}u=dXNnf4Ai^P5`n$^9nN$IUI<^$I(=-ui7^$EWhH(vgdQw;>7u zC?GkYpaT=$ac_O@gcC)eh2SuHDn7EkcLRqLUUQ#3`h`UJ&=hXcvvQM%lU^wgc7$L5 z8KCVeabHF}>x^_FQgvJImmN({j^RZ{u6Wg7zt!KYA6IcG@G)E?v`m4H6-wwfieBGq6*mrA~9vZ{qJ4}v~xC)98*siBvo_Qm_piD1n zfDbJ84eP0i95Hbxqhx`_2N7*!<8udMbF5t~TC$e2l+gzL)}9g|#|*$<+TtPGl0)NV zoQg1$8OhLKWp4B3z`o764rG0NWQ=oX%_qZ`GCG@wzeX*hSHJPggq!k63m4%XJH-qU z%EuB1`k=qFev=%dm=J}R#7!d^?=dP8l?_UOCPy%WkD&^r3d9b?j@0hLFKGsHf_X0) z1S{k;Ch1GwjNZF>ltIYRV%8H(1ez2ZFMnO(uzEAB1ksG~A+A|}>321ow#rNJ$!;14 z8Oe#s^h82NvhkvVU<+u|3XM=h&@q{Vi08AQc@d1zW5j?r02V+-p9OKC1@V1C3-Lfl z_YD-=bVKmz%5|O8Y#c4Y@yGk2DU0ozK!TM!bx8C@_Rumt0#BRJZU-@9u)T@OHX+4VVcRdFM^J@u zqAVN_L8WL$hfch3Oe-;I*7e2zs)BYJjEQr<3t5!p~HrG>MUWGfyjheE2>|F*-n@dYeDIWLT?H~K8 zhTh*U>!-T{jtbFq3Dyy$@zUBw7Z^}s(E$8J=6-Ippx>^0k`VnA_rUq{JcKNRr}6cU zjUTco@gAZOT4+abZCD{5Hjbg7{p!N_6yHllJqJ5GyEr*RUw=z$etv#$)y2is@_py~ zb5eWmy3b{H_bX1?8qffB1k51h;fdzDqR;`{fPhMlWF7~#5+W@7F!IB|LjXSzel?hk z00AFD3+qHJx&jQ zeH)ki=E{;54{4PgkslrT3?SDyk#WN}om8!tGL1k!_K9I>ypKW_E&Cpz2S(0#k3oN9 zj+74eTBz{S%DtHkcsxj*626(ZVH&SncUm4ms~Ebk2+<^P=Ia<#aj`lI!!z8xdAszx z4B|0(TYLe&idw-GVu{8>N6X=X2%BdjI|Q?fuGFwsFC%3I&_8acKVE5e1Tt8}+u`Az z0Uba(uoUR|Msk9-Ej*XWySg zlBktDM4CS5L&OYC*n{toFmi(00c};wz`~lsz9)5hgo?;5`rd~sb3#rO_Tp>Rzc&p= z}D=?-?AVf5v*QY5hQx3^uDFB=TEUv@?G_ChT4*G!I#jSZ|==7w=7=Y~oO zLWP7t$^QBx{(3gb$iTsISl#`;SiRzoDDpOoM&^MA)T2=7J||#%7XYkVHAF>YBRjW?xTnwas)$Q!u~cBI-s;6+S+0lXKc{#Np)xkTOk1%&x9} z&+mmm*SUa*q`|~zbDpijp=@0)%sA@wbfk? z_qim61a+k)IatYpBKUuSQ}Xk8FienGY}Y5FkDw$p=p3$NR}-c(5U^=y-D!lM-Ej}zPY;AEZf-bk?Pz2d4Y`zNqjuU>q%7_~VnC3Uds?$fQv%_Q( z9A^2D%8$#l`79xWFOd0~@aekC-qG;Zb3}mN%Tm|!CZrR(q)hMnr_rJ!ESym3z5Vt+ zR7k&JL=?LadRfo`z{;d_?n2k{sPiH>NyRLR1? zWYD4lpW8sCO_9*EbAVgXeeN#UWeSHG1>Lt(1J~h)%uN)i>Pv@vjpnbHOCL0vyB@@b`B0Mym5A!-iex(aQn5*>5~V> zF0?Rla3cI!{S)bP=>sGLH~oB{&HOp&mA(N#aFyx@ zC>hz1b*vRTZD4qh9%y7_Jr9cHs1(@6L6lRL*nz6r8r@9|Ry(h@QH*nHQK6oU2R84~ zJ`WTO0s=o&xsY7&1uMcnjnaVQ3r?l&d=#{uquE0EFve6mDzK?k?Do&MEVyxGBA62d zfC(s++y--mBHQ5_OWcMnC|&Cyss9Ws0bQ6#n2feU$7Aj9VDVtzVfjT8{6A0R2vi=^ zjpwzi_4;WLZoI;`s!We*$Uiym93l4Ix+)t%HxISi#Exe^C<3HgVOE?cq@dvzy{oXB zsm$xcROL`vq2b<0*}sUItAAlj=p&rJJb9y>M;E|goWQ_$m-*XU&lWr_WAYKxwd!!o z+&H$s`FI*%8kkv_w|*@*P$79uFoY=P)o(^0ScQZS6Zdp^V7|S3Xn)}QurN2@SL!mm z<^wQ+0-&!>I*5^srt&NFp^~sWr&FJ`aDC>V1Py^-2dT-)*i6V#J^CC`;*XQs-S6&# z4-@|d3EmS&cxbw;8cmp$-oHkioS5Ge{pF!MLYwo1IuSp{iVBnO?RI|pr>~Scdk=XO zL`(*6W0u0(<^)<6wneUME{j~w*fZBBsptbkOC1~fX^xjkCMNCX3wObfbyBbe^whds zAFLP4ln|QqslgYPx+*VI(<$aVvI-Y+DQ6c{M1t9GV)kr*(5L;IP z@a6mMza~xo?C^RFxV-9Syw1)}(ui$wF%W6IIl5|OHWcUt%Qy&G#0*FmJ%!%&%Z&`2 zHh%1ZJjWW+SgdBEqx?=$ZKOb#A>PL{v z8qTF(_LV!jl&59z>z7Qb{l1pC_z`o*W52)TKA%S#P>>S18jR*{(Z{JA?OPW>h zg>c(1`V^!jxzip+B9v?R-v%gZ@SOF%9-P>-dCzD(y?V_N8kris!-hxfSqgQ`aK9-i zgA4sBZ_Qr7>8T2nxwvij6?Vx7PBIJs{>49pQ1en5PFv)%k0vocC+L3V-;)#)@z6l$ z2=qXKDko2~5qMKyt#eF2%91AWdyJ6gep2aadcj8tWq4n*?{MZ5^OA+1)kdz>*274k z>3$Ci64o(bMwBXEK`Vjr9A5i$+ltqvHX$Z$5&`ySB^?vpSKi#v%lUPGMqDX{af}L` zW`j`g^mOlf1eoFJ_i*f|YWo+a%9>MYb?S}p#%zhBQS(Zff$C%9$ovS!arbfD zKnMsqXh$8XexKpZrB7(CQU%223z_BzDVG>gyix**K2&K?-()AJ^RG{Z*DQT6mi2{6 zyZ(av%$JQ(pUF5k?|s#UE|hWZ-q!b-l_E{1>uH^BW~2Ol5*ssaH%L_$Ks zvAh0*i6T)5it4)rfNHDkp!wcsZC8XP{lb;2jGio51PC8EYuwq6%SYoefyOB=zeb;; z$4bwvuLpD4E}KqsD3hyY_&t!@`Gj$ZheaTq=H0NYa#0s!XF)v^?AywbS%%enRxf^8Cw={snT|n6 zwoV`w-iQD~iUNbPnYee=4f5R5{LqTHtL&{J?*SA(jRy}s+u`KXTf7~c!v9nn6eO0# zZwz@bnH~H74xt~E{%l(ZdS#KQiHbAhnnbvXV7A47&ZjYfvY-8g!!z~h>6rS{f@fua zC9ZC_A=-h0_t z^U=3X${u)CY5XJsH?h_Ib+QZyrmTM~Hrwo9C?kZQYY1YPts!7Z0C<fPOvHue=)J?chnx09fy~wts^RC4bwu-tf#U%}t!FMwZ3z@83Nh-j)MiU*>}Rt-;gy{lm=7my73G;9b}5?>q`QUdNa(l*3w>0RJ_P zSWI7ED97tW&dl7LVHV)Tj35S;D$?d}hq9DIx$=5)V=%ylyv|B^Xz?(2yU;tdKDFa> z`~tw>xoMmf@vEeyc^B^E63(MIaTM1J@D{C8p0OsfbdNwkT8d$txGJ1}Kd+E0Nh-1z z@=jfu_bqV7;c_dER){{pN-!syWCfFLnK)u8{kN}YUI*5DdwYG>hx2>+i1Rzj*xeU# zS8URoE&W-XDwcYdC4OsO8c#1%aj1I2ZuAaaPll?j-q_FHJ{vi}Ay;_fXny-e*F#r{ z$GLB2x~|v}T9U zcn{&Jf~>}rRx-JH9G-U`x|^{AXZ)pkI+%@hxp<73)NqU-CNS7H*$$@lc=7R1`1(@w z4Wue(e1X0*20URxod3UdTCi33;6~0l=$9^)zRJl>tBz=xiYeA$IicBU#^Bf&lR=p+*Dypd^(!4XQKCKt$>)49O~WutvIN3>fS5tGTo#s(hT=S}#Wf^Nm=dH?;z0*_z#CMjbG%qyQO?4|M3E7u#iQT5ky~^2;9y5Vv6P3XHeYn2$^9yL|AqB(&zM$ zLh4_KDNkDh+IY()0QZ`p>BIW9a-OP!rmlwnYVtVZQwBG2{eM~JljD!b*XjiU`uxdJ zw$O9s^Kmd#V7?$D=1RN660m^Uy`5G!b&smYHp${!a;vBLOky0~2szTQUq7 zZb7AF6?YKcjqrgE5EBSr2#?eN@=OhhT%1Wb3Sc;DWZ`wt{F4+CV`I3of0Y$yaQ`Gz zX}Mtt4Oswj>rg527kF)MBo0NvJt8OTTSfXsfv;q+L?Jw~ya^Y~#`mck-qDgTZ{D%! z7=Lo6`qDp&1vWk)bp_| z)ZF@$f_fTCV8R2aD7S68IAWt0de|E*>EWTf?7lsI4M;^O#ZVBwgf*7xa43?bK?)JsL^`tP6Fs}04qwKic$ zkAgcK&*oKI_8&?D^*UVv-AI9|ZsOkNCuCTU*?h;Yv1^tGfxO*a4MpJILxon-qScLx zV#41ZjHxS~L@TYWV>0F+Pns2Z=Rb`J{B!>dKw5i3{V-^-j>$PcvBJv;IGwDT_MrDB zZnmwrceGwzRc|y&XMHI<@DU7^L7NBUT%38x3a}+a^%`eWz z{pPSRUa8Y%lOB4apM!&<6G&d2`?H{3Yj-RG;)l1GJi}rgpjh%48Yf!|hHDQ5k%A(j z|B7fk^f2y1N&vz}&=4@lq*|)FhF`wwagqV)d^g%u!3Qb03kwUozx9LnX4_m)DnIj3 zsoCx}>F`k@enWII_51R3N@0;c*f_7e9!kw}VqmVg*=YR_+mUmNpC4<{#!N%yD2{OG zRa9wo`b)3iK-mG@xwcBWelCox06poDleksDYlIV=@J_pqP{JQ$oe5RVuMH!KT)rnS z-=zv6&zCEEtFq(CmkFY7e>R^^Tu+ z3AJ=|wc1)5%o1?wID2SL?oF+%`GOa@-2OD~vhD31+WyiiG|_i~eTFcOhc~I|?peMH zrTFO2!CiYF8LMM-Z9vNHHW_4(p~Gh)ns+B(&sJNZR_Oan z)D1C;qX1duUD((@a*Dy+lIi$XHO;+V8%Nv0WcCFj9(Uwt?8IR&)J%IHH3?JG{qN>P zqP((_h}#k(w4#rp+d^Vu*1r3=z5uNeAjQ{=V%=c^2 zdZD7SayUu(Owz$1XU-;>bnV%Oc+QTKvKTcmVkK~hy1GZyQbyp{WE&!bCVcMJ{Jd>P zL!O6}rsFZJtaoa<+azALP{+p`R8Fh2wGC7W?-&v1mRNZpS04c?BdSJUj&i=Bp6#qA z5m(eTL`*pG_!rGD4I_x7kV(2YNgDq*Tuny9@IGf#snQa`7=jwLrcP@GQ;9+L!L#}qUl)AgTG27A zE}LLI4o6bYIUm&IcmmW59xW2$TMq$T^ZlC77NX)3~ zUOwYXaB>W@!p*~JkCk!xLojg-EH>hCLY}@J0~_E*#qWYSF`Fegn3%N?5h%UPh{KjZH{n zJu1h{E#9>aYzpkfYl|yE$8%@7UwEf>?{RiYzR>y1rwoN_C^)WwWJwVowKM#N(9_f; zi)@8o>*g#FYqvU!O)QW?5+@&@;|{*`eW^I^w9o7;jnMf$<6Q1WEITzMW^C`A5-&eyqLgi zhx+3&8%yBo#h30CED{!jMMCIpEOZ@CF;+@)KY#ER5d8Otazyojv}8^02vJM!F%ZX1 zy#x3ismrvR_(}{TW?XU#ZX871`idw-A$iGTs141eg9`*4 zwI+iuscTyQ!Y9O>B$i`}d=sXmkSRj+=7}+O59e0`sh`aKX2>x{H&(;#6MH3 ze+DX7?~$8OsnPk|qzwH>j7cGPOlu-1gpf0o}6v?qT>X%*3`KxTFWK;Y1ruuZJ8m6 zf<`4349!^eKJzsbxR#E=H`v9AGcYVG!lbY%h=W2<Zg*P~YP*MEcvgpC&7}44$!{I8H*cqB zL7-#>yIS9L38_GTGB*N;0lKsN+4s=-xBBC|Pbz z$>3cVjqs__@!b<{*|-e#OX%yopMLaJm;PqZ*VF8vB}NQun3I6-@wl2Xt}xIK$wqUO z(R7c)-0Ev~NyZ^Hu-~O|3xezCf#VoiOy7Nqyrm<}CLu}Vda$YZ+Bk>Pm1<0-Gm%io z<7mBJcb$^S6KIxIZE=?-MX-Dc@?{!LLPd4a`D zX-MPcw({TcnDmSipnc_!jl-kwVLCH;OhTt7lUAlg$ENqjlYaDmJZiJwqj_GnLpwjN zu6@<_URFG#y{*+d>p@Xm%cM_bSv!Id=9(%|#y=!Of=(21;zJ$BSPB<`*(nPA6_Hm2 z3E7X}R!D6Q#R!n8w3Pj-YN#-qr5LXpp=)w-IsAXb`9m`@_ywE%h+J-N^y@E`_P$JZ zF%E#J&(W=0sGX+Rp6YxYDsye6?p6b*?ztzjgqCA(e0*Mf6ACArI=vLsB=%jb@5LrT z4lpC8kN#TqWIZmwqJcU45Mz7M(BDs8#BF?UF52hKoZedho&ZD!n-c|j1zaX4n@4y9 zp`5}eaLui~Nr*_u%yp!q8RgLknQRl<7v}n;Fch#l$O_BXlH7OwZLKNxeo6ClCKud3 zgVx`lea?{QL{M2@eq-}++dG!&kwfH;U(xk_P*F|Ozyym`i76fs$dNPX`+Tc$ENXDO z&A5tUL=P*To`ysM69pu##iit*xGeODI-0UvnaE<7q=K&ai;Ly8rZ3!PhX?dfiGs$N zNXZj)2Pb20Zj1a3-#8bd2vxZB*(x{f41?}1Cp!soaQ5+e9Ac0j*Xco3E zf@K2O8fafh#MKgVitEFh07ITipUIJr%umM-_-V}FBq06m!gd9B7~&gO4#J1*73oJMBr7KviMXVOQPnbh z-!JDe({RRuLUW)X=dFeMyLtOY`cJW|*BY^4DPhH_1NF2X7aKo;M`eR`t1^5Zdj)T0 zCySnTFPeLM`$3G?>2|240aTUn!Hr`EcNC>5qHb8v9Ca2Nl381E>EEiQr3UG%y_ajS zo0xpx%Zi)rROCp*v!;3lec6UD%kGAuUU?s#HCNI5Qt6Ni)EgPd5&7X&(LeQ!K(HeA zq?zL+BaO>{$4&V32RpNKM~;91fs@QZT0?`&UHF>y`uYYc>=5CHuj#xXGC=9#;o(J~ z*6`y1-D{WFu4#62={o@!j0y_$u)l$cVDdkQ0x8`lTZq0xHK*hI5|eu!kLe(c489{> z)eBb0`IRALqA%mPZzak$0kRi`NsEF7=BH#I`-X>%I(lElU6iw<=k`0^LLyKLzYaa| zJv}A1$jvuO^sf)wg|=Ozqch+L>`^9UwUWBHR;|G`xDLnp;g&GQ#S`fMB{ zJz6l0KwqDvYMOW80Zl)PTNuI}|Jn76O&w_v^KW}zS13f6fI1)$u z#`2=VeCcp0;c`#Mq=cD9QWb7L*YEuatLwe7+Mf?2-tuIy{x8YuZ)}rVeCBL+7_4bt ztPOqr_ey$drgZ<|g6aqjAKv4dA)W*cmv>2uVu5c{dg}7IEaF1=LI9YAI;?%IJ=0Xa zA#wPaj|3Otm&qYCEUZ!=(9geQ;~p>}(tQ~;a?7F$2ls^ldrubBLBiHkYJh%LW+sPx zC4(EaBUFs~n6!m7?EAmWfC#tdt+;6B?BJ?6cRVt9Zl+ISxc%;$zgJH#1Zzd6qj1&j zc3$nu+n?+%Eo-hlpR&#?E7SP?gJ_MozCPyy>wd!*BgfUbg%+EYO0>kJKM6WQlV|f} zvX8?B5sHXuZdJo`@Q??$Y+a+=UKcZ8;By(#udDRceJ=*_^m(N!>D|-0f%NorS*pKA z7Oox-+lkREl74<9UA*?NtMQ~<74Zp`sw1=%i_vgSuNVC~KEj6ILjs$YG$%4VQ0VE$ z%r&dEyihLx+FP%;X>i;7P8fA+#Zz@6J>QCVx+aMBNUJ6d-tsiDGfulF2B^1MNJHL0 zpzhK%ko`oFelIAH;=uan2}{=>XWt|yIU-ASb@pxAbnDcSA|bNBj`8;P)?{vAUPVJA zh{1A7983%*Ryyf-f1#SV33qg9#mADPK+HyW02AE&tE*1Q*za^-ZWg1re>ym>cN7~h z&gqhx>GaEhnjN;dUZ6Kc^zJT7a6U@vmmu;x2${53OCR$p3^SV8EvPB#eli+T2d)d7cL@S?kIC=@_-Ftp%c0*s%ZClPJD=p- zeVCX)7W_Amq;04b-Bc)ZH4E1*W^WGT|6Fef!j0~$6F<5n>p4!ME@*4ROx0(@+0f7K zzsk1mGe(iCBl}0!{GZ6|cE?p(RyOdv1oykD9qdKJf34lO-4t+NW#XsCYSSo z_UbHC0#nR7=`OrmqB3RH@`_I5Zd<;=jcGI>40eRkJ|#;DR>O*|$a z&E8hB6F<6t__|*aCv8TC!R|C3I%|cziX~$36K439EtR#^;^w2ah?qVX2Kgup=X?2@ zKk47*^kbqUKr}418Wb9Xi66{OIZXS0OKS*%1*yf@?!2BlwirtrI9$*s_cxD-^Ah)U zJ_rSBjw+y~R{oSrf&Y9VKr3&K=LzP>LcNd5)}= z`X>zZ*g>O`FOTo`r_K+450sRYP-Yly?LJQT>6UqQb(nYtE_D2BYi~E@an2x4t6li+ zPLleAss1vJ{msv$qTvxu6K5-6>D=CSQGT|ze}ZDF1n_>Sr}FJFgq4<-G)Jy&aALgB zRz^7^MVmSC_0Ck^=)dUw5qBPCW%E%OQs#^!Vd4%d6gvstL78_nH^qKHh52{j?OPT zqOXUl)0;awSglgXl43@Y&=kMuV0W3!-4Oz)X;+9_Exe~KOG9Oinv7V&;xF}LBP<3k zZ!ma_Tn}dY@-n9j7`*Qic_@wpS4mT!#+Nr%qK?0XPLm0^$FTcoMccJFpWfRiGo(0} z)!426;CMJjn>hc##R%*cjESkT`pAQ3up)$qX%0?8Ch9jaKr`oC4VYKt(Z@rGFg;N} zccKlw$T3*=d)TlN@y6bf9T3rwASy(ZEM&XAyEoF;M`F(YU56ap>jxA5wybh#2_;FiR?*wrh z#qa)ZwUaBYcYMoAghp*?o5r_D-*OtkNP!qqd_TT}67Yid;rWzaqRhYSt4u&Z;Ayg) zcRf{Z7=BD<=xiK zc3!rk-B?Ckf{oa7h(6ym{K;v)>0Ec?Co@q#DRFqb2w9(2Q*3%d7Ewl$(v^;i(ni3{##5(^e;Vb1_7}UWkNzw+`apP zx_X}TsXNtQXLR^%ef^f#>5{yHHo}r@e^_syw#HtR&W(*UZd>lM;_1uda~ua5f2Cl7 zl;YagC0$b2au1Z9kb#lAY2;OrDJ#$qWYr{^erX6B6S2}p7|>@)HXuFjKH&V+u$x&x zKwxWvKdj%_&f02#sM{NcAU)l`+bo3vu91W8_()qYF0M&)L0w~KmL#5%fdNZ0G$+U4 zbNjUmBMXa6Z;N=X2pVH(z#_4_X4PB>!=AJG+KYSa znbQmkrqtYbgmi>HMaeWiavsM67Fs5O%ji_aR&^5MDI>`~jE=Xd_Lh%LAM_|`w|Zon zphDkiQnGDoTQgrr24?bv^r)16I8~i4Of-=;D1t&$!H4x*E4a@&(#$to zw~-gvQ|63_j^|61R+aW(wdaUShv)tD@%C2v(txft*$%75+>NQRm`pfYXn;Oj)#zrs z|9!u}f$R*7OLA zPi_FlS_UCHVni}dx&N1_pD!D+f8-Z-VvEe}acn6#u)w2v^yKm}u#eZ+_7kI}o|oiz za^H`20nlpW^K*kRK(kBEMF`s`+oc~tZ;pKK4 zf{25ep8oh4vb8-d@{F-6z;C33nxg* z>bJ?QzvDdqbdLiJ+s)Q%{fc$2FCdI#wdO(g{b`xf2ZYz4ZU{*nVe1z8h6vkEb1FHq zlojDASW3s$Gd|0yH1GXnvzSQ`1u`n?-{70+;W-=zHVZv+*mYxs3WPOcr6N+b;GwTwY?=W3XY5;OKBpSWa8Ms`o}PBTD+lNTOn@qI>KzujjsT}{>k z$9RRoWESp*`w0yTc;jw6y<@y`6B@WU0Z6}Y5(>C%C&HE5By1&QbyVEg>Yi%2j5kFk}mLT&lI`xDP z^|6V{%dmi8Z{!Na`!6&%9N7fMww90l^S5eJSP+1V5w`O0ZGsO(SZg+#Xe&X^P+?<7 zOFT5Yq`B^K*$D(1c0NLCCZ`s9-`Rl2DyVjuwQVjq8EDUFy-tPZ#Ia-|)|g$cyNYQ6 z8;!hoKgGeVQ9*tE_$SssXBVKn)~AsOk&i7yFjlbybZK2b%ZM$Y<_%}J`B5N>;0xKp zP#kPq-Caj~Vw0F)#N`4ITC?ab*S0#%hpe%bgcP`Hk);JmhxH#eBk&#sqn)TA0newf zLsbKVxW#g<-8S2UzB+guurf8WBN2@60u;!Oo4G$pfvhi|; zR$Vx36-eP6KRlqhcE665v#fXdZ@j^6dc8;hGN7drkKk4rK$uE|XZ_tV=yikZK4{w! zUxk(@{D%_}w#flLJb{tf$I6o-ZO8LTs}>&txy%m54!r+c=9bZJ2pYYnlseFP{c7;D zS}!VNm2d--m_O2qw}8exQcsOcfl8%q5B4V$^B~M&ZbW`QIk=yFRBrh@4GR|mYv8}H z#lp?aePQ+IYFikc1g9&9AA0W4fED&rr|o6HM_?@0zoB9LwR56Z`|u!k8c?GMtTZ*o z{!eBD-@&xmLS>ENGHo+*Vg%EE38H`Zr!Qbs=9DChle`*>X36v2r?04TW(*4Zp3LC1 zcSUZ@v`3`$DG4;*w}^!McZkSwpg4&o++64A^mKW7fynm!kV!F`#8%-K?KSm zhhzapNBxJsAgy0FKhMbV9+D2Of&V*SghiL-{;Tk zp7XJ3!sqgmg{sIS6pBktE`KgEG&9c^7`naBizB!N8|tm+C8`xTwovotF$6L0*ls`_ z;V3VmAkR2+2wG2;U~WMM_=wtX0Pz7@-5O&H%UI+1Fc{$t1s#gtT-^rMK3^5lXkN*=xi}$A8-oaj8b+zHuL)VI= zgDye$$LUsw-(}~6efLL|fI$M`7DOJDXTr$oxt$5x87u@|KOy% z1%N$uN0C@<590v133=fP3dW4d%gV~iRyES;+&%E#d*bP2!pED;#Y*~~U4dRSZ@Jo3_Wd)^088^9d^I$4Bty#NM47?eIf z<@k!X-rdhOGg8SUyg@W4kI*&J#~g)A0g;q3B}|Um2HUpHq-@6_hz(uQa2WAKBEaf+ zR>DdAoPO4yVe$1hplHzoj2w}V{{8`^?36KTmfX^?RLUOM_xc;J-g(Cz+jc&@{cVs0 zc+8z3bc4_<3pEEplyr9JF*CpR=9}y;mN2JcpA1&OTzH+9Vui+I~W}Rx)*hgKl`cBXnClA{_Yp0Y7pA@s%mXr(Pdb8s z?TyzNMtH;KKx379cs8cv%q9(Kycz`&sE-)(mli+AQaJG+lQ{=}{) zfAsG^c=Sl~;bs}nJA!wTHUoh4^Wt#Yuf6dGt22)@ep^i|GX8Wkr@X4mA`NY%GbT>7 zWYb3m2zg)>02u$npZw21Tzbhxv(%Mrjz(o>WFlp!kW3~KkHyhH(2t>^A-(MjDw)R^ z8cO!=d2a7>zxdz(efZ_)_x@V;-gStuj(P-xM*|QPKe^t)Sd0}g^o7pu7dA`&yT7)fb*y8*QCefp_) z@3`~spMB%6zxvH+G@7Z7BNZ0LR`9=GcrIUvfBl;e-nsvQ2Ohrfj$giLaQ59q)GO=q z1~h;N3Gmzx#!4AE!N26q>mni-<(`}-pNIXmf2jrlgq?M~Qu78S0P6rD^7Ehk=Tpo! zf913>j0WAX=gO0k$MNh+q8Vzjwd& z=9?e?)mOh(a={nQyDS!qX8I!x!rB@^0X3>G6YhmGu>uTSv1OSwem^G0J6@?`1U&bC}Hp0uzNzt zjRpoi29azq5AAt!ci*0;c7Jr)6;sF0nLBUtgbCv(Wo3%a&yLQ{?xROrkG%Bai~BY` zaNm9+>Xe!;z6iSDMYw5$nO}Y5b(<_pSw>}mR#B;cAj3i{QJpg{?^?kl|o!(qtOXDp`aqg_nlUGlSo>e*tt$;ZS zfB3C#ZXL%Nr%lu^nll8_UGPj%h)SV^+yfMYm<}2OGfC`_1ks>G^8)}4ND{{>%19BB zNZ1VXu7*ot9@k?5|Ee_K-sj_3duy7^bo-{}Kr2-dvn;Vh>w}Pb^_op1}u>WLh4`6^& z0F$%|B+b58Cd5)t#g26;bTvlvPMzMc5OBc}fL?v8Y}vQ09r3D3;q}Lr#J~X0-|q#|WoOf6Kcbt5-sWcf+}^0ey(y9z-2d)-hLUqda7sQxGCtjB4Y=PW>3U>v=+l&1Dsn&9>a`{I=~h3n{p`8Q|EtYh z%J@}cVh0rV1(Rm|&0esCSN`H0hCrY2z#!n-6SxZ&vGO5^^h2ylHM$?wVLLuDc> zc2F63GfngSpaWnlYfz^@^>lDu)l*3V8FZvJ-?q2U;l{mG=MmiEIYc~!l;rPny*#Y!BMBsp?s8jsrC`TG6rfQnOlMiSB}Zs|u16K9?p;;Ms5`R? zSr5@iYuX3M7x+1u*n)N4L7B4;26;9#1b1Ey@s!fhnSd11nchNAF9C+v83|bBAcnx_ zqPwwRFpE9CfC)n_ma7FSKEc3hpfjrFr)5;4%Yd5U5nr*mpB7XD47oh~qzcAd{0 zi@Yw-#mEL`@Q_l!60;!1Z^Ap8Fd)h3%|$ZkwgU69^j&5FbMaihGwf3%q!3$I7EvSo zTl_prQ34SfJM4OsJwHAw;p+=#^ZT_;JcLuCFWHaRi!uCW7X<2J9E@Z8b~;FA3Xq7q z@NIMb+^&`$>!sL#!B{Z2NO`i*8TMDFei@gihd+2kFiuWqt)%mXb!6x-$f_p~NTRHT z_)fu$h0AYQ7uQ(vv9&U`ird|khKJXuN}=3ZjJ2y}p5 zV*)Qft57LNRmcrDstK`kRHQcdhI^h-GtF(yr{HpfbK+tOYSurl$qx$EkUlhIIn3cWF7B1f<`;~F+5po{A zj^8!9t9^Jr3e*Elm%Yim%q;alx>xqHOj&kN#yWOA(?q(CyCEs&3gq@b&6(jT;dwen zcj1{*)C?Ds5osx3CMuXJMukvi^32E2T*$0=1KQvW*4P8>aqp!vzfMxCNH}pP3pq;quDzg7Q^k5w#+&JS zym9^U{XXx;-xTMZ#!G1`=L;&w*_&Ok5UnCRmp^^w%Yy9RmT7>;=M214&PG3;f5YG3 z+CQBWDQAfb%d*Uwk(rS{vZBM6R)cHO@lEct<-G$oKWrxP1UwA>NQGR@toTEoQJ!e0 zS2NM5Q(Z||D0@sq;4uciMtN1sHHDQf#Jfg!oZ`wo8++~Kuj$rrJchu-%BzPJspKt3 zJD8oNU6~*G2lmJP{5Gc=r*5Z$FNPua&l_HJBfF4|@7Wu|URwTRSpl0bmUYW2%c~(> zdt!-pgF7p__}AN4k3ViJY{P{TLmzI_pKeKu9TX{IEOPD;a*YpcS=FBwjc6*4b1QdC z{Tg!5VaBGUzQ;0p7znr?@Lc1js*swr@Ofb$kv5?;;gOWPsT-;1Q;S9Yg^Y#Q)K@hQ zZ+d!UdXC-@09Zt@}iR7ctqjmmB`=Ws~cj! zY&JaaoQr%P;e4lYbM-%|Jq8+rrnmiZbCDKGdlB_Ds`EgcFzoWed4$TfPu>rsU1A^R zbl_e0l9W}IY?56!P4~5OvvOCJ(UILXS^o+CH+?jnR(8Iuceq%!ziFxId(&Rfr}dWg z5$5^C5bjTB_|K3sT&*W+nrfMKWBA#?_XbY*O`tMxVoZq~UBZNREAa5Cm>PF^!QRL^%Ur+Yo`YdH8WR@**Eifho zlfv1Kpn8%@re4;M%ePgM=sd3Z_|6AkB zjvDWFX0>lXh3nNj7!V^vh#o8Bc9>3%Z;4~po~)wM&ns;hEtSqo#wy6jL2qK@>N9_9 ze@Fkw4aBC_Vrm20=~|Dtlf<)bWbE(w`y9NY7q!H{UYU5@MXkP@wcoOTt>C40nBZCd zTS`JRbIo|XRe8F*PRqwo|7oo;t<|=emG6`FZP7}eg09M1^2D=I?!5}6->FpX?3ue? zxO==x$67E)76TSv2WMS5J2`QtxW$~*we87iYYP<>h3Hl}pP}sJ8~h=WERk`M#)|h8 zJL@#-LhZ?o7KCosd6y6N^$wln&?t$>nc*nPK|_dHNMFbrXAsv^?M}_w&0)V9okZQ- zJL{%i4qh|QQcwj2eEG=*`eJjZMJ|eA+Mj){Bkd*5WsC~6!zR@4Y5rbHU32OA>38l{ z1FE8xUxJ?UfKnVKK|5H#T{3@BPDsuvdU(IAt!UJ3j4osWGY~2pnidKRBha%9IA`>gqkJWC{cXs`%=NgJ&{yB}_8K6JpwEg1M8<2I+u7Abr$ zlZI!zXK@dyGU=)x()ayse|<`Q(I=(GkS*t}XGh+@Y-!jiyrh2ero=xHpd zVh*c*zK1{S3Uuux&uxDTT3Rp4Sjrf=uzbNb%yzZA9d`#cd-$4Zi3!Gq7q{25xjVN0 zWOXQ@BB!F7;zIc?!E~wn(x6E6HvF~9njC9!dI`e3&Rokf?`lzgXi4`k%;JY6By~u@ zhc!C;uyva>xG52Z-fxK3@(i6jb<|fq19yAdqqpVvxxSc$B^fu`x~mKbk~5;wyUOzc zGo9;US!|AL&1;I6mZFvpmo|UBs2;N{IXp$5ySd--YU#uAhm$49#1RbuY&`!9y3y&V z{o_dy49o#zi}JyQc?918tUP=JF%SzFLNZhXat@-Vs=5_icKme(nO-qKguAU2diYI3 z`4~Ck_TLJF$OdJ&vs=<}mr?Gj3@!owxQVNtJ=&RsD08UvYg)f3d1U#ElYf|wSZJVl zEQG#yp5=iMbQaS3Jvc=UD#EOW?ah~_NKZSlrZZk@CWNOByDJg#PXWd)h4Gg^ z*`cf7`^8-NiRheZnrTNX-=7`+ImUp@|3AiSx~DU1VHyD?RR?$V1LxNqwh9hbW85ScshA3g04foV6NvKob&CoZ~h1n?~WlsT&nI z?}Yj7?0}YS1#q< zi6*E;Ow5@Y|9;FoECeC)Z@LX#%J2+OQ-uEPm4!O%vAJzi+dbFa;z`>bAZh5$aK6$b zpp=qoQBEn}r!+|P_#N^53-uz^qUIm|jHvro_@x@8DfxS1_c^MTi^teKsjVv-Sisj5_1ErD?q%IrtSQyK|c;HXMo1FV~KMB?8>mBn=R6#*Z6 z8l&i@+cUoJ{*o=weqI^#wcB-iF|0=)+DR&mWmoq3R5V2l>6&MMIv%qba##okVP5K} zD4`~8u?+tsyErdzGvCbhFTt1V0yF~t!r~2FY|GTNuMufCwR4*RoN+o@Sott zTHE&iY4%?rv(4)fKNLPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0006TNkl42SAD%ME=kqzdUa!T^<#PGvr=6rSP=I{D-;1By z?Y09Q+20vW>UFQttl{=%LL-3%=xD}P%lF6QF`UomW{FB`6v9lA2Y@wz>H`CyGx2wU zVzmq?8NxdWyoEj5Fdi1KWezd%cz{iy_xpVoh{+g?Wne8vFHAB>AeJ7J1Pkm8sI^+1 z*a~zyod#^7eDKb)JsyuP5ddqI!VG9ugL3<_y3*gV3)v2^543L?s8_FKg8C?#Z2>3a zTD5A{XvS)#fhxA88jXs*lC)|Yfdr;$BGQdO$7;e}dzOyI!NwYaX1cf)=&W|}ou}7S zqd@Ml0S7cmt9C|lm+X<%@j2e9JMY=?UbS}!Eh_J+~B=8gp(NQ^8qvx zVz7h&o^}GXzW8~z0O^r}95@+M9pxGCZJ(ua6msn&YfP$1be-`A6jMi08&NPa%N@vU znVhUgHC!4>ID1Allyz)%;)*7xNk{c6^bFdojTJv{7$LUV)<@k~N!)Aeolp}{uOWI9 zF7dO#HVOWcq`kfXi)Ni|ebl+V$(H&_-5wduv~y{~UVo_s(@@eIY)iixqrWvMw=9x3 zhE@O2wIr_Ekk#?;N7eZ!?OCVe|4wVF{wwb|Nu|GZs#oHz?02ARGrKdoHltrh`Sc4u SErXr_0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_ADD_BOOKMARK.xml b/res/screen-size-normal/IDL_ADD_BOOKMARK.xml new file mode 100644 index 0000000..0dd9f5c --- /dev/null +++ b/res/screen-size-normal/IDL_ADD_BOOKMARK.xml @@ -0,0 +1,77 @@ + + + + + 720 +