From baa5b1ce00a7687ab6112780dfc27d486802c871 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:29:06 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- .cproject | 673 ++++++++ .project | 89 + CMakeLists.txt | 32 + LICENSE.Flora | 206 +++ NOTICE | 3 + inc/GlAlbumEventListener.h | 36 + inc/GlAlbumInfo.h | 71 + inc/GlAlbumListEditorForm.h | 122 ++ inc/GlAlbumListForm.h | 96 ++ inc/GlAlbumListPresentationModel.h | 132 ++ inc/GlAlbumNameEditorForm.h | 116 ++ inc/GlAlbumRenameEventListener.h | 32 + inc/GlAllListEditorPanel.h | 100 ++ inc/GlAllListPanel.h | 71 + inc/GlAllListSelectionPanel.h | 101 ++ inc/GlBaseForm.h | 43 + inc/GlCommonUtil.h | 36 + inc/GlContentUpdateEventListener.h | 60 + inc/GlDropDownCustomItem.h | 65 + inc/GlFileListEditorForm.h | 110 ++ inc/GlFileListForm.h | 82 + inc/GlFileListPresentationModel.h | 164 ++ inc/GlFileMoveTimer.h | 59 + inc/GlFileOpInvalidateListener.h | 37 + inc/GlFileUpdateTimer.h | 54 + inc/GlFormContentUpdateEventListener.h | 40 + inc/GlFormFactory.h | 36 + inc/GlGalleryApp.h | 76 + inc/GlIContentFileUpdateManager.h | 40 + inc/GlImageCropForm.h | 106 ++ inc/GlImageListEditorPanel.h | 88 + inc/GlImageListPanel.h | 67 + inc/GlMainFrame.h | 41 + inc/GlPanelFactory.h | 38 + inc/GlProgressAnimation.h | 48 + inc/GlProgressBar.h | 53 + inc/GlRadioCustomItem.h | 52 + inc/GlResourceManager.h | 38 + inc/GlSettingMainForm.h | 128 ++ inc/GlSettingPresentationModel.h | 62 + inc/GlSettingToggleCustomItem.h | 96 ++ inc/GlSlideSettingListener.h | 34 + inc/GlSlideShowPopUp.h | 74 + inc/GlThumbnailEvent.h | 40 + inc/GlThumbnailEventArg.h | 39 + inc/GlThumbnailEventListener.h | 33 + inc/GlThumbnailInfo.h | 59 + inc/GlThumbnailJob.h | 51 + inc/GlThumbnailProvider.h | 69 + inc/GlTimerBase.h | 97 ++ inc/GlTimerScanDirListener.h | 31 + inc/GlTypes.h | 360 ++++ inc/GlVideoListEditorPanel.h | 93 ++ inc/GlVideoListPanel.h | 69 + manifest.xml | 92 + packaging/apps.Gallery.spec | 79 + res/ara-AE.xml | 99 ++ res/aze-AZ.xml | 99 ++ res/bul-BG.xml | 99 ++ res/cat-ES.xml | 99 ++ res/ces-CZ.xml | 99 ++ res/dan-DK.xml | 99 ++ res/deu-DE.xml | 99 ++ res/ell-GR.xml | 99 ++ res/eng-GB.xml | 99 ++ res/eng-PH.xml | 99 ++ res/eng-US.xml | 99 ++ res/est-EE.xml | 99 ++ res/eus-ES.xml | 99 ++ res/fas-AF.xml | 99 ++ res/fin-FI.xml | 99 ++ res/fra-CA.xml | 99 ++ res/fra-FR.xml | 99 ++ res/gle-IE.xml | 99 ++ res/glg-ES.xml | 99 ++ res/hin-IN.xml | 99 ++ res/hrv-HR.xml | 99 ++ res/hun-HU.xml | 99 ++ res/hye-AM.xml | 99 ++ res/isl-IS.xml | 99 ++ res/ita-IT.xml | 99 ++ res/jpn-JP.xml | 99 ++ res/kat-GE.xml | 99 ++ res/kaz-KZ.xml | 99 ++ res/kor-KR.xml | 99 ++ res/lav-LV.xml | 99 ++ res/lit-LT.xml | 99 ++ res/mkd-MK.xml | 99 ++ res/nld-NL.xml | 99 ++ res/nob-NO.xml | 99 ++ res/pol-PL.xml | 99 ++ res/por-BR.xml | 99 ++ res/por-PT.xml | 99 ++ res/ron-RO.xml | 99 ++ res/rus-RU.xml | 99 ++ res/screen-density-xhigh/00_button_radio.png | Bin 0 -> 4817 bytes .../00_button_radio_selected.png | Bin 0 -> 3659 bytes .../00_circle_button_Expand_closed.png | Bin 0 -> 7318 bytes .../00_circle_button_Expand_open.png | Bin 0 -> 7148 bytes res/screen-density-xhigh/00_icon_more_dim.png | Bin 0 -> 335 bytes res/screen-density-xhigh/00_icon_more_press.png | Bin 0 -> 442 bytes .../00_icon_select_all_press_web.png | Bin 0 -> 4635 bytes .../00_icon_select_all_web.png | Bin 0 -> 4410 bytes res/screen-density-xhigh/00_list_expand_closed.png | Bin 0 -> 3060 bytes .../00_list_expand_closed_press.png | Bin 0 -> 3098 bytes res/screen-density-xhigh/00_list_expand_opened.png | Bin 0 -> 3040 bytes .../00_list_expand_opened_press.png | Bin 0 -> 3032 bytes res/screen-density-xhigh/00_list_process_01.png | Bin 0 -> 3937 bytes res/screen-density-xhigh/00_list_process_02.png | Bin 0 -> 3879 bytes res/screen-density-xhigh/00_list_process_03.png | Bin 0 -> 3824 bytes res/screen-density-xhigh/00_list_process_04.png | Bin 0 -> 3918 bytes res/screen-density-xhigh/00_list_process_05.png | Bin 0 -> 3936 bytes res/screen-density-xhigh/00_list_process_06.png | Bin 0 -> 3917 bytes res/screen-density-xhigh/00_list_process_07.png | Bin 0 -> 3884 bytes res/screen-density-xhigh/00_list_process_08.png | Bin 0 -> 3999 bytes res/screen-density-xhigh/00_list_process_09.png | Bin 0 -> 3964 bytes res/screen-density-xhigh/00_list_process_10.png | Bin 0 -> 3906 bytes res/screen-density-xhigh/00_list_process_11.png | Bin 0 -> 3855 bytes res/screen-density-xhigh/00_list_process_12.png | Bin 0 -> 3921 bytes res/screen-density-xhigh/00_list_process_13.png | Bin 0 -> 3926 bytes res/screen-density-xhigh/00_list_process_14.png | Bin 0 -> 3945 bytes res/screen-density-xhigh/00_list_process_15.png | Bin 0 -> 3978 bytes res/screen-density-xhigh/00_list_process_16.png | Bin 0 -> 3889 bytes res/screen-density-xhigh/00_list_process_17.png | Bin 0 -> 3865 bytes res/screen-density-xhigh/00_list_process_18.png | Bin 0 -> 3815 bytes res/screen-density-xhigh/00_list_process_19.png | Bin 0 -> 3896 bytes res/screen-density-xhigh/00_list_process_20.png | Bin 0 -> 3881 bytes res/screen-density-xhigh/00_list_process_21.png | Bin 0 -> 2104 bytes res/screen-density-xhigh/00_list_process_22.png | Bin 0 -> 2058 bytes res/screen-density-xhigh/00_list_process_23.png | Bin 0 -> 2141 bytes res/screen-density-xhigh/00_list_process_24.png | Bin 0 -> 2128 bytes res/screen-density-xhigh/00_list_process_25.png | Bin 0 -> 2058 bytes res/screen-density-xhigh/00_list_process_26.png | Bin 0 -> 2004 bytes res/screen-density-xhigh/00_list_process_27.png | Bin 0 -> 2068 bytes res/screen-density-xhigh/00_list_process_28.png | Bin 0 -> 2124 bytes res/screen-density-xhigh/00_list_process_29.png | Bin 0 -> 2133 bytes res/screen-density-xhigh/00_list_process_30.png | Bin 0 -> 2173 bytes res/screen-density-xhigh/T01-1_crop_rectangle.png | Bin 0 -> 2813 bytes .../T01_1_face_tag_icon_email.png | Bin 0 -> 3373 bytes .../T01_1_face_tag_icon_message.png | Bin 0 -> 3231 bytes res/screen-density-xhigh/T01_Nocontents_broken.png | Bin 0 -> 6301 bytes .../T01_Nocontents_picture.png | Bin 0 -> 7487 bytes res/screen-density-xhigh/T01_album_edit_rename.png | Bin 0 -> 3499 bytes .../T01_album_edit_rename_bg.png | Bin 0 -> 7795 bytes res/screen-density-xhigh/T01_album_icon_camera.png | Bin 0 -> 4432 bytes .../T01_album_icon_download.png | Bin 0 -> 4219 bytes res/screen-density-xhigh/T01_album_icon_folder.png | Bin 0 -> 3479 bytes res/screen-density-xhigh/T01_btn_play.png | Bin 0 -> 9395 bytes .../T01_button_circle_bg_normal.png | Bin 0 -> 5130 bytes .../T01_button_circle_bg_normal_press.png | Bin 0 -> 5141 bytes res/screen-density-xhigh/T01_button_rename.png | Bin 0 -> 3186 bytes res/screen-density-xhigh/T01_button_reveal.png | Bin 0 -> 3108 bytes .../T01_controlbar_icon_addtag.png | Bin 0 -> 3930 bytes .../T01_controlbar_icon_camera.png | Bin 0 -> 3903 bytes .../T01_controlbar_icon_delete.png | Bin 0 -> 3518 bytes .../T01_controlbar_icon_done.png | Bin 0 -> 3322 bytes .../T01_controlbar_icon_download.png | Bin 0 -> 3415 bytes .../T01_controlbar_icon_edit.png | Bin 0 -> 3305 bytes .../T01_controlbar_icon_more.png | Bin 0 -> 659 bytes .../T01_controlbar_icon_move.png | Bin 0 -> 3289 bytes .../T01_controlbar_icon_save.png | Bin 0 -> 3238 bytes .../T01_controlbar_icon_share02.png | Bin 0 -> 3637 bytes .../T01_controlbar_icon_slideshow.png | Bin 0 -> 3183 bytes res/screen-density-xhigh/T01_grid_select_check.png | Bin 0 -> 4247 bytes .../T01_icon_thumbnail_bookmark.png | Bin 0 -> 3807 bytes .../T01_icon_thumbnail_favorite.png | Bin 0 -> 3974 bytes res/screen-density-xhigh/T01_main_folder_bg.png | Bin 0 -> 4436 bytes .../T01_places_thumbnail_bg.png | Bin 0 -> 3330 bytes .../T01_toolbar_icon_delete_dim_web.png | Bin 0 -> 3530 bytes .../T01_toolbar_icon_share_dim_web.png | Bin 0 -> 3633 bytes .../IDL_DEL_PROGRESSING_POPUP.xml | 42 + res/screen-size-normal/IDL_FORM_ALBUM_LIST.xml | 21 + .../IDL_FORM_ALBUM_LIST_EDITOR.xml | 31 + .../IDL_FORM_ALBUM_NAME_EDITOR.xml | 26 + res/screen-size-normal/IDL_FORM_FILE_LIST.xml | 21 + .../IDL_FORM_FILE_LIST_EDITOR.xml | 26 + res/screen-size-normal/IDL_FORM_IMAGE_CROP.xml | 18 + res/screen-size-normal/IDL_FORM_SETTING_MAIN.xml | 22 + .../IDL_SLIDESHOW_SETTING_POPUP.xml | 22 + res/slk-SK.xml | 99 ++ res/slv-SI.xml | 99 ++ res/spa-ES.xml | 99 ++ res/spa-MX.xml | 99 ++ res/srp-RS.xml | 99 ++ res/swe-SE.xml | 99 ++ res/tha-TH.xml | 99 ++ res/tur-TR.xml | 99 ++ res/ukr-UA.xml | 99 ++ res/urd-IN.xml | 99 ++ res/uzb-UZ.xml | 99 ++ res/zho-CN.xml | 99 ++ res/zho-HK.xml | 99 ++ res/zho-SG.xml | 99 ++ res/zho-TW.xml | 99 ++ shared/data/GalleryDefaultSettings.ini | 5 + shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 57662 bytes shared/trusted/nofile.dummy | 0 src/GlAlbumInfo.cpp | 388 +++++ src/GlAlbumListEditorForm.cpp | 1143 +++++++++++++ src/GlAlbumListForm.cpp | 568 +++++++ src/GlAlbumListPresentationModel.cpp | 1251 ++++++++++++++ src/GlAlbumNameEditorForm.cpp | 801 +++++++++ src/GlAllListEditorPanel.cpp | 951 +++++++++++ src/GlAllListPanel.cpp | 415 +++++ src/GlAllListSelectionPanel.cpp | 808 +++++++++ src/GlBaseForm.cpp | 115 ++ src/GlCommonUtil.cpp | 66 + src/GlContentUpdateEventListener.cpp | 284 ++++ src/GlDropDownCustomItem.cpp | 131 ++ src/GlFileListEditorForm.cpp | 1430 ++++++++++++++++ src/GlFileListForm.cpp | 369 ++++ src/GlFileListPresentationModel.cpp | 1763 ++++++++++++++++++++ src/GlFileMoveTimer.cpp | 282 ++++ src/GlFileUpdateTimer.cpp | 211 +++ src/GlFormFactory.cpp | 109 ++ src/GlGalleryApp.cpp | 257 +++ src/GlGalleryEntry.cpp | 56 + src/GlImageCropForm.cpp | 960 +++++++++++ src/GlImageListEditorPanel.cpp | 708 ++++++++ src/GlImageListPanel.cpp | 268 +++ src/GlMainFrame.cpp | 127 ++ src/GlPanelFactory.cpp | 108 ++ src/GlProgressAnimation.cpp | 216 +++ src/GlProgressBar.cpp | 207 +++ src/GlRadioCustomItem.cpp | 85 + src/GlResourceManager.cpp | 58 + src/GlSettingMainForm.cpp | 793 +++++++++ src/GlSettingPresentationModel.cpp | 245 +++ src/GlSettingToggleCustomItem.cpp | 81 + src/GlSlideShowPopUp.cpp | 181 ++ src/GlThumbnailEvent.cpp | 40 + src/GlThumbnailEventArg.cpp | 58 + src/GlThumbnailInfo.cpp | 140 ++ src/GlThumbnailJob.cpp | 70 + src/GlThumbnailProvider.cpp | 448 +++++ src/GlTimerBase.cpp | 364 ++++ src/GlTypes.cpp | 218 +++ src/GlVideoListEditorPanel.cpp | 787 +++++++++ src/GlVideoListPanel.cpp | 271 +++ 239 files changed, 28230 insertions(+) create mode 100644 .cproject create mode 100644 .project create mode 100755 CMakeLists.txt create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100644 inc/GlAlbumEventListener.h create mode 100644 inc/GlAlbumInfo.h create mode 100644 inc/GlAlbumListEditorForm.h create mode 100644 inc/GlAlbumListForm.h create mode 100644 inc/GlAlbumListPresentationModel.h create mode 100644 inc/GlAlbumNameEditorForm.h create mode 100644 inc/GlAlbumRenameEventListener.h create mode 100644 inc/GlAllListEditorPanel.h create mode 100644 inc/GlAllListPanel.h create mode 100644 inc/GlAllListSelectionPanel.h create mode 100644 inc/GlBaseForm.h create mode 100644 inc/GlCommonUtil.h create mode 100644 inc/GlContentUpdateEventListener.h create mode 100644 inc/GlDropDownCustomItem.h create mode 100644 inc/GlFileListEditorForm.h create mode 100644 inc/GlFileListForm.h create mode 100644 inc/GlFileListPresentationModel.h create mode 100644 inc/GlFileMoveTimer.h create mode 100644 inc/GlFileOpInvalidateListener.h create mode 100644 inc/GlFileUpdateTimer.h create mode 100644 inc/GlFormContentUpdateEventListener.h create mode 100644 inc/GlFormFactory.h create mode 100644 inc/GlGalleryApp.h create mode 100644 inc/GlIContentFileUpdateManager.h create mode 100644 inc/GlImageCropForm.h create mode 100644 inc/GlImageListEditorPanel.h create mode 100644 inc/GlImageListPanel.h create mode 100644 inc/GlMainFrame.h create mode 100644 inc/GlPanelFactory.h create mode 100644 inc/GlProgressAnimation.h create mode 100644 inc/GlProgressBar.h create mode 100644 inc/GlRadioCustomItem.h create mode 100644 inc/GlResourceManager.h create mode 100644 inc/GlSettingMainForm.h create mode 100644 inc/GlSettingPresentationModel.h create mode 100644 inc/GlSettingToggleCustomItem.h create mode 100644 inc/GlSlideSettingListener.h create mode 100644 inc/GlSlideShowPopUp.h create mode 100644 inc/GlThumbnailEvent.h create mode 100644 inc/GlThumbnailEventArg.h create mode 100644 inc/GlThumbnailEventListener.h create mode 100644 inc/GlThumbnailInfo.h create mode 100644 inc/GlThumbnailJob.h create mode 100644 inc/GlThumbnailProvider.h create mode 100644 inc/GlTimerBase.h create mode 100644 inc/GlTimerScanDirListener.h create mode 100644 inc/GlTypes.h create mode 100644 inc/GlVideoListEditorPanel.h create mode 100644 inc/GlVideoListPanel.h create mode 100644 manifest.xml create mode 100644 packaging/apps.Gallery.spec 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/fas-AF.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_radio.png create mode 100644 res/screen-density-xhigh/00_button_radio_selected.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_icon_more_dim.png create mode 100644 res/screen-density-xhigh/00_icon_more_press.png create mode 100644 res/screen-density-xhigh/00_icon_select_all_press_web.png create mode 100644 res/screen-density-xhigh/00_icon_select_all_web.png create mode 100644 res/screen-density-xhigh/00_list_expand_closed.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.png create mode 100644 res/screen-density-xhigh/00_list_expand_opened_press.png create mode 100644 res/screen-density-xhigh/00_list_process_01.png create mode 100644 res/screen-density-xhigh/00_list_process_02.png create mode 100644 res/screen-density-xhigh/00_list_process_03.png create mode 100644 res/screen-density-xhigh/00_list_process_04.png create mode 100644 res/screen-density-xhigh/00_list_process_05.png create mode 100644 res/screen-density-xhigh/00_list_process_06.png create mode 100644 res/screen-density-xhigh/00_list_process_07.png create mode 100644 res/screen-density-xhigh/00_list_process_08.png create mode 100644 res/screen-density-xhigh/00_list_process_09.png create mode 100644 res/screen-density-xhigh/00_list_process_10.png create mode 100644 res/screen-density-xhigh/00_list_process_11.png create mode 100644 res/screen-density-xhigh/00_list_process_12.png create mode 100644 res/screen-density-xhigh/00_list_process_13.png create mode 100644 res/screen-density-xhigh/00_list_process_14.png create mode 100644 res/screen-density-xhigh/00_list_process_15.png create mode 100644 res/screen-density-xhigh/00_list_process_16.png create mode 100644 res/screen-density-xhigh/00_list_process_17.png create mode 100644 res/screen-density-xhigh/00_list_process_18.png create mode 100644 res/screen-density-xhigh/00_list_process_19.png create mode 100644 res/screen-density-xhigh/00_list_process_20.png create mode 100644 res/screen-density-xhigh/00_list_process_21.png create mode 100644 res/screen-density-xhigh/00_list_process_22.png create mode 100644 res/screen-density-xhigh/00_list_process_23.png create mode 100644 res/screen-density-xhigh/00_list_process_24.png create mode 100644 res/screen-density-xhigh/00_list_process_25.png create mode 100644 res/screen-density-xhigh/00_list_process_26.png create mode 100644 res/screen-density-xhigh/00_list_process_27.png create mode 100644 res/screen-density-xhigh/00_list_process_28.png create mode 100644 res/screen-density-xhigh/00_list_process_29.png create mode 100644 res/screen-density-xhigh/00_list_process_30.png create mode 100644 res/screen-density-xhigh/T01-1_crop_rectangle.png create mode 100644 res/screen-density-xhigh/T01_1_face_tag_icon_email.png create mode 100644 res/screen-density-xhigh/T01_1_face_tag_icon_message.png create mode 100644 res/screen-density-xhigh/T01_Nocontents_broken.png create mode 100644 res/screen-density-xhigh/T01_Nocontents_picture.png create mode 100644 res/screen-density-xhigh/T01_album_edit_rename.png create mode 100644 res/screen-density-xhigh/T01_album_edit_rename_bg.png create mode 100644 res/screen-density-xhigh/T01_album_icon_camera.png create mode 100644 res/screen-density-xhigh/T01_album_icon_download.png create mode 100644 res/screen-density-xhigh/T01_album_icon_folder.png create mode 100644 res/screen-density-xhigh/T01_btn_play.png create mode 100644 res/screen-density-xhigh/T01_button_circle_bg_normal.png create mode 100644 res/screen-density-xhigh/T01_button_circle_bg_normal_press.png create mode 100644 res/screen-density-xhigh/T01_button_rename.png create mode 100644 res/screen-density-xhigh/T01_button_reveal.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_addtag.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_camera.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_delete.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_done.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_download.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_edit.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_more.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_move.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_save.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_share02.png create mode 100644 res/screen-density-xhigh/T01_controlbar_icon_slideshow.png create mode 100644 res/screen-density-xhigh/T01_grid_select_check.png create mode 100644 res/screen-density-xhigh/T01_icon_thumbnail_bookmark.png create mode 100644 res/screen-density-xhigh/T01_icon_thumbnail_favorite.png create mode 100644 res/screen-density-xhigh/T01_main_folder_bg.png create mode 100644 res/screen-density-xhigh/T01_places_thumbnail_bg.png create mode 100644 res/screen-density-xhigh/T01_toolbar_icon_delete_dim_web.png create mode 100644 res/screen-density-xhigh/T01_toolbar_icon_share_dim_web.png create mode 100644 res/screen-size-normal/IDL_DEL_PROGRESSING_POPUP.xml create mode 100644 res/screen-size-normal/IDL_FORM_ALBUM_LIST.xml create mode 100644 res/screen-size-normal/IDL_FORM_ALBUM_LIST_EDITOR.xml create mode 100644 res/screen-size-normal/IDL_FORM_ALBUM_NAME_EDITOR.xml create mode 100644 res/screen-size-normal/IDL_FORM_FILE_LIST.xml create mode 100644 res/screen-size-normal/IDL_FORM_FILE_LIST_EDITOR.xml create mode 100644 res/screen-size-normal/IDL_FORM_IMAGE_CROP.xml create mode 100644 res/screen-size-normal/IDL_FORM_SETTING_MAIN.xml create mode 100644 res/screen-size-normal/IDL_SLIDESHOW_SETTING_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/tha-TH.xml create mode 100644 res/tur-TR.xml create mode 100644 res/ukr-UA.xml create mode 100644 res/urd-IN.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/GalleryDefaultSettings.ini create mode 100644 shared/res/screen-density-xhigh/mainmenu.png create mode 100644 shared/trusted/nofile.dummy create mode 100644 src/GlAlbumInfo.cpp create mode 100644 src/GlAlbumListEditorForm.cpp create mode 100644 src/GlAlbumListForm.cpp create mode 100644 src/GlAlbumListPresentationModel.cpp create mode 100644 src/GlAlbumNameEditorForm.cpp create mode 100644 src/GlAllListEditorPanel.cpp create mode 100644 src/GlAllListPanel.cpp create mode 100644 src/GlAllListSelectionPanel.cpp create mode 100644 src/GlBaseForm.cpp create mode 100644 src/GlCommonUtil.cpp create mode 100644 src/GlContentUpdateEventListener.cpp create mode 100644 src/GlDropDownCustomItem.cpp create mode 100644 src/GlFileListEditorForm.cpp create mode 100644 src/GlFileListForm.cpp create mode 100644 src/GlFileListPresentationModel.cpp create mode 100644 src/GlFileMoveTimer.cpp create mode 100644 src/GlFileUpdateTimer.cpp create mode 100644 src/GlFormFactory.cpp create mode 100644 src/GlGalleryApp.cpp create mode 100644 src/GlGalleryEntry.cpp create mode 100644 src/GlImageCropForm.cpp create mode 100644 src/GlImageListEditorPanel.cpp create mode 100644 src/GlImageListPanel.cpp create mode 100644 src/GlMainFrame.cpp create mode 100644 src/GlPanelFactory.cpp create mode 100644 src/GlProgressAnimation.cpp create mode 100644 src/GlProgressBar.cpp create mode 100644 src/GlRadioCustomItem.cpp create mode 100644 src/GlResourceManager.cpp create mode 100644 src/GlSettingMainForm.cpp create mode 100644 src/GlSettingPresentationModel.cpp create mode 100644 src/GlSettingToggleCustomItem.cpp create mode 100644 src/GlSlideShowPopUp.cpp create mode 100644 src/GlThumbnailEvent.cpp create mode 100644 src/GlThumbnailEventArg.cpp create mode 100755 src/GlThumbnailInfo.cpp create mode 100644 src/GlThumbnailJob.cpp create mode 100644 src/GlThumbnailProvider.cpp create mode 100644 src/GlTimerBase.cpp create mode 100644 src/GlTypes.cpp create mode 100644 src/GlVideoListEditorPanel.cpp create mode 100644 src/GlVideoListPanel.cpp diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..a9a0efd --- /dev/null +++ b/.cproject @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..708a503 --- /dev/null +++ b/.project @@ -0,0 +1,89 @@ + + + Gallery + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + sbi-make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/Gallery/Debug-Tizen-Emulator} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecpp.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecpp.apichecker.core.tizenCppNature + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..49be476 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +# Target name and PKGID +## TODO : set application name and ID +SET(this_target Gallery) +SET(PKGID ijudt7w61q) + +# 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-image osp-content 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/${PKGID}/bin) + +# Copy resource +INSTALL(FILES ${CMAKE_SOURCE_DIR}/manifest.xml DESTINATION ../usr/apps/${PKGID}/info) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ../usr/apps/${PKGID}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/shared DESTINATION ../usr/apps/${PKGID}) diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..571fe79 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +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 Tizen Compliance Specification +and passes the Tizen Compliance Tests 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 + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +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.1 (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..1ac0202 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Flora License, Version 1.1. +Please, see the LICENSE.Flora file for Flora License, Version 1.1 terms and conditions. \ No newline at end of file diff --git a/inc/GlAlbumEventListener.h b/inc/GlAlbumEventListener.h new file mode 100644 index 0000000..9840955 --- /dev/null +++ b/inc/GlAlbumEventListener.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumEventListener.h + * @brief This is the header file for AlbumEventListener class. + */ + +#ifndef _GL_ALBUM_EVENT_LISTENER_H_ +#define _GL_ALBUM_EVENT_LISTENER_H_ + +#include + +class IAlbumEventListener + : public Tizen::Base::Object +{ +public: + virtual ~IAlbumEventListener(void) {}; + virtual void OnFileInfoChanged(const Tizen::Content::ContentType contentType) = 0; + virtual void OnThumbnailDecoded(const int index) = 0; +}; + +#endif /* _GL_ALBUM_EVENT_LISTENER_H_ */ diff --git a/inc/GlAlbumInfo.h b/inc/GlAlbumInfo.h new file mode 100644 index 0000000..07e76d9 --- /dev/null +++ b/inc/GlAlbumInfo.h @@ -0,0 +1,71 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumInfo.h + * @brief This is the header file for AlbumInfo class. + */ + +#ifndef _GL_ALBUM_INFO_H_ +#define _GL_ALBUM_INFO_H_ + +#include +#include "GlTypes.h" + +class AlbumInfo + : public Tizen::Base::Object +{ +public: + AlbumInfo(void); + virtual ~AlbumInfo(void); + + result Construct(void); + result Construct(const Tizen::Base::String& albumName, Tizen::Content::ContentType contentType, + const Tizen::Base::Collection::IList& directoryList, + const Tizen::Base::Collection::IList& contentIdList); + result Construct(const AlbumInfo& albumInfo); + + Tizen::Base::String GetAlbumName(void) const; + void SetAlbumName(const Tizen::Base::String& albumName); + Tizen::Base::String GetDirectory(int index) const; + Tizen::Base::Collection::IList* GetDirectoryListN(void) const; + void ClearDirectoryList(void); + void AppendDirectory(const Tizen::Base::String& directoryPath); + void AppendDirectoryList(const Tizen::Base::Collection::ICollection& directoryList); + int GetDirectoryCount(void) const; + + void ClearAll(void); + AlbumInfoType GetAlbumInfoType(void) const; + + Tizen::Graphics::Bitmap* GetFolderThumnailBitmap(void) const; + void SetFolderThumnailBitmap(Tizen::Graphics::Bitmap* folderThumnailBitmap); + + void ClearContentIdList(void); + Tizen::Base::Collection::IList* GetContentIdListN(void) const; + Tizen::Content::ContentId GetContentId(int index) const; + void AppendContentId(const Tizen::Content::ContentId& contentId); + void AppendContentIdList(const Tizen::Base::Collection::ICollection& contentIdList); + int GetContentIdCount(void) const; + result RemoveContentIdAt(const int index); + +private: + Tizen::Base::String __albumName; + Tizen::Base::Collection::IList* __pDirectoryFullPathList; + Tizen::Base::Collection::IList* __pContentIdList; + Tizen::Graphics::Bitmap* __pFolderThumnailBitmap; +}; + +#endif /* _GL_ALBUM_INFO_H_ */ diff --git a/inc/GlAlbumListEditorForm.h b/inc/GlAlbumListEditorForm.h new file mode 100644 index 0000000..9ecc126 --- /dev/null +++ b/inc/GlAlbumListEditorForm.h @@ -0,0 +1,122 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListEditorForm.h + * @brief This is the header file for AlbumListEditorForm class. + */ + +#ifndef _GL_ALBUM_LIST_EDITOR_FORM_H_ +#define _GL_ALBUM_LIST_EDITOR_FORM_H_ + +#include +#include "GlAlbumEventListener.h" +#include "GlFileUpdateTimer.h" +#include "GlFormContentUpdateEventListener.h" + +class AlbumListPresentationModel; + +class AlbumListEditorForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::IPropagatedKeyEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener + , public IAlbumEventListener + , public IFileOpInvalidateListener + , public IFormContentUpdateEventListener +{ +public: + AlbumListEditorForm(void); + virtual ~AlbumListEditorForm(void); + + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + virtual void OnIconListViewItemStateChanged(Tizen::Ui::Controls::IconListView &view, int index, + Tizen::Ui::Controls::IconListViewItemStatus status); + virtual void OnIconListViewOverlayBitmapSelected(Tizen::Ui::Controls::IconListView &iconListView, int index, + int overlayBitmapId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + virtual void OnFormMenuRequested (Tizen::Ui::Controls::Form &source); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes); + virtual void OnScanDirStart(); + virtual void OnScanDirComplete(); + + virtual void ShowAnimation(void); + virtual void StopAnimation(void); + virtual void OnContentUpdated(void); + +private: + result InitializeControl(void); + result InitializePopup(void); + void CreateIconListView(void); + void SetAllCheckState(const bool state); + + void OnRequestMessage(void); + void OnRequestEmail(void); + + result DeleteFolder(void); + int GetCheckedFolderCount(void) const; + Tizen::Base::Collection::IList* GetItemCheckedIndexListN(void) const; + result Update(void); + void SetFooterButtonsState(const bool enableState); + void SetButtonState(void); + +private: + int __checkedCount; + Tizen::Ui::Controls::Label* __pSelectCountLabel; + Tizen::Ui::Controls::IconListView* __pEditorFolderIconList; + Tizen::Ui::Controls::ContextMenu* __pShareContextMenu; + Tizen::Ui::Controls::Popup* __pDeletePopup; + FileUpdateTimer* __pFileUpdateTimer; + AlbumListPresentationModel* __pPresentationModel; + bool __isScanProgress; +}; + +#endif /* _GL_ALBUM_LIST_EDITOR_FORM_H_ */ diff --git a/inc/GlAlbumListForm.h b/inc/GlAlbumListForm.h new file mode 100644 index 0000000..b900b2d --- /dev/null +++ b/inc/GlAlbumListForm.h @@ -0,0 +1,96 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListForm.h + * @brief This is the header file for AlbumListForm class. + */ + +#ifndef _GL_ALBUM_LIST_FORM_H_ +#define _GL_ALBUM_LIST_FORM_H_ + +#include +#include +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" + +class AlbumListPresentationModel; + +class AlbumListForm + : public IAlbumEventListener + , public IFormContentUpdateEventListener + , public Tizen::App::IAppControlResponseListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AlbumListForm(void); + virtual ~AlbumListForm(void); + + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnContentUpdated(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, + int index, Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFormMenuRequested (Tizen::Ui::Controls::Form &source); + + virtual void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + virtual void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + virtual void ShowAnimation(void){} + virtual void StopAnimation(void){} +private: + result InitializeHeader(void); + result InitializeFooter(void); + void CreateIconListView(void); + result Update(void); + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pAlbumViewIconList; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + AlbumListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_ALBUM_LIST_FORM_H_ */ diff --git a/inc/GlAlbumListPresentationModel.h b/inc/GlAlbumListPresentationModel.h new file mode 100644 index 0000000..65c7765 --- /dev/null +++ b/inc/GlAlbumListPresentationModel.h @@ -0,0 +1,132 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListPresentationModel.h + * @brief This is the header file for AlbumListPresentationModel class. + */ + +#ifndef _GL_ALBUM_LIST_PRESENTATION_MODEL_H_ +#define _GL_ALBUM_LIST_PRESENTATION_MODEL_H_ + +#include +#include +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" +#include "GlIContentFileUpdateManager.h" +#include "GlResourceManager.h" +#include "GlThumbnailEventListener.h" +#include "GlThumbnailProvider.h" +#include "GlTypes.h" + +class AlbumInfo; +class IAlbumRenameEventListener; +class ITimerScanDirListener; + +class AlbumListPresentationModel + : public IContentFileUpdateManager + , public IThumbnailEventListener + , public Tizen::Base::Object + , public Tizen::System::IDeviceEventListener +{ +public: + static AlbumListPresentationModel* GetInstance(void); + + result AddPresentationModelListener(IAlbumEventListener* listener); + result RemovePresentationModelListener(IAlbumEventListener& listner); + + static void AddContentEventListener(const IFormContentUpdateEventListener* listener); + static void RemoveContentEventListener(const IFormContentUpdateEventListener& listener); + + virtual result RotateImage(const Tizen::Content::ContentId&, RotateMode rotateMode); + virtual void RequestThumbnail(int index){}; + virtual void RequestThumbnail(const Tizen::Content::ContentId& contentId){}; + void RequestThumbnail(const int folderIndex, const int pathIndex); + void ClearThumbnailRequests(const bool appTerminating = false); + result StartAppControl(const Tizen::Base::String& providerId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, + const Tizen::Base::Collection::HashMap* pDataList, Tizen::App::IAppControlResponseListener* pListener); + + void InitializeAlbumInfoList(const Tizen::Content::ContentType& contentType); + void CallAlbumChangedEvent(void); + int GetFolderCount(void) const; + + Tizen::Graphics::Bitmap* CreateMergeBitmapN(const int index); + Tizen::Base::Collection::IList* GetAlbumInfoList(void) const; + + AppControlMode GetAppControlMode(void) const; + AppControlMediaType GetAppControlMediaType(void) const; + AppControlSelectionMode GetAppControlSelectionMode(void) const; + + result RenameAlbum(const Tizen::Base::String&, const Tizen::Base::String&, IAlbumRenameEventListener*); + + virtual Tizen::Base::Collection::IList* GetContentIdListAtIndexN(const Tizen::Base::Collection::IList& indexList) const; + virtual result DeleteContentFile(const Tizen::Base::String& filePath); + + virtual void OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg); + + bool OnContentScanCompleted(const Tizen::Base::String &scanPath); + + void OnContentCreated(void); + void OnContentUpdated(void); + void OnContentDeleted(void); + + virtual void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state); + void SetUpdateProgressStatus(const bool status); + void AddTimerScanListener(ITimerScanDirListener* pListener, int scanCount); + void RemoveTimerScanListener(void); + + void ShowAnimation(void); + void StopAnimation(void); +private: + AlbumListPresentationModel(void); + virtual ~AlbumListPresentationModel(void); + AlbumListPresentationModel(const AlbumListPresentationModel&); + const AlbumListPresentationModel& operator =(const AlbumListPresentationModel&); + + result Construct(void); + static void CreateInstance(void); + static void DestroyInstance(void); + + void DrawPartialImage(Tizen::Graphics::Canvas& canvas, AlbumInfo* pAlbumInfo, + const Tizen::Graphics::Rectangle& rectNew); + void DrawFontImage(Tizen::Graphics::Canvas& canvas, AlbumInfo* pAlbumInfo, int index); + + Tizen::Base::String GetDirectoryName(Tizen::Base::String& directoryPath) const; + Tizen::Base::Collection::IList* GetContentIdListInDirectoryN(const Tizen::Base::String& directoryPath, + Tizen::Content::ContentType contentType) const; + Tizen::Base::String GetDirectoryNameFromFullPath(const Tizen::Base::String& fullPath) const; + +private: + static AlbumListPresentationModel* __pPresentationModelInstance; + static ThumbnailProvider* __pThumbnailProvider; + static ThumbnailEvent* __pThumbnailEvent; + static Tizen::Base::Collection::ArrayList* __pContentEventListener; + static Tizen::Base::Collection::ArrayList* __pPresentationModelListener; + static Tizen::Base::Collection::IList* __pAlbumInfoList; + Tizen::Graphics::Bitmap* __pFolderBackgroundBitmap; + IAlbumRenameEventListener* __pAlbumListener; + RequestId __reqId; + AppControlMode __appControlMode; + AppControlMediaType __appControlMediaType; + AppControlSelectionMode __appControlSelectionMode; + bool __updateProgressStatus; + Tizen::Base::String __renameNewPath; + ITimerScanDirListener* __pTimerScanListener; + int __scanCount; +}; + +#endif /* _GL_ALBUM_LIST_PRESENTATION_MODEL_H_ */ diff --git a/inc/GlAlbumNameEditorForm.h b/inc/GlAlbumNameEditorForm.h new file mode 100644 index 0000000..e82dbfb --- /dev/null +++ b/inc/GlAlbumNameEditorForm.h @@ -0,0 +1,116 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumNameEditorForm.h + * @brief This is the header file for AlbumNameEditorForm class. + */ + +#ifndef _GL_ALBUM_NAME_EDITOR_FORM_H_ +#define _GL_ALBUM_NAME_EDITOR_FORM_H_ + +#include +#include "GlAlbumRenameEventListener.h" +#include "GlBaseForm.h" +#include "GlFileOpInvalidateListener.h" +#include "GlTypes.h" + +class AlbumListPresentationModel; +class FileListPresentationModel; +class FileMoveTimer; +class ProgressAnimation; + +class AlbumNameEditorForm + : public BaseForm + , public IAlbumRenameEventListener + , public IFormContentUpdateEventListener + , public IFileOpInvalidateListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::System::IDeviceEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AlbumNameEditorForm(void); + virtual ~AlbumNameEditorForm(void); + + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnContentUpdated(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + 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 void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + + //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){}; + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes); + virtual void OnScanDirStart(){} + virtual void OnScanDirComplete(){} + + virtual void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state); + virtual void OnAlbumRenameComplete(void); + virtual void CreateMessage(Tizen::Base::String& str); + virtual void ShowAnimation(void); + virtual void StopAnimation(void); +private: + void OnCreateAlbum(void); + void OnRenameAlbum(Tizen::Base::String& name); + +private: + Tizen::Ui::Controls::EditField* __pNameEditField; + Tizen::Base::String __nameEditFieldText; + Tizen::Base::String __nameEditFieldPreText; + Tizen::Base::String __nameEditFieldTempText; + Tizen::Base::String __originalText; + int __folderIndex; + int __modalMsgBoxResult; + int __textLength; + bool __mountState; + bool __isCreateAlbum; + bool __isKeyPadOpen; + AlbumNameEditorMode __albumNameEditorMode; + Tizen::Ui::Scenes::SceneId __callerSceneId; + Tizen::Ui::Scenes::SceneId __previousSceneId; + Tizen::Ui::Controls::MessageBox* __pMessageBox; + Tizen::Base::Collection::IList* __pMoveIndexList; + FileActionMode __fileActionMode; + FileMoveTimer* __pFileMove; + AlbumListPresentationModel* __pPresentationModel; + FileListPresentationModel* __pFilePresentationModel; +}; + +#endif /* _GL_ALBUM_NAME_EDITOR_FORM_H_ */ diff --git a/inc/GlAlbumRenameEventListener.h b/inc/GlAlbumRenameEventListener.h new file mode 100644 index 0000000..2f916d0 --- /dev/null +++ b/inc/GlAlbumRenameEventListener.h @@ -0,0 +1,32 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumRenameEventListener.h + * @brief This is the header file for GlAlbumRenameEventListener class. + */ + +#ifndef _GL_ALBUM_RENAME_LISTENER_H_ +#define _GL_ALBUM_RENAME_LISTENER_H_ + +class IAlbumRenameEventListener +{ +public: + virtual ~IAlbumRenameEventListener(void) {} + virtual void OnAlbumRenameComplete(void) = 0; +}; + +#endif /* _GL_ALBUM_RENAME_LISTENER_H_ */ diff --git a/inc/GlAllListEditorPanel.h b/inc/GlAllListEditorPanel.h new file mode 100644 index 0000000..873356f --- /dev/null +++ b/inc/GlAllListEditorPanel.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListEditorPanel.h + * @brief This is the header file for AllListEditorPanel class. + */ + +#ifndef _GL_ALL_LIST_EDITOR_PANEL_H_ +#define _GL_ALL_LIST_EDITOR_PANEL_H_ + +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" +#include "GlFileListEditorForm.h" +#include "GlFileOpInvalidateListener.h" +#include "GlThumbnailEventListener.h" + +class FileListPresentationModel; +class FileUpdateTimer; + +class AllListEditorPanel + : public IAlbumEventListener + , public IFileOpInvalidateListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AllListEditorPanel(void); + virtual ~AllListEditorPanel(void); + + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + int GetItemCheckedCount(void) const; + Tizen::Base::Collection::IList* GetItemCheckedIndexListN(void) const; + void OnSelectAllPressed(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, + int index, Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual result OnRequestDelete(void); + virtual result OnRequestMessage(void); + virtual result OnRequestEmail(void); + virtual result OnRequestSlideShow(void); + result OnRequestRotate(RotateMode rotateMode); + void CancelUpdateProgress(void); + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes); + virtual void OnScanDirStart(); + virtual void OnScanDirComplete(); + + void ChangeOrientation(void); +private: + void ResetSelection(void); + void SetButtonState(void); + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pContentIconListView; + Tizen::Ui::Controls::Label* __pLabelSelectCnt; + Tizen::Ui::Controls::Button* __pButtonSelectRegion; + FileUpdateTimer* __pFileUpdateTimer; + FileListEditorForm* __pFileListEditorForm; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_ALL_LIST_EDITOR_PANEL_H_ */ diff --git a/inc/GlAllListPanel.h b/inc/GlAllListPanel.h new file mode 100644 index 0000000..b4e0df7 --- /dev/null +++ b/inc/GlAllListPanel.h @@ -0,0 +1,71 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListPanel.h + * @brief This is the header file for AllListPanel class. + */ + +#ifndef _GL_ALL_LIST_PANEL_H_ +#define _GL_ALL_LIST_PANEL_H_ + +#include +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" +#include "GlThumbnailEventListener.h" + +class FileListPresentationModel; + +class AllListPanel + : public IAlbumEventListener + , public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AllListPanel(void); + virtual ~AllListPanel(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, + int index, Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + void ChangeOrientation(void); + void Refresh(void); + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pContentIconListView;\ + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_ALL_LIST_PANEL_H_ */ diff --git a/inc/GlAllListSelectionPanel.h b/inc/GlAllListSelectionPanel.h new file mode 100644 index 0000000..4329924 --- /dev/null +++ b/inc/GlAllListSelectionPanel.h @@ -0,0 +1,101 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListSelectionPanel.h + * @brief This is the header file for AllListSelectionPanel class. + */ + +#ifndef _GL_ALL_LIST_SELECTION_PANEL_H_ +#define _GL_ALL_LIST_SELECTION_PANEL_H_ + +#include +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" +#include "GlThumbnailEventListener.h" +#include "GlFileOpInvalidateListener.h" + +class FileListPresentationModel; +class FileUpdateTimer; +class CommonUtil; +class FileListEditorForm; + +class AllListSelectionPanel + : public IAlbumEventListener + , public IFileOpInvalidateListener + , public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AllListSelectionPanel(void); + virtual ~AllListSelectionPanel(void); + + result Initialize(void); + + int GetItemCheckedCount(void) const; + Tizen::Base::Collection::IList* GetItemCheckedIndexListN(void) const; + void OnSelectAllPressed(void); + + result OnRequestDelete(void); + result OnRequestMessage(void); + result OnRequestEmail(void); + result OnRequestMoveTo(Tizen::Base::String& destDirectory); + result OnRequestSlideShow(void); + result OnRotateRequested(RotateMode rotateMode); + void CancelUpdateProgress(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, + int index, Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual void OnFileOpInvalidate(enum FileActionMode); + virtual void OnFileOpComplete(enum FileActionMode, enum FileActionCompleteRes); + virtual void OnScanDirStart(); + virtual void OnScanDirComplete(); + void ChangeOrientation(void); + +private: + int GetRealindexFromVirtualIndex(const int virtualIndex) const; + int GetVirtualIndexFromRealIndex(const int realIndex) const; + void ResetSelection(void); + void SetButtonState(void); + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pContentIconListView; + Tizen::Base::Collection::IList* __pSeletedIndexList; + FileListEditorForm* __pFileListEditorForm; + FileUpdateTimer* __pFileUpdateTimer; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_ALL_LIST_SELECTION_PANEL_H_ */ diff --git a/inc/GlBaseForm.h b/inc/GlBaseForm.h new file mode 100644 index 0000000..52f4dde --- /dev/null +++ b/inc/GlBaseForm.h @@ -0,0 +1,43 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlBaseForm.h + * @brief This is the header file for BaseForm class. + */ + +#ifndef _GL_BASE_FORM_H_ +#define _GL_BASE_FORM_H_ + +#include + +class FileListPresentationModel; + +class BaseForm + : public Tizen::Ui::Controls::Form +{ +public: + virtual ~BaseForm(void){}; + +protected: + Tizen::Base::Collection::IList* GetMoveFileIndexList(Tizen::Base::String&, Tizen::Base::Collection::IList*, + FileListPresentationModel*,bool isCopyOp = false); + +protected: + bool _overlayMsg; +}; + +#endif /* _GL_BASE_FORM_H_ */ diff --git a/inc/GlCommonUtil.h b/inc/GlCommonUtil.h new file mode 100644 index 0000000..ec3f072 --- /dev/null +++ b/inc/GlCommonUtil.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlCommonUtil.h + * @brief This is the header file for CommonUtil class. + */ + +#ifndef _GL_COMMON_UTIL_H_ +#define _GL_COMMON_UTIL_H_ + +using namespace Tizen::Base::Runtime; + +class IActionEventListener; + +class CommonUtil +{ +public: + static Tizen::Graphics::Bitmap* GetEmptyThumbnailN(void); + static Tizen::Base::String DurationToTimeString(const long duration); +}; + +#endif /* _GL_COMMON_UTIL_H_ */ diff --git a/inc/GlContentUpdateEventListener.h b/inc/GlContentUpdateEventListener.h new file mode 100644 index 0000000..4056f44 --- /dev/null +++ b/inc/GlContentUpdateEventListener.h @@ -0,0 +1,60 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlContentUpdateEventListener.h + * @brief This is the header file for FileListPresentationModel class. + */ + +#ifndef _GL_CONTENT_UPDATE_EVENT_LISTENER_H_ +#define _GL_CONTENT_UPDATE_EVENT_LISTENER_H_ + +#include + +class ContentUpdateEventListener + : public Tizen::Base::Object + , public Tizen::Content::IContentUpdateEventListener +{ +public: + static ContentUpdateEventListener* GetInstance(void); + void AddContentListener(void); + void RemoveContentListener(void); + bool GetChangeNotificationStatus(); + void SetTimerActive(void); + void ReSetTimerActive(void); + void ResumeOperation(); + Tizen::Base::String GetDirecotyNameFromFullPath(const Tizen::Base::String& fullPath) const; +private: + ContentUpdateEventListener(void); + virtual ~ContentUpdateEventListener(void); + + result Construct(void); + static void CreateInstance(void); + static void DestroyInstance(void); + + virtual void OnContentFileCreated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentFileUpdated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentFileDeleted(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentDirectoryScanCompleted(const Tizen::Base::String& directoryPath, result r); + +private: + static ContentUpdateEventListener* __pContentUpdateEventListener; + Tizen::Content::ContentManager* __pContentManager; + bool __isTimerActive; + bool __changeNotificationReceived; +}; + +#endif /* _GL_CONTENT_UPDATE_EVENT_LISTENER_H_ */ diff --git a/inc/GlDropDownCustomItem.h b/inc/GlDropDownCustomItem.h new file mode 100644 index 0000000..24ba37f --- /dev/null +++ b/inc/GlDropDownCustomItem.h @@ -0,0 +1,65 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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: DropDownCustomItem + *@brief: This class defines common behaviour of Drop down custom Item. + * + */ + +#ifndef _GL_DROPDOWN_CUSTOM_ITEM_H_ +#define _GL_DROPDOWN_CUSTOM_ITEM_H_ + +#include + +enum DropDownItemState +{ + DROP_DOWN_ITEM_STATE_OPENED = 0, + DROP_DOWN_ITEM_STATE_CLOSED +}; + +class DropDownCustomItem + : public Tizen::Ui::Controls::CustomItem +{ +public: + DropDownCustomItem(void); + virtual ~DropDownCustomItem(void); + + result Construct(int width, int height); + + DropDownItemState GetCurState(void) const; + Tizen::Base::String GetMainText(void) const; + Tizen::Base::String GetSubText(void) const; + result Make(int fontsize, int itemHeight); + void SetCurState(const DropDownItemState); + void SetMainText(const Tizen::Base::String& text); + 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; + int __width; + Tizen::Base::String __mainText; + Tizen::Base::String __subText; + }; + +#endif /* _GL_DROPDOWN_CUSTOM_ITEM_H_ */ diff --git a/inc/GlFileListEditorForm.h b/inc/GlFileListEditorForm.h new file mode 100644 index 0000000..b25d965 --- /dev/null +++ b/inc/GlFileListEditorForm.h @@ -0,0 +1,110 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListEditorForm.h + * @brief This is the header file for FileListEditorForm class. + */ + +#ifndef _GL_FILE_LIST_EDITOR_FORM_H_ +#define _GL_FILE_LIST_EDITOR_FORM_H_ + +#include +#include "GlBaseForm.h" +#include "GlFileMoveTimer.h" +#include "GlSlideSettingListener.h" + +class FileListPresentationModel; +class FileMoveTimer; +class ISlideSettingListener; +class SlideShowPopUp; + +class FileListEditorForm + : public BaseForm + , public IFileOpInvalidateListener + , public IFormContentUpdateEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public ISlideSettingListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IPropagatedKeyEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + FileListEditorForm(void); + virtual ~FileListEditorForm(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnContentUpdated(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + void SetTitleText(const Tizen::Base::String& titleText); + void SetProgressState(const bool progressState); + void RefreshFolderList(void); + void SetFooterButtonsState(const bool enableState); + result MoveToAlbum(const Tizen::Base::String& destDirectory); + + bool GetOverlayStatus(void) const; + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes); + virtual void OnScanDirStart(); + virtual void OnScanDirComplete(); + + virtual void OnSlideSettingPopUpItemSelected(int index); + + 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 void OnFormMenuRequested (Tizen::Ui::Controls::Form &source); + + virtual void ShowAnimation(void); + virtual void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + virtual void StopAnimation(void); + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false; } + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false; } + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false; } + +private: + result InitializeFooter(void); + Tizen::Base::String GetDirecotyNameFromFullPath(const Tizen::Base::String& fullPath) const; + result SetUpPopup(void); + void SelectAllPressed(void); + +private: + Tizen::Ui::Controls::ContextMenu* __pShareContextMenu; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + Tizen::Ui::Controls::Popup* __pDeletePopup; + Tizen::Graphics::Point __morePosition; + Tizen::Base::Collection::IList* __pContentDirectoryList; + Tizen::Base::Collection::IList* __pContentDirectoryNameList; + SlideShowPopUp* __pPopUp; + FileMoveTimer* __pFileMove; + bool __isCopyOperation; + FileListPresentationModel* __pPresentationModel; + bool __isScanProgress; +}; + +#endif /* _GL_FILE_LIST_EDITOR_FORM_H_ */ diff --git a/inc/GlFileListForm.h b/inc/GlFileListForm.h new file mode 100644 index 0000000..01d2022 --- /dev/null +++ b/inc/GlFileListForm.h @@ -0,0 +1,82 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListForm.h + * @brief This is the header file for FileListForm class. + */ + +#ifndef _GL_FILE_LIST_FORM_H_ +#define _GL_FILE_LIST_FORM_H_ + +#include +#include +#include "GlFormContentUpdateEventListener.h" +#include "GlSlideSettingListener.h" + +class FileListPresentationModel; +class ISlideSettingListener; +class SlideShowPopUp; + +class FileListForm + : public IFormContentUpdateEventListener + , public ISlideSettingListener + , public Tizen::App::IAppControlResponseListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::IOrientationEventListener +{ +public: + FileListForm(void); + virtual ~FileListForm(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnContentUpdated(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + void SetTitleText(const Tizen::Base::String& titleText); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnSlideSettingPopUpItemSelected(int index); + + virtual void OnFormMenuRequested (Tizen::Ui::Controls::Form &source); + + void SetMenuState(bool state); + virtual void ShowAnimation(void){} + virtual void StopAnimation(void){} + +private: + result InitializeFooter(void); + +private: + bool __menuState; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + SlideShowPopUp* __pPopUp; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_FILE_LIST_FORM_H_ */ diff --git a/inc/GlFileListPresentationModel.h b/inc/GlFileListPresentationModel.h new file mode 100644 index 0000000..a16bf46 --- /dev/null +++ b/inc/GlFileListPresentationModel.h @@ -0,0 +1,164 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListPresentationModel.h + * @brief This is the header file for FileListPresentationModel class. + */ + +#ifndef _GL_FILE_LIST_PRESENTATION_MODEL_H_ +#define _GL_FILE_LIST_PRESENTATION_MODEL_H_ + +#include +#include + +#include "GlAlbumEventListener.h" +#include "GlFormContentUpdateEventListener.h" +#include "GlCommonUtil.h" +#include "GlIContentFileUpdateManager.h" +#include "GlResourceManager.h" +#include "GlThumbnailEventListener.h" +#include "GlTypes.h" + +class ThumbnailEvent; +class ThumbnailInfo; +class ThumbnailProvider; + +class FileListPresentationModel + : public IContentFileUpdateManager + , public IThumbnailEventListener + , public Tizen::Base::Object + , public Tizen::System::IDeviceEventListener +{ +public: + static FileListPresentationModel* GetInstance(void); + +public: + result GetThumbnailInSyncCacheN(const int index, Tizen::Base::String*& pName, + Tizen::Graphics::Bitmap*& pThumbnail); + result GetThumbnailVideoInSyncCacheN(const int index, Tizen::Base::String*& pName, + Tizen::Graphics::Bitmap*& pThumbnail, Tizen::Base::String*& pDuration) const; + virtual void RequestThumbnail(const int index); + virtual void RequestThumbnail(const Tizen::Content::ContentId& contentId); + void ClearThumbnailRequests(const bool appTerminating = false); + + static void AddPresentationModelListener(const IAlbumEventListener* listener); + static void RemovePresentationModelListener(const IAlbumEventListener& listener); + + virtual void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state); + + static void AddContentEventListener(const IFormContentUpdateEventListener* listener); + static void RemoveContentEventListener(const IFormContentUpdateEventListener* listener); + + result DeleteContentFileList(const Tizen::Base::Collection::IList& contentIndexList); + Tizen::Base::Collection::IList* GetCollisionIndexListN(const Tizen::Base::Collection::IList& contentIndexList, + const Tizen::Base::String& destDirectory); + result MoveToContentFileList(const Tizen::Base::Collection::IList& contentIndexList, + const Tizen::Base::String& destDirectory); + result StartAppControl(const Tizen::Base::String& providerId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, + const Tizen::Base::Collection::HashMap* pDataList, Tizen::App::IAppControlResponseListener* pListener); + result SetCurrentAlbumInfo(const Tizen::Base::String& albumName, + const Tizen::Base::Collection::IList& directoryList); + result RefreshCurrentAlbumContentInfoList(const Tizen::Content::ContentType contentType); + Tizen::Base::String GetCurrentAlbumName(void) const; + void SetCurrentAlbumName(const Tizen::Base::String& albumName); + Tizen::Content::ContentType GetCurrentAlbumContentType(void) const; + void SetCurrentAlbumContentType(const Tizen::Content::ContentType contentType); + Tizen::Base::Collection::IList* GetAlbumDirectoryListN(void) const; + Tizen::Base::Collection::IList* GetAlbumContentInfoList(void) const; + Tizen::Content::ContentInfo* GetContentInfo(const int index) const; + int GetCurrentAlbumContentInfoCount(void) const; + Tizen::Content::ContentId GetContentInfoIndex(const int index) const; + Tizen::Base::String GetContentFilePath(const int index) const; + Tizen::Base::String ConvertToAlbumName(const Tizen::Base::String& targetPath) const; + + virtual Tizen::Base::Collection::IList* GetContentIdListAtIndexN(const Tizen::Base::Collection::IList& indexList) const; + + AppControlMode GetAppControlMode(void) const; + AppControlMediaType GetAppControlMediaType(void) const; + AppControlSelectionMode GetAppControlSelectionMode(void) const; + void SetUpdateProgressStatus(const bool status); + + void OnContentCreated(void); + void OnContentUpdated(void); + void OnContentDeleted(void); + void OnContentUpdated(const Tizen::Content::ContentId& contentId); + + virtual result RotateImage(const Tizen::Content::ContentId& contentId, RotateMode rotateMode); + + void ClearImageCache(void); + void ShowAnimation(void); + void StopAnimation(void); + void ClearProviderId(void); + void AddDirectoryIfNew(const Tizen::Base::String& fullPath); +private: + FileListPresentationModel(void); + virtual ~FileListPresentationModel(void); + FileListPresentationModel(FileListPresentationModel& value); + FileListPresentationModel& operator=(FileListPresentationModel&); + + result Construct(void); + static void CreateInstance(void); + static void DestroyInstance(void); + + result RefreshContentInfoList(const Tizen::Content::ContentType contentType); + Tizen::Base::String GetFileNameFromFullPath(const Tizen::Base::String& fullPath, const bool withExt) const; + Tizen::Base::String GetDirecotyNameFromFullPath(const Tizen::Base::String& fullPath) const; + bool IsContainContentInDirectory(const Tizen::Base::String& directoryPath, + Tizen::Content::ContentType contentType) const; + ThumbnailInfo* GetThumbnailInfoFromInternalBufferN(const Tizen::Content::ContentId& contentId) const; + Tizen::Graphics::Bitmap* CoverVideoOverlayedImageOnThumbnailN(Tizen::Graphics::Bitmap& thumbnail, + const ThumbnailInfo& thumbmailInfo); + result DeleteContentFile(const Tizen::Base::String& filePath); + result MoveToContentFile(const Tizen::Base::String& filePath, + const Tizen::Base::String& destDirectory, const bool isCopyOperation); + Tizen::Graphics::Bitmap* GetShadedBackgroundBitmapN(Tizen::Graphics::Bitmap& bgBitmap, + const Tizen::Graphics::Bitmap& orgBitmap, const Tizen::Graphics::Rectangle& orgBitmapPosition) const; + Tizen::Base::Collection::IList* GetContentInfoListInDirectoryListN( + const Tizen::Base::Collection::IList& contentDirectoryList, + Tizen::Content::ContentType contentType) const; + + virtual void OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg); + + void OnTimerExpired(Timer& timer); + +private: + static FileListPresentationModel* __pPresentationModelInstance; + static ThumbnailProvider* __pThumbnailProvider; + static ThumbnailEvent* __pThumbnailEvent; + Tizen::Content::ContentManager* __pContentManager; + static Tizen::Base::Collection::ArrayList* __pPresentationModelListener; + static Tizen::Base::Collection::ArrayList* __pContentEventListener; + static Tizen::Base::Collection::ArrayList* __pIconListViewCache; + static Tizen::Base::Collection::IList* __pDirectoryList; + static Tizen::Base::Collection::IList* __pContentInfoList; + + Tizen::Base::String __albumName; + Tizen::Base::String __providerId; + Tizen::Content::ContentType __albumContentType; + AppControlMode __appControlMode; + AppControlMediaType __appControlMediaType; + AppControlSelectionMode __appControlSelectionMode; + + Tizen::Base::Collection::IList * __pContentIdList; + bool __updateProgressStatus; + + friend class FileMoveTimer; + friend class FileUpdateTimer; +}; + +#endif /* _GL_FILE_LIST_PRESENTATION_MODEL_H_ */ diff --git a/inc/GlFileMoveTimer.h b/inc/GlFileMoveTimer.h new file mode 100644 index 0000000..7420769 --- /dev/null +++ b/inc/GlFileMoveTimer.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 FileMoveTimer.h + * @brief This is the header file for FileMoveTimer class. + */ + +#ifndef _GL_FILE_MOVE_TIMER_H_ +#define _GL_FILE_MOVE_TIMER_H_ + +#include +#include "GlTimerBase.h" + +class FileListPresentationModel; + +class FileMoveTimer + : public GlTimerBase +{ +public : + FileMoveTimer(Tizen::Base::String&, Tizen::Base::Collection::IList*, FileListPresentationModel*, + IFileOpInvalidateListener*, bool isCopyOperation = false); + virtual ~FileMoveTimer(void); + + void SetCopy(void); + void ClearCopy(void); + +private: + virtual Tizen::Base::Collection::IList* TimerStart(void); + virtual result TimerExpired(const Tizen::Base::Object* contentId); + virtual void TimerCancel(int, enum FileActionCancelRes res); + virtual void TimerComplete(int, enum FileActionCompleteRes res); + result ScanDirectories(void); + virtual int GetDirScanCount(); + void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state); + +private : + Tizen::Base::Collection::IList* __pMoveIndexList; + Tizen::Base::String __moveToDir; + bool __isCopyOperation; + FileListPresentationModel* __pPresentationModel; + Tizen::Base::Collection::HashMap __scanDirMap; + Tizen::Content::ContentManager* __pContentManager; +}; + +#endif //_GL_FILE_MOVE_TIMER_H_ diff --git a/inc/GlFileOpInvalidateListener.h b/inc/GlFileOpInvalidateListener.h new file mode 100644 index 0000000..01e0398 --- /dev/null +++ b/inc/GlFileOpInvalidateListener.h @@ -0,0 +1,37 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileOpInvalidateListener.h + * @brief This is the header file for FileOpInvalidateListener class. + */ + +#ifndef _GL_FILE_OP_INVALIDATE_LISTENER_H_ +#define _GL_FILE_OP_INVALIDATE_LISTENER_H_ + +#include "GlTypes.h" + +class IFileOpInvalidateListener +{ +public: + virtual ~IFileOpInvalidateListener(void){} + virtual void OnFileOpInvalidate(enum FileActionMode) = 0; + virtual void OnFileOpComplete(enum FileActionMode, enum FileActionCompleteRes) = 0; + virtual void OnScanDirStart() = 0; + virtual void OnScanDirComplete() = 0; +}; + +#endif /* _GL_FILE_OP_INVALIDATE_LISTENER_H_ */ diff --git a/inc/GlFileUpdateTimer.h b/inc/GlFileUpdateTimer.h new file mode 100644 index 0000000..11912f6 --- /dev/null +++ b/inc/GlFileUpdateTimer.h @@ -0,0 +1,54 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileUpdateTimer.h + * @brief This is the header file for FileUpdateTimer class. + */ +#ifndef _GL_FILE_UPDATE_TIMER_H_ +#define _GL_FILE_UPDATE_TIMER_H_ + +#include +#include "GlTimerBase.h" + +class FileListPresentationModel; +class IContentFileUpdateManager; + +class FileUpdateTimer + : public GlTimerBase +{ +public: + FileUpdateTimer(Tizen::Base::Collection::IList*, IContentFileUpdateManager*, IFileOpInvalidateListener*, FileActionMode, RotateMode rotateMode = ROTATE_MODE_RIGHT); + virtual ~FileUpdateTimer(void); + +private: + virtual Tizen::Base::Collection::IList * TimerStart(void); + virtual result TimerExpired(const Tizen::Base::Object* contentId); + virtual result ScanDirectories(void); + virtual int GetDirScanCount(); + void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state); + virtual void TimerCancel(int, enum FileActionCancelRes res); + virtual void TimerComplete(int, enum FileActionCompleteRes res); + +private : + Tizen::Base::Collection::IList* __pUpdateIndexList; + IContentFileUpdateManager* __pFileUpdateManager; + RotateMode __rotateMode; + Tizen::Base::Collection::HashMap __scanDirMap; + Tizen::Content::ContentManager* __pContentManager; +}; + +#endif // _GL_FILE_UPDATE_TIMER_H_ diff --git a/inc/GlFormContentUpdateEventListener.h b/inc/GlFormContentUpdateEventListener.h new file mode 100644 index 0000000..6b4c443 --- /dev/null +++ b/inc/GlFormContentUpdateEventListener.h @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFormContentUpdateEventListener.h + * @brief This is the header file for ContentEventListener class. + */ + +#ifndef _GL_CONTENT_EVENT_LISTENER_H_ +#define _GL_CONTENT_EVENT_LISTENER_H_ + +class ProgressAnimation; + +class IFormContentUpdateEventListener + : public Tizen::Base::Runtime::IEventListener + , public Tizen::Base::Object +{ +public: + virtual ~IFormContentUpdateEventListener(void){}; + virtual void OnContentUpdated() = 0; + virtual void ShowAnimation(void) = 0; + virtual void StopAnimation(void) = 0; +protected: + ProgressAnimation* _pProgressAnim; +}; + +#endif /* _GL_CONTENT_EVENT_LISTENER_H_ */ diff --git a/inc/GlFormFactory.h b/inc/GlFormFactory.h new file mode 100644 index 0000000..a072a00 --- /dev/null +++ b/inc/GlFormFactory.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFormFactory.h + * @brief This is the header file for FormFactory class. + */ + +#ifndef _GL_FORM_FACTORY_H_ +#define _GL_FORM_FACTORY_H_ + +class FormFactory + : public Tizen::Ui::Scenes::IFormFactory +{ +public: + FormFactory(void); + virtual ~FormFactory(void); + + virtual Tizen::Ui::Controls::Form* CreateFormN(const Tizen::Base::String& formId, + const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif /* _GL_FORM_FACTORY_H_ */ diff --git a/inc/GlGalleryApp.h b/inc/GlGalleryApp.h new file mode 100644 index 0000000..3ded69e --- /dev/null +++ b/inc/GlGalleryApp.h @@ -0,0 +1,76 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlGalleryApp.h + * @brief This is the header file for GalleryApp class. + */ + +#ifndef _GL_GALLERY_APP_H_ +#define _GL_GALLERY_APP_H_ + +#include +#include +#include "GlTypes.h" + +class AlbumListPresentationModel; +class FileListPresentationModel; + +class GalleryApp + : public Tizen::App::UiApp + , public Tizen::App::IAppControlProviderEventListener + , public Tizen::System::ISettingEventListener +{ +public: + static Tizen::App::UiApp* CreateInstance(void); + +public: + GalleryApp(void); + virtual ~GalleryApp(void); + + Tizen::Base::String GetAppControlOperationId(void) const; + Tizen::Base::String GetUriData(void) const; + Tizen::Base::String GetMimeType(void) const; + const Tizen::Base::Collection::IMap* GetAppControlArguments(void) const; + void SendAppControlResult(const Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + virtual bool OnAppInitialized(void); + virtual bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + virtual void OnForeground(void); + + virtual void OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriScheme, const Tizen::Base::String* pDataType, + const Tizen::Base::Collection::IMap* pArgs); + + virtual void OnSettingChanged(Tizen::Base::String& key); + + void SetFrameEnabled(const bool enabled); + void SetFrameActivated(bool frameActivated); + bool GetFrameActivated(void) const; + +private: + RequestId __requestId; + Tizen::Base::String __operationId; + Tizen::Base::String __uriData; + Tizen::Base::String __mimeType; + const Tizen::Base::Collection::HashMap* __pArguments; + Tizen::App::AppCtrlResult __appControlResult; + bool __frameActivated; +}; + +#endif /* _GL_GALLERY_APP_H_ */ diff --git a/inc/GlIContentFileUpdateManager.h b/inc/GlIContentFileUpdateManager.h new file mode 100644 index 0000000..be831da --- /dev/null +++ b/inc/GlIContentFileUpdateManager.h @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlIContentFileUpdateManager.h + * @brief This is the header file for IContentFileDeleteManager class. + */ + +#ifndef _GL_ICONTENT_FILE_UPDATE_MANAGER_H_ +#define _GL_ICONTENT_FILE_UPDATE_MANAGER_H_ + +#include "GlTypes.h" + +class IContentFileUpdateManager +{ +public: + IContentFileUpdateManager(){} + virtual ~IContentFileUpdateManager(){} + + virtual Tizen::Base::Collection::IList* GetContentIdListAtIndexN(const Tizen::Base::Collection::IList& indexList) const = 0; + virtual result DeleteContentFile(const Tizen::Base::String& filePath) = 0; + virtual result RotateImage(const Tizen::Content::ContentId& contentId, RotateMode rotateMode) = 0; + virtual void RequestThumbnail(const int index) = 0; + virtual void RequestThumbnail(const Tizen::Content::ContentId& contentId) = 0; +}; + +#endif /* _GL_ICONTENT_FILE_UPDATE_MANAGER_H_ */ diff --git a/inc/GlImageCropForm.h b/inc/GlImageCropForm.h new file mode 100644 index 0000000..ef1fef5 --- /dev/null +++ b/inc/GlImageCropForm.h @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageCropForm.h + * @brief This is the implementation file for Image Crop. + */ + +#ifndef _GL_IMAGE_CROP_H_ +#define _GL_IMAGE_CROP_H_ + +#include +#include + +#include "GlFileListPresentationModel.h" + +enum TouchLocation +{ + INSIDE_CROPBOX = 0, + OUTSIDE_CROPBOX, + INSIDE_TOP_RECTANGLE, + INSIDE_BOTTOM_RECTANGLE, + INSIDE_LEFT_RECTANGLE, + INSIDE_RIGHT_RECTANGLE, + INSIDE_TOP_LEFT_RECTANGLE, + INSIDE_TOP_RIGHT_RECTANGLE, + INSIDE_BOTTOM_LEFT_RECTANGLE, + INSIDE_BOTTOM_RIGHT_RECTANGLE, +}; + +class ImageCropForm + : public IFormContentUpdateEventListener + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ImageCropForm(void); + ~ImageCropForm(void); + + bool Initialize(void); + void CheckCurrentPosition(const Tizen::Graphics::Point currentPosition); + void SetValue(void); + Tizen::Base::String GetFileName(const Tizen::Base::String& filePath, bool isCheckExe = false) const; + + virtual result OnInitializing(void); + virtual result OnDraw(void); + + virtual void OnContentUpdated(void); + virtual void ShowAnimation(void){}; + virtual void StopAnimation(void){}; + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus); + + 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 OnTouchMoved(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 OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + + 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); + +private: + Tizen::Base::String __sourceFilePath; + Tizen::Base::String __cropMode; + Tizen::Graphics::Canvas* __pCanvas; + Tizen::Graphics::Bitmap* __pCurrentBitmap; + Tizen::Graphics::Bitmap* __pRectangleBitmap; + Tizen::Graphics::Point __touchStart; + Tizen::Graphics::Rectangle __cropBox; + Tizen::Graphics::Rectangle __imageBox; + Tizen::Media::ImageBuffer* __imageBuffer; + Tizen::Media::ImageFormat __imageFormat; + TouchLocation __pointLocation; + bool __isOrientationChanged; + int __imageHeight; + int __imageWidth; + int __statusValue; + int __formHeight; + int __formWidth; + int __skipMoveEvent; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_IMAGE_CROP_H_ */ diff --git a/inc/GlImageListEditorPanel.h b/inc/GlImageListEditorPanel.h new file mode 100644 index 0000000..5c113f8 --- /dev/null +++ b/inc/GlImageListEditorPanel.h @@ -0,0 +1,88 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageListEditorPanel.h + * @brief This is the header file for ImageListEditorPanel class. + */ + +#ifndef _GL_IMAGE_LIST_EDITOR_PANEL_H_ +#define _GL_IMAGE_LIST_EDITOR_PANEL_H_ + +#include "GlAlbumEventListener.h" +#include "GlThumbnailEventListener.h" +#include "GlFileOpInvalidateListener.h" +#include "GlFileListEditorForm.h" + +class FileListPresentationModel; +class FileUpdateTimer; + +class ImageListEditorPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener + , public IAlbumEventListener + , public IFileOpInvalidateListener +{ +public: + ImageListEditorPanel(void); + virtual ~ImageListEditorPanel(void); + + result Initialize(void); + + void OnSelectAllPressed(void); + void OnRequestAppExitWithMultipleSelectionAppControlResult(void); + int GetItemCheckedCount(void) const; + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + void SetButtonState(void); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, int index, + Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes); + virtual void OnScanDirStart(){} + virtual void OnScanDirComplete(){} + void ChangeOrientation(void); + +private: + Tizen::Base::Collection::IList* GetItemCheckedIndexListN(void) const; + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pContentIconListView; + Tizen::Ui::Controls::CheckButton* __pCheckButton; + Tizen::Ui::Controls::Label* __pLabelSelectCnt; + FileListPresentationModel* __pPresentationModel; + FileListEditorForm* __pFileListEditorForm; +}; + +#endif /* _GL_IMAGE_LIST_EDITOR_PANEL_H_ */ diff --git a/inc/GlImageListPanel.h b/inc/GlImageListPanel.h new file mode 100644 index 0000000..ad51432 --- /dev/null +++ b/inc/GlImageListPanel.h @@ -0,0 +1,67 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageListPanel.h + * @brief This is the header file for ImageListPanel class. + */ + +#ifndef _GL_IMAGE_LIST_PANEL_H_ +#define _GL_IMAGE_LIST_PANEL_H_ + +#include "GlAlbumEventListener.h" +#include "GlThumbnailEventListener.h" + +class FileListPresentationModel; + +class ImageListPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IIconListViewItemEventListener + , public Tizen::Ui::Controls::IIconListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener + , public IAlbumEventListener +{ +public: + ImageListPanel(void); + virtual ~ImageListPanel(void); + + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnIconListViewItemStateChanged (Tizen::Ui::Controls::IconListView &view, int index, + Tizen::Ui::Controls::IconListViewItemStatus status); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::IconListViewItem* CreateItem(int index); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::IconListViewItem* pItem); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + +private: + int __itemCount; + Tizen::Ui::Controls::IconListView* __pContentIconListView; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_IMAGE_LIST_PANEL_H_ */ diff --git a/inc/GlMainFrame.h b/inc/GlMainFrame.h new file mode 100644 index 0000000..f18ca45 --- /dev/null +++ b/inc/GlMainFrame.h @@ -0,0 +1,41 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlMainFrame.h + * @brief This is the header file for MainFrame class. + */ + +#ifndef _GL_MAIN_FRAME_H_ +#define _GL_MAIN_FRAME_H_ + +class MainFrame + : public Tizen::Ui::Controls::Frame + , public Tizen::Ui::Controls::IFrameEventListener +{ +public: + MainFrame(void); + virtual ~MainFrame(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnFrameActivated(const Tizen::Ui::Controls::Frame& source); + virtual void OnFrameDeactivated(const Tizen::Ui::Controls::Frame& source){} + virtual void OnFrameTerminating(const Tizen::Ui::Controls::Frame& source){} +}; + +#endif /* _GL_MAIN_FRAME_H_ */ diff --git a/inc/GlPanelFactory.h b/inc/GlPanelFactory.h new file mode 100644 index 0000000..394b981 --- /dev/null +++ b/inc/GlPanelFactory.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlPanelFactory.h + * @brief This is the header file for PanelFactory class. + */ + +#ifndef _GL_PANEL_FACTORY_H_ +#define _GL_PANEL_FACTORY_H_ + +#include + +class PanelFactory + : public Tizen::Ui::Scenes::IPanelFactory +{ +public: + PanelFactory(void); + virtual ~PanelFactory(void); + + virtual Tizen::Ui::Controls::Panel* CreatePanelN(const Tizen::Base::String& panelId, + const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif /* _GL_PANEL_FACTORY_H_ */ diff --git a/inc/GlProgressAnimation.h b/inc/GlProgressAnimation.h new file mode 100644 index 0000000..1a09226 --- /dev/null +++ b/inc/GlProgressAnimation.h @@ -0,0 +1,48 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlProgressAnimation.h + * @brief This is the header file for GlProgressAnimation class. + */ + +#ifndef _GL_PROGRESS_ANIMATION_H_ +#define _GL_PROGRESS_ANIMATION_H_ + +#include + +class ProgressAnimation + : public Tizen::Ui::Controls::Panel +{ +public: + ProgressAnimation(void); + virtual ~ProgressAnimation(void); + + result Construct(Tizen::Graphics::Rectangle rect); + + void AnimationStart(void); + void AnimationStop(void); + void ChangeOrientation(Tizen::Graphics::Rectangle rect); + +private: + static const int DURATION = 500; + static const int PROGRESS_COUNT = 30; + + Tizen::Ui::Controls::Animation* __pAnimation; + Tizen::Base::Collection::ArrayList* __pAnimationFrameList; +}; + +#endif /* _GL_PROGRESS_ANIMATION_H_ */ diff --git a/inc/GlProgressBar.h b/inc/GlProgressBar.h new file mode 100644 index 0000000..bfd714f --- /dev/null +++ b/inc/GlProgressBar.h @@ -0,0 +1,53 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlProgressBar.h + * @brief This is the header file for GlProgressBar class. + */ + +#ifndef _GL_PROGRESS_BAR_H_ +#define _GL_PROGRESS_BAR_H_ + +#include "GlTypes.h" + +class GlProgressBar +{ +public: + GlProgressBar(Tizen::Ui::IActionEventListener* listener,Tizen::Ui::IPropagatedKeyEventListener* __pPropagatedListener); + virtual ~GlProgressBar(void); + + void HideFileProgressingPopup(void); + void ShowFileProgressingPopup(const int val, enum FileActionMode action); + void IncProgress(const int count); + +private: + result CreateFileProgressingPopup(void); + +private: + int __totalVal; + int __curVal; + Tizen::Ui::Controls::Popup* __pFileProgressingPopup; + Tizen::Ui::Controls::Progress* __pFileProgressingProgress; + Tizen::Ui::Controls::Label* __pFileProgressingHeaderLabel; + Tizen::Ui::Controls::Label* __pFileProgressingLabel; + Tizen::Ui::Controls::Label* __pFileCounterLabel; + Tizen::Ui::Controls::Button* __pFileProgressingCancelButton; + Tizen::Ui::IActionEventListener* __pActionListener; + Tizen::Ui::IPropagatedKeyEventListener* __pPropagatedListener; +}; + +#endif /* _GL_PROGRESS_BAR_H_ */ diff --git a/inc/GlRadioCustomItem.h b/inc/GlRadioCustomItem.h new file mode 100644 index 0000000..7dabb8e --- /dev/null +++ b/inc/GlRadioCustomItem.h @@ -0,0 +1,52 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 IntRadioCustomItem.h + *@brief The RadioCustomItem defines radio custom item. + * + */ + +#ifndef _GL_RADIO_CUSTOM_ITEM_H_ +#define _GL_RADIO_CUSTOM_ITEM_H_ + +#include "GlTypes.h" + +class RadioCustomItem + : public Tizen::Ui::Controls::CustomItem +{ +public: + RadioCustomItem(void); + virtual ~RadioCustomItem(void); + + result Construct(int width, int height); + Tizen::Base::String GetText(void) const; + result Make(int fontSize); + void SetText(const Tizen::Base::String& text); + + +protected: + static const int IDA_FORMAT_STRING; + static const int IDA_FORMAT_RADIO_BUTTON; + +private: + bool __isSelected; + int __width; + int __height; + Tizen::Base::String __text; +}; + +#endif /* _GL_RADIO_CUSTOM_ITEM_H_ */ diff --git a/inc/GlResourceManager.h b/inc/GlResourceManager.h new file mode 100644 index 0000000..44cf2cc --- /dev/null +++ b/inc/GlResourceManager.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlResourceManager.h + * @brief This is the header file for ResourceManager class. + */ + +#ifndef _GL_RESOURCE_MANAGER_H_ +#define _GL_RESOURCE_MANAGER_H_ + +#include + +class ResourceManager +{ +public: + static Tizen::Graphics::Bitmap* GetBitmapN(const Tizen::Base::String& id); + static Tizen::Base::String GetString(const Tizen::Base::String& id); + +private: + ResourceManager(void); + virtual ~ResourceManager(void); +}; + +#endif /* _GL_RESOURCE_MANAGER_H_ */ diff --git a/inc/GlSettingMainForm.h b/inc/GlSettingMainForm.h new file mode 100644 index 0000000..a8a0373 --- /dev/null +++ b/inc/GlSettingMainForm.h @@ -0,0 +1,128 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSettingMainForm.h + * @brief This is the header file for SettingMainForm class. + */ + +#ifndef _GL_SETTING_MAIN_FORM_H_ +#define _GL_SETTING_MAIN_FORM_H_ + +#include "GlFormContentUpdateEventListener.h" + +enum SettingListItemType +{ + ITEM_TYPE_NORMAL = 0, + ITEM_TYPE_TOGGLE, + ITEM_TYPE_DROPDOWN, + ITEM_TYPE_RADIO, +}; + +enum +{ + SETTING_INVALID = -1, + SETTING_SLIDESHOW_INTERVAL_TITLE = 0, + SETTING_INTERVAL_2, + SETTING_INTERVAL_3, + SETTING_INTERVAL_5, + SETTING_INTERVAL_10, + SETTING_INTERVAL_20, + SETTING_REPEAT, + SETTING_SHUFFLE, + SETTING_TRANSITION_EFFECT_TITLE, + SETTING_TRANSITION_PAGE, + SETTING_TRANSITION_DISSOLVE, + SETTING_TRANSITION_ZOOM, + SETTING_MAX +}; + +class SettingPresentationModel; + +class SettingMainForm + : public IFormContentUpdateEventListener + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemEventListener + , public Tizen::Ui::Controls::IGroupedListViewItemProvider + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::System::ISettingEventListener + +{ +public: + SettingMainForm(void); + virtual ~SettingMainForm(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnContentUpdated(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + 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){}; + + virtual int GetGroupCount(void); + virtual int GetItemCount(int groupIndex); + virtual Tizen::Ui::Controls::GroupItem* CreateGroupItem(int groupIndex, int itemWidth); + virtual bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::GroupItem* pItem, int itemWidth); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int groupIndex, int itemIndex, int itemWidth); + virtual bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + 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 void OnSettingChanged(Tizen::Base::String& key); + virtual void ShowAnimation(void){} + virtual void StopAnimation(void){} + class SettingItemInfo + { + public: + SettingItemInfo(void); + virtual ~SettingItemInfo(void){}; + + public: + int childCount; + bool isOpen; + bool isSelected; + SettingListItemType itemType; + Tizen::Base::String titleText; + Tizen::Base::String subText; + }; + + int* pGroupItemCount; + SettingItemInfo settingInfo[SETTING_MAX]; + +private: + void InitializeSettingValues(void); + +private: + Tizen::Ui::Controls::GroupedListView* __pList; + SettingPresentationModel* __pPresentationModel; + bool __contentUpdated; +}; + +#endif /* _GL_SETTING_MAIN_FORM_H_ */ diff --git a/inc/GlSettingPresentationModel.h b/inc/GlSettingPresentationModel.h new file mode 100644 index 0000000..96d1947 --- /dev/null +++ b/inc/GlSettingPresentationModel.h @@ -0,0 +1,62 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSettingPresentationModel.h + * @brief This is the header file for SettingPresentationModel class. + */ + +#ifndef _GL_SETTING_PRESENTATION_MODEL_H_ +#define _GL_SETTING_PRESENTATION_MODEL_H_ + +#include +#include + +class SettingPresentationModel + : public Tizen::Base::Object +{ +public: + static SettingPresentationModel* GetInstance(void); + +public: + result GetValue(const Tizen::Base::String& strSectionName, const Tizen::Base::String& entryName, + int& value) const; + result GetValue(const Tizen::Base::String& strSectionName, const Tizen::Base::String& entryName, + Tizen::Base::String& value) const; + result SetValue(const Tizen::Base::String& strSectionName, const Tizen::Base::String& entryName, int value); + result SetValue(const Tizen::Base::String& strSectionName, const Tizen::Base::String& entryName, + const Tizen::Base::String& value); + + result CreateDefaultRegistry(void); + + void DeleteRegistry(void); +private: + SettingPresentationModel(void); + virtual ~SettingPresentationModel(void); + SettingPresentationModel(SettingPresentationModel& value); + SettingPresentationModel& operator=(SettingPresentationModel&); + + result Construct(void); + static void CreateInstance(void); + static void DestroyInstance(void); + + +private: + Tizen::Io::Registry* __pDefaultGalleryRegistry; + static SettingPresentationModel* __pPresentationModelInstance; +}; + +#endif /* _GL_SETTING_PRESENTATION_MODEL_H_ */ diff --git a/inc/GlSettingToggleCustomItem.h b/inc/GlSettingToggleCustomItem.h new file mode 100644 index 0000000..39df99b --- /dev/null +++ b/inc/GlSettingToggleCustomItem.h @@ -0,0 +1,96 @@ +// + +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSettingToggleCustomItem.h + * @brief The SettingToggleCustomItem used to toggle the item. + */ + +#ifndef _INT_SETTING_TOGGLE_CUSTOM_ITEM_H_ +#define _INT_SETTING_TOGGLE_CUSTOM_ITEM_H_ + +#include "GlTypes.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) const; + + /** + * @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(int fontSize); + + /** + * @brief The method used to set the text of CustomItem + */ + + void SetText(const Tizen::Base::String& text); + +private: + int __width; ///Width of the SettingToggleCustomItem Instance + int __height; ///Height 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/GlSlideSettingListener.h b/inc/GlSlideSettingListener.h new file mode 100644 index 0000000..ad35c63 --- /dev/null +++ b/inc/GlSlideSettingListener.h @@ -0,0 +1,34 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlISlideSettingListener.h + * @brief This is the header file for ISlideSettingListener class. + */ + +#ifndef _GL_SLIDE_SETTING_LISTENER_H_ +#define _GL_SLIDE_SETTING_LISTENER_H_ + +class ISlideSettingListener +{ +public: + ISlideSettingListener(void){}; + virtual ~ISlideSettingListener(void) {}; + + virtual void OnSlideSettingPopUpItemSelected(int index) = 0; +}; + +#endif /* _GL_SLIDE_SETTING_LISTENER_H_ */ diff --git a/inc/GlSlideShowPopUp.h b/inc/GlSlideShowPopUp.h new file mode 100644 index 0000000..af9adee --- /dev/null +++ b/inc/GlSlideShowPopUp.h @@ -0,0 +1,74 @@ +// +// Tizen Native SDK +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSlideShowPopUp.h + * @brief This header file contains the declarations of the SlideShowPopUp + * + */ + +#ifndef _GL_SLIDE_SHOW_POPUP_H_ +#define _GL_SLIDE_SHOW_POPUP_H_ + +#include + +class ISlideSettingListener; + +class SlideShowPopUp + : public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::Popup + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + SlideShowPopUp(void); + virtual ~SlideShowPopUp(void); + + bool Initialize(void); + virtual result OnTerminating(void); + +public: + void SetEventListner(ISlideSettingListener* listner); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + 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){}; + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;}; + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;}; + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;}; + +private: + Tizen::Ui::Controls::ListView* __pList; + ISlideSettingListener* __pListener; +}; + +#endif /* _GL_SLIDE_SHOW_POPUP_H_ */ diff --git a/inc/GlThumbnailEvent.h b/inc/GlThumbnailEvent.h new file mode 100644 index 0000000..bb94ce8 --- /dev/null +++ b/inc/GlThumbnailEvent.h @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailEvent.h + * @brief This is the header file for ThumbnailEvent class. + */ + +#ifndef _GL_THUMBNAIL_EVENT_H_ +#define _GL_THUMBNAIL_EVENT_H_ + +#include + +class IThumbnailEventListener; + +class ThumbnailEvent + : public Tizen::Base::Runtime::Event +{ +public: + virtual ~ThumbnailEvent(void); + +protected: + virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, + const Tizen::Base::Runtime::IEventArg& eventArg); +}; + +#endif /* _GL_THUMBNAIL_EVENT_H_ */ diff --git a/inc/GlThumbnailEventArg.h b/inc/GlThumbnailEventArg.h new file mode 100644 index 0000000..5a7e6f5 --- /dev/null +++ b/inc/GlThumbnailEventArg.h @@ -0,0 +1,39 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailEventArg.h + * @brief This is the header file for ThumbnailEventArg class. + */ + +#ifndef _GL_THUMBNAIL_EVENT_ARG_H_ +#define _GL_THUMBNAIL_EVENT_ARG_H_ + +class ThumbnailInfo; + +class ThumbnailEventArg + : public Tizen::Base::Runtime::IEventArg +{ +public: + ThumbnailEventArg(ThumbnailInfo* pThumbnailInfo); + virtual ~ThumbnailEventArg(void); + virtual ThumbnailInfo* GetThumbnailInfoN(void); + +protected: + ThumbnailInfo* _pThumbnailInfo; +}; + +#endif /* _GL_THUMBNAIL_EVENT_ARG_H_ */ diff --git a/inc/GlThumbnailEventListener.h b/inc/GlThumbnailEventListener.h new file mode 100644 index 0000000..f50af95 --- /dev/null +++ b/inc/GlThumbnailEventListener.h @@ -0,0 +1,33 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailEventListener.h + * @brief This is the header file for ThumbnailEventListener class. + */ + +#ifndef _GL_THUMBNAIL_EVENT_LISTENER_H_ +#define _GL_THUMBNAIL_EVENT_LISTENER_H_ + +class IThumbnailEventListener + : public Tizen::Base::Runtime::IEventListener +{ +public: + virtual ~IThumbnailEventListener(void) {}; + virtual void OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg) = 0; +}; + +#endif /* _GL_THUMBNAIL_EVENT_LISTENER_H_ */ diff --git a/inc/GlThumbnailInfo.h b/inc/GlThumbnailInfo.h new file mode 100644 index 0000000..19e2b4b --- /dev/null +++ b/inc/GlThumbnailInfo.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailInfo.h + * @brief This is the header file for ThumbnailInfo class. + */ + +#ifndef _GL_THUMBNAIL_INFO_H_ +#define _GL_THUMBNAIL_INFO_H_ + +#include + +class ThumbnailInfo + : public Tizen::Base::Object +{ +public: + ThumbnailInfo(void); + virtual ~ThumbnailInfo(void); + + void Construct(const Tizen::Content::ContentId& contentId, + const Tizen::Base::String& filePath, const Tizen::Graphics::Bitmap& bitmap, + const Tizen::Content::ContentType contentType, const long duration = 0); + + Tizen::Content::ContentId GetContentId(void) const; + Tizen::Base::String GetFilePath(void) const; + void SetFilePath(const Tizen::Base::String& filePath); + Tizen::Graphics::Bitmap* GetBitmapN(void) const; + void SetBitmap(const Tizen::Graphics::Bitmap& bitmap); + Tizen::Content::ContentType GetContentType(void) const; + void SetContentType(const Tizen::Content::ContentType contentType); + long GetDuration(void) const; + void SetDuration(const long duration); + +private: + Tizen::Graphics::Bitmap* CloneBitmapN(const Tizen::Graphics::Bitmap& bitmap) const; + +private : + Tizen::Content::ContentId __contentId; + Tizen::Base::String __filePath; + Tizen::Graphics::Bitmap* __pBitmap; + Tizen::Content::ContentType __contentType; + long __duration; +}; + +#endif /* _GL_THUMBNAIL_INFO_H_ */ diff --git a/inc/GlThumbnailJob.h b/inc/GlThumbnailJob.h new file mode 100644 index 0000000..6d12bc8 --- /dev/null +++ b/inc/GlThumbnailJob.h @@ -0,0 +1,51 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailJob.h + * @brief This is the header file for ThumbnailJob class. + */ + +#ifndef _GL_THUMBNAIL_JOB_H_ +#define _GL_THUMBNAIL_JOB_H_ + +class ThumbnailEvent; + +class ThumbnailJob + : public Tizen::Base::Object +{ +public: + ThumbnailJob(void); + virtual ~ThumbnailJob(void); + + void Construct(const Tizen::Content::ContentId& contentId, const unsigned long requestId, + const ThumbnailEvent* pRequestEvent); + + Tizen::Content::ContentId GetContentId(void) const; + unsigned long GetRequestId(void) const; + const ThumbnailEvent* GetEvent(void) const; + +private: + ThumbnailJob(const ThumbnailJob&); + ThumbnailJob& operator=(const ThumbnailJob&); + +private: + Tizen::Content::ContentId __contentId; + unsigned long __requestId; + const ThumbnailEvent* __pRequestEvent; +}; + +#endif /* _GL_THUMBNAIL_JOB_H_ */ diff --git a/inc/GlThumbnailProvider.h b/inc/GlThumbnailProvider.h new file mode 100644 index 0000000..216169b --- /dev/null +++ b/inc/GlThumbnailProvider.h @@ -0,0 +1,69 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailProvider.h + * @brief This is the header file for ThumbnailProvider class. + */ + +#ifndef _GL_THUMBNAIL_PROVIDER_H_ +#define _GL_THUMBNAIL_PROVIDER_H_ + +#include "GlThumbnailInfo.h" + +class ThumbnailEvent; + +class ThumbnailProvider + : public Tizen::Base::Runtime::EventDrivenThread +{ +public: + static ThumbnailProvider* GetInstance(void); + +public: + static void Release(void); + + void RequestThumbnail(const Tizen::Content::ContentId& contentId, const ThumbnailEvent* event); + void ClearThumbnailRequests(const bool appTerminating = false); + + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList * pArgs); + virtual bool OnStart(void); + virtual void OnStop(void); + +private: + ThumbnailProvider(void); + virtual ~ThumbnailProvider(void); + ThumbnailProvider(ThumbnailProvider& value); + ThumbnailProvider& operator = (ThumbnailProvider&); + + result Construct(void); + static void CreateInstance(void); + static void DestroyInstance(void); + + ThumbnailInfo* GetThumbnailInfoN(const Tizen::Content::ContentId& contentId) const; + Tizen::Graphics::Bitmap* GetThumbnailByDecodeN(const Tizen::Base::String& filePath, const Tizen::Content::ContentType contentType) const; + Tizen::Base::String GetFileNameFromFullPath(const Tizen::Base::String& fullPath, bool withExt) const; + +private: + static ThumbnailProvider* __pThumbnailProviderInstance; + static Tizen::Base::Collection::ArrayList* __pThumbnailEventListener; + + Tizen::Base::Runtime::Mutex* __pMutexCmd; + Tizen::Base::Collection::ArrayList* __pCmdQueue; + unsigned long __requestId; + bool __isAppTerminating; +}; + +#endif /* _GL_THUMBNAIL_PROVIDER_H_ */ diff --git a/inc/GlTimerBase.h b/inc/GlTimerBase.h new file mode 100644 index 0000000..ff31bf0 --- /dev/null +++ b/inc/GlTimerBase.h @@ -0,0 +1,97 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlTimerBase.h + * @brief This is the header file for GlTimerBase class. + */ + +#ifndef _GL_TIMER_BASE_H_ +#define _GL_TIMER_BASE_H_ + +#include +#include +#include "GlFileOpInvalidateListener.h" +#include "GlTimerScanDirListener.h" +#include "GlTypes.h" + +class GlProgressBar; + +class GlTimerBase + : public Tizen::Ui::IActionEventListener + , public Tizen::Base::Runtime::ITimerEventListener + , public ITimerScanDirListener + , public Tizen::Ui::IPropagatedKeyEventListener + , public Tizen::System::IDeviceEventListener +{ +public: + + GlTimerBase(IFileOpInvalidateListener*, enum FileActionMode actionId); + virtual ~GlTimerBase(void); + + bool StartTimer(void); + void CancelTimer(void); + void SetActionMode(const enum FileActionMode actionId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + virtual void OnTimerScanDirComplete(); + + void Cancel(void); + bool IsStarted(void); + + + virtual bool OnKeyPressed(Tizen::Ui::Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false; }; + virtual bool OnKeyReleased(Tizen::Ui::Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Tizen::Ui::Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false;}; + virtual bool OnPreviewKeyReleased(Tizen::Ui::Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){ return false;}; + + +protected: + virtual Tizen::Base::Collection::IList* TimerStart(void) = 0; + virtual result TimerExpired(const Tizen::Base::Object*) = 0; + virtual void TimerCancel(int, enum FileActionCancelRes res) = 0; + virtual void TimerComplete(int, enum FileActionCompleteRes res) = 0; + virtual result ScanDirectories(void) = 0; + virtual int GetDirScanCount() = 0; + int GetMovedCount() const; + virtual void OnDeviceStateChanged(Tizen::System::DeviceType deviceType, const Tizen::Base::String& state) = 0; + +private: + void OnOpComplete(enum FileActionCompleteRes); + void OnOpCancelled(enum FileActionCancelRes res); + +protected: + enum FileActionMode _actionId; + +private: + Tizen::Base::Runtime::Timer __moveTimer; + Tizen::Base::Collection::IList * __pContentIdList; + int __moveToCount; + GlProgressBar* __pMoveProBar; + IFileOpInvalidateListener* __pInvalidate; + bool __isStarted; + enum TimerCompleteOptions + { + CANCEL_SYS, + CANCEL_BY_USER, + TIMER_COMPLETE + }; + enum TimerCompleteOptions __timerRes; + }; + +#endif //_GL_TIMER_BASE_H_ diff --git a/inc/GlTimerScanDirListener.h b/inc/GlTimerScanDirListener.h new file mode 100644 index 0000000..dea8b6d --- /dev/null +++ b/inc/GlTimerScanDirListener.h @@ -0,0 +1,31 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlTimerScanDirListener.h + * @brief This is the header file for GlTimerScanDirListener class. + */ +#ifndef _GL_TIMER_SCANDIR_LISTENER_H_ +#define _GL_TIMER_SCANDIR_LISTENER_H_ + +class ITimerScanDirListener +{ +public: + virtual ~ITimerScanDirListener(void) {} + virtual void OnTimerScanDirComplete() = 0; +}; + +#endif //_GL_TIMER_SCANDIR_LISTENER_H_ diff --git a/inc/GlTypes.h b/inc/GlTypes.h new file mode 100644 index 0000000..8a52c55 --- /dev/null +++ b/inc/GlTypes.h @@ -0,0 +1,360 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlTypes.h + * @brief This is the header file for Types definition. + */ + +#ifndef _GL_TYPES_H_ +#define _GL_TYPES_H_ + +#include + +enum ACTION_ID_ +{ + IDA_BUTTON_CHECKED = 101, + IDA_BUTTON_CREATE_NAME_CANCEL = 102, + IDA_BUTTON_CREATE_NAME_SAVE = 103, + IDA_BUTTON_MOVE_TO_SELECTION = 104, + IDA_BUTTON_UNCHECKED = 105, + IDA_BUTTON_SAVE = 106, + IDA_ALBUM_LIST_SELECT_ALL = 201, + IDA_FILE_LIST_SELECT_ALL = 202, + IDA_CONTEXT_MENU_MESSAGE = 301, + IDA_CONTEXT_MENU_EMAIL = 302, + IDA_CONTEXT_MENU_MORE_ADD_TAG = 303, + IDA_CONTEXT_MENU_MORE_EDIT = 304, + IDA_CONTEXT_MENU_MORE_MOVE = 305, + IDA_CONTEXT_MENU_MORE_SLIDE_SHOW = 306, + IDA_CONTEXT_MENU_SHARE_MESSAGE = 307, + IDA_CONTEXT_MENU_SHARE_EMAIL = 308, + IDA_CONTEXT_MENU_MORE_COPY = 309, + IDA_CONTEXT_MENU_ROTATE_LEFT = 310, + IDA_CONTEXT_MENU_ROTATE_RIGHT = 311, + IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START = 401, + IDA_CONTEXTMENU_EDITOR_MOVE_CREATE_ALBUM = 600, + IDA_CONTEXTMENU_SELECTION_MOVE_ALBUM_ARRAY_START = 601, + IDA_CONTEXTMENU_SELECTION_MOVE_CREATE_ALBUM = 800, + IDA_DELETE_POPUP_CANCEL = 801, + IDA_DELETE_POPUP_DEL = 802, + IDA_EDITE_FOLDER = 901, + IDA_FOOTER_CAMERA = 902, + IDA_FOOTER_CANCEL = 903, + IDA_FOOTER_CONFIRM = 904, + IDA_FOOTER_DELETE = 905, + IDA_FOOTER_EDIT = 906, + IDA_FOOTER_MORE = 907, + IDA_FOOTER_SHARE = 908, + IDA_FOOTER_SLIDESHOW = 909, + IDA_FORMAT_DURATION = 1001, + IDA_FORMAT_THUMBNAIL = 1002, + IDA_FORMAT_TITLE = 1003, + IDA_SELECTALL_CHECKED = 1101, + IDA_SELECTALL_UNCHECKED = 1102, + IDA_PROGRESSBAR_CANCEL = 1201 +}; + +enum AppControlMode +{ + APPCONTROL_MODE_MAIN, + APPCONTROL_MODE_PICK, + APPCONTROL_MODE_SETTING, + APPCONTROL_MODE_UNKNOWN +}; + +enum AppControlParamType +{ + APPCONTROL_PARAM_TYPE_MEDIA_TYPE, + APPCONTROL_PARAM_TYPE_SELECTION_MODE, + APPCONTROL_PARAM_TYPE_UNKNOWN +}; + +enum AppControlMediaType +{ + APPCONTROL_MEDIA_TYPE_IMAGE, + APPCONTROL_MEDIA_TYPE_VIDEO, + APPCONTROL_MEDIA_TYPE_UNKNOWN +}; + +enum AppControlSelectionMode +{ + APPCONTROL_SELECTION_MODE_SINGLE, + APPCONTROL_SELECTION_MODE_MULTIPLE, + APPCONTROL_SELECTION_MODE_UNKNOWN +}; + +enum AlbumInfoType +{ + ALBUM_INFO_TYPE_BASE, + ALBUM_INFO_TYPE_FOLDER, + ALBUM_INFO_TYPE_FILE +}; + +enum AlbumNameEditorMode +{ + ALBUM_NAME_EDITOR_MODE_RENAME, + ALBUM_NAME_EDITOR_MODE_CREATE, + ALBUM_NAME_EDITOR_MODE_NONE +}; + +enum FileActionMode +{ + FILE_ACTION_DELETE, + FILE_ACTION_MOVE, + FILE_ACTION_COPY, + FILE_ACTION_RENAME, + FILE_ACTION_ROTATE +}; + +enum FileActionCancelRes +{ + CANCEL_USER, + CANCEL_SYS_ERROR +}; + +enum FileActionCompleteRes +{ + COMPLETE_SUCCESS, + COMPLETE_SYS_PARTIAL, + COMPLETE_SYS_FAILURE +}; + +enum AlbumAction +{ + ALBUM_CREATE, + ALBUM_RENAME +}; + +enum RotateMode +{ + ROTATE_MODE_RIGHT = 0, + ROTATE_MODE_LEFT +}; + +extern const wchar_t* IDL_FORM_ALBUM_LIST; +extern const wchar_t* IDL_FORM_ALBUM_LIST_EDITOR; +extern const wchar_t* IDL_FORM_FILE_LIST; +extern const wchar_t* IDL_FORM_SETTING_MAIN; +extern const wchar_t* IDL_FORM_SETTING_INTERVAL; +extern const wchar_t* IDL_FORM_SETTING_TRANSITION; +extern const wchar_t* IDL_FORM_IMAGE_CROP; + +extern const wchar_t* IDC_LABEL_ALBUM_LIST_EDITOR_SELECTED; + +extern const wchar_t* IDC_FORM_ALBUM_LIST; +extern const wchar_t* IDC_FORM_ALBUM_LIST_EDITOR; +extern const wchar_t* IDC_FORM_ALBUM_NAME_EDITOR; +extern const wchar_t* IDC_FORM_FILE_LIST; +extern const wchar_t* IDC_FORM_FILE_LIST_EDITOR; +extern const wchar_t* IDC_FORM_SETTING_MAIN; +extern const wchar_t* IDC_FORM_SETTING_INTERVAL; +extern const wchar_t* IDC_FORM_SETTING_TRANSITION; +extern const wchar_t* IDC_FORM_IMAGE_CROP; + +extern const wchar_t* IDC_PANEL_BLANK; +extern const wchar_t* IDC_PANEL_ALL_LIST; +extern const wchar_t* IDC_PANEL_IMAGE_LIST; +extern const wchar_t* IDC_PANEL_VIDEO_LIST; +extern const wchar_t* IDC_PANEL_ALL_LIST_EDITOR; +extern const wchar_t* IDC_PANEL_IMAGE_LIST_EDITOR; +extern const wchar_t* IDC_PANEL_VIDEO_LIST_EDITOR; +extern const wchar_t* IDC_PANEL_ALL_LIST_SELECTION; + +extern const wchar_t* IDSCN_ALBUM_LIST; +extern const wchar_t* IDSCN_ALBUM_LIST_EDITOR; +extern const wchar_t* IDSCN_ALBUM_NAME_EDITOR; +extern const wchar_t* IDSCN_ALL_LIST; +extern const wchar_t* IDSCN_IMAGE_LIST; +extern const wchar_t* IDSCN_VIDEO_LIST; +extern const wchar_t* IDSCN_ALL_LIST_EDITOR; +extern const wchar_t* IDSCN_IMAGE_LIST_EDITOR; +extern const wchar_t* IDSCN_VIDEO_LIST_EDITOR; +extern const wchar_t* IDSCN_ALL_LIST_SELECTION; +extern const wchar_t* IDSCN_SETTING_MAIN; +extern const wchar_t* IDSCN_SETTING_INTERVAL; +extern const wchar_t* IDSCN_SETTING_TRANSITION; +extern const wchar_t* IDSCN_IMAGE_CROP; + +extern const wchar_t* APPCONTROL_PROVIDER_ID_CAMERA; +extern const wchar_t* APPCONTROL_PROVIDER_ID_MESSAGE; +extern const wchar_t* APPCONTROL_PROVIDER_ID_EMAIL; +extern const wchar_t* APPCONTROL_PROVIDER_ID_IMAGE; + +extern const wchar_t* APPCONTROL_OPERATION_ID_PICK; +extern const wchar_t* APPCONTROL_OPERATION_ID_VIEW; +extern const wchar_t* APPCONTROL_OPERATION_ID_CAPTURE; +extern const wchar_t* APPCONTROL_OPERATION_ID_CREATE_CONTENT; +extern const wchar_t* APPCONTROL_OPERATION_ID_COMPOSE; +extern const wchar_t* APPCONTROL_OPERATION_ID_CONFIGURE; +extern const wchar_t* APPCONTROL_OPERATION_ID_MAIN; + +extern const wchar_t* APPCONTROL_KEY_TYPE; +extern const wchar_t* APPCONTROL_KEY_PATH; +extern const wchar_t* APPCONTROL_KEY_INDEX; +extern const wchar_t* APPCONTROL_KEY_SELECTION_MODE; +extern const wchar_t* APPCONTROL_KEY_DATA_SELECTED; +extern const wchar_t* APPCONTROL_KEY_MESSAGE_TYPE; +extern const wchar_t* APPCONTROL_KEY_CAMERA_ALLOW_SWITCH; +extern const wchar_t* APPCONTROL_KEY_IMAGEVIEWER_MODE; + +extern const wchar_t* APPCONTROL_URI_MMS_TO; +extern const wchar_t* APPCONTROL_URI_MAIL_TO; + +extern const wchar_t* APPCONTROL_MIME_IMAGE_JPG; +extern const wchar_t* APPCONTROL_MIME_IMAGE_ALL; + +extern const wchar_t* APPCONTROL_DATA_IMAGE; +extern const wchar_t* APPCONTROL_DATA_VIDEO; +extern const wchar_t* APPCONTROL_DATA_SINGLE; +extern const wchar_t* APPCONTROL_DATA_MULTIPLE; +extern const wchar_t* APPCONTROL_DATA_SLIDE_SHOW; +extern const wchar_t* APPCONTROL_DATA_SELECTION_MODE; +extern const wchar_t* APPCONTROL_DATA_TRUE; +extern const wchar_t* APPCONTROL_DATA_MMS; +extern const wchar_t* APPCONTROL_DATA_CROP_TYPE_AUTO; +extern const wchar_t* APPCONTROL_DATA_CROP_TYPE_FIT_TO_SCREEN; + +extern const wchar_t* APPCONTROL_RESULT_KEY_LEGACY_RESULT; + +extern const wchar_t* SETTING_KEY_LANGUAGE; +extern const wchar_t* SETTING_KEY_FONT_SIZE; + +extern const Tizen::Graphics::Dimension DIMENSION_DEFAULT_THUMBNAIL; +extern const int FOLDER_BITMAP_MAX; + +extern const wchar_t* EMPTY_SPACE; +extern const wchar_t* SINGLE_SPACE; + +extern const wchar_t* DIRECTORY_SEPARATOR; +extern const wchar_t* FILE_EXT_SEPARATOR; +extern const wchar_t* MULTI_ITEM_SEPARATOR; + +extern const wchar_t* CONTENT_EXT_PNG; +extern const wchar_t* CONTENT_EXT_BMP; +extern const wchar_t* CONTENT_EXT_JPG; +extern const wchar_t* CONTENT_EXT_GIF; +extern const wchar_t* CONTENT_EXT_TIF; +extern const wchar_t* CONTENT_EXT_MP4; +extern const wchar_t* CONTENT_EXT_3GP; +extern const wchar_t* CONTENT_EXT_AVI; +extern const wchar_t* CONTENT_EXT_RM; +extern const wchar_t* CONTENT_EXT_WMV; +extern const wchar_t* CONTENT_EXT_ASF; + +extern const wchar_t* SECTION_NAME_GALLERY; +extern const wchar_t* SECTION_NAME_IMAGE_VIEWER; +extern const wchar_t* SECTION_NAME_VIDEO_PLAYER; +extern const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL; +extern const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT; +extern const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_MUSIC; +extern const wchar_t* ENTRY_NAME_IMAGE_VIEWER_REPEAT_VALUE; +extern const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SHUFFLE_VALUE; + +extern const wchar_t* ALL_ALBUMS_REAL_NAME; + +extern const wchar_t* FONT_SIZE_SETTING_INFO_KEY; + +extern const wchar_t* IDB_BUTTON_CIRCLE_BACKGROUND; +extern const wchar_t* IDB_BUTTON_RENAME; +extern const wchar_t* IDB_CONTROLBAR_CAMERA; +extern const wchar_t* IDB_CONTROLBAR_DELETE; +extern const wchar_t* IDB_CONTROLBAR_DELETE_DIM; +extern const wchar_t* IDB_CONTROLBAR_MORE; +extern const wchar_t* IDB_CONTROLBAR_MORE_DISABLED; +extern const wchar_t* IDB_CONTROLBAR_MORE_PRESSED; +extern const wchar_t* IDB_CONTROLBAR_SHARE; +extern const wchar_t* IDB_CONTROLBAR_SHARE_DIM; +extern const wchar_t* IDB_LISTVIEW_EMPTY; +extern const wchar_t* IDB_MAIN_FOLDER_BACKGROUND; +extern const wchar_t* IDB_VIDEOTHUMBNAIL_BG; +extern const wchar_t* IDB_VIDEOTHUMBNAIL_BOOKMARK; +extern const wchar_t* IDB_VIDEOTHUMBNAIL_FAVORITE; +extern const wchar_t* IDB_VIDEOTHUMBNAIL_PLAY; +extern const wchar_t* IDB_BUTTON_MOVE_SELECTION; +extern const wchar_t* IDB_NO_CONTENTS_BROKEN; +extern const wchar_t* IDB_LIST_EXPAND_CLOSED; +extern const wchar_t* IDB_LIST_EXPAND_CLOSED_PRESS; +extern const wchar_t* IDB_LIST_EXPAND_OPENED; +extern const wchar_t* IDB_LIST_EXPAND_OPENED_PRESS; +extern const wchar_t* IDB_ICON_SELECT_ALL; +extern const wchar_t* IDB_ICON_SELECT_ALL_PRESS; + +extern const wchar_t* DEVICE_STORAGE_CARD_MOUNTED; +extern const wchar_t* DEVICE_STORAGE_CARD_UNMOUNTED; +extern const wchar_t* IDB_ALBUM_EDIT_RENAME_BG; +extern const wchar_t* IDB_ALBUM_EDIT_RENAME; +extern const wchar_t* IDB_ALBUM_ICON_FOLDER; +extern const wchar_t* IDB_ALBUM_ICON_DOWNLOAD; +extern const wchar_t* IDB_ALBUM_ICON_CAMERA; + +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS1; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS2; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS3; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS4; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS5; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS6; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS7; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS8; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS9; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS10; + +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS11; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS12; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS13; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS14; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS15; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS16; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS17; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS18; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS19; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS20; + +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS21; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS22; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS23; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS24; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS25; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS26; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS27; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS28; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS29; +extern const wchar_t* IDB_ALBUM_RENAME_PROGRESS30; + +extern const wchar_t* IDB_IMAGE_CONTEXT_EMAIL_ICON; +extern const wchar_t* IDB_IMAGE_CONTEXT_MESSAGE_ICON; + +extern const wchar_t* IDB_IMAGE_CROP_RECTANGLE; + +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; +static const int ALBUM_FIRST_ELEMENT = 0; +static const int ALBUM_SECOND_ELEMENT = 1; + +#endif /* _GL_TYPES_H_ */ diff --git a/inc/GlVideoListEditorPanel.h b/inc/GlVideoListEditorPanel.h new file mode 100644 index 0000000..c527637 --- /dev/null +++ b/inc/GlVideoListEditorPanel.h @@ -0,0 +1,93 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlVideoListEditorPanel.h + * @brief This is the header file for VideoListEditorPanel class. + */ + +#ifndef _GL_VIDEO_LIST_EDITOR_PANEL_H_ +#define _GL_VIDEO_LIST_EDITOR_PANEL_H_ + +#include +#include "GlAlbumEventListener.h" +#include "GlFileOpInvalidateListener.h" + +class FileListEditorForm; +class FileUpdateTimer; + +class VideoListEditorPanel + : public IAlbumEventListener + , public IFileOpInvalidateListener + , public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + VideoListEditorPanel(void); + virtual ~VideoListEditorPanel(void); + + result Initialize(void); + + void OnSelectAllPressed(void); + void OnRequestAppExitWithMultipleSelectionAppControlResult(void); + int GetItemCheckedCount(void) const; + void SetButtonState(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + 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 OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, + int elementId, Tizen::Ui::Controls::ListContextItemStatus status){}; + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + + virtual void OnFileOpInvalidate(enum FileActionMode actionId); + virtual void OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes){}; + virtual void OnScanDirStart(){} + virtual void OnScanDirComplete(){} + + void ChangeOrientation(void); + +private: + Tizen::Base::Collection::IList* GetItemCheckedIndexListN(void) const; + +private: + Tizen::Ui::Controls::ListView* __pContentIconListView; + Tizen::Ui::Controls::CheckButton* __pCheckButton; + Tizen::Ui::Controls::Label* __pLabelSelectCnt; + int __itemCount; + FileListPresentationModel* __pPresentationModel; + FileUpdateTimer* __pFileDelete; + FileListEditorForm* __pFileListEditorForm; +}; + +#endif /* _GL_VIDEO_LIST_EDITOR_PANEL_H_ */ diff --git a/inc/GlVideoListPanel.h b/inc/GlVideoListPanel.h new file mode 100644 index 0000000..9bd0712 --- /dev/null +++ b/inc/GlVideoListPanel.h @@ -0,0 +1,69 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlVideoListPanel.h + * @brief This is the header file for VideoListPanel class. + */ + +#ifndef _GL_VIDEO_LIST_PANEL_H_ +#define _GL_VIDEO_LIST_PANEL_H_ + +#include "GlAlbumEventListener.h" + +class FileListPresentationModel; + +class VideoListPanel + : public IAlbumEventListener + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + VideoListPanel(void); + virtual ~VideoListPanel(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + 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 OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, + int elementId, Tizen::Ui::Controls::ListContextItemStatus status){}; + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + + 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 void OnFileInfoChanged(const Tizen::Content::ContentType contentType); + virtual void OnThumbnailDecoded(const int index); + +private: + int __itemCount; + Tizen::Ui::Controls::ListView* __pContentListView; + FileListPresentationModel* __pPresentationModel; +}; + +#endif /* _GL_VIDEO_LIST_PANEL_H_ */ diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..c20678f --- /dev/null +++ b/manifest.xml @@ -0,0 +1,92 @@ + + + ijudt7w61q + 1.0.0 + C++App + + true + true + + + 2.2 + + http://tizen.org/privilege/content.read + http://tizen.org/privilege/application.launch + http://tizen.org/privilege/content.write + + + + + + استوديو + Qalereya + Галерия + Galeria + Galerie + Galleri + Galerie + Συλλογή + Gallery + Gallery + Gallery + Galerii + Galeria + گالری + Galleria + Galerie + Galerie + Gailearaí + Galería + गैलरी + Album + Galéria + Պատկերասրահ + Gallerí + Galleria + ギャラリー + გალერეა + Галерея + 갤러리 + Galerija + Galerija + Галерија + Galerij + Galleri + Galeria + Galeria + Galeria + Galerie + Галерея + Galéria + Galerija + Galería + Galería + Galerija + Galleri + แกลเลอรี่ + Galeri + Галерея + گیلری + Galereya + 图库 + 媒體瀏覽器 + 画廊 + 媒體瀏覽器 + + + mainmenu.png + + + + image/* + video/* + http://tizen.org/appcontrol/operation/pick + + + http://tizen.org/appcontrol/operation/Configure + + + + + + diff --git a/packaging/apps.Gallery.spec b/packaging/apps.Gallery.spec new file mode 100644 index 0000000..828934d --- /dev/null +++ b/packaging/apps.Gallery.spec @@ -0,0 +1,79 @@ +Name: apps.Gallery +Summary: Gallery application +Version: 1.0.1 +Release: 1 +Group: TO_BE/FILLED_IN +License: Flora-1.1 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(osp-appfw) +BuildRequires: pkgconfig(osp-content) +BuildRequires: pkgconfig(osp-image) +BuildRequires: pkgconfig(osp-image-core) +BuildRequires: pkgconfig(osp-locations) +BuildRequires: pkgconfig(osp-media) +BuildRequires: pkgconfig(osp-net) +BuildRequires: pkgconfig(osp-uifw) +BuildRequires: osp-appfw-internal-devel +BuildRequires: osp-image-internal-devel +BuildRequires: osp-media-internal-devel +BuildRequires: osp-net-internal-devel +BuildRequires: osp-uifw-internal-devel +BuildRequires: hash-signer + +Requires: osp-installer + +%description +Verification application: Gallery + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%ifarch %{ix86} +%if 0%{?simulator} +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_X86_ " cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif +%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} +mkdir -p %{buildroot}/usr/share/license +cp LICENSE.Flora %{buildroot}/usr/share/license/%{name} +%make_install +###### for package signing step ###### +PKG_ID=ijudt7w61q +%define tizen_sign 1 +%define tizen_sign_base /usr/apps/${PKG_ID} +%define tizen_sign_level platform +%define tizen_author_sign 1 +%define tizen_dist_sign 1 + + +%post +/sbin/ldconfig +PKG_ID=ijudt7w61q +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/Gallery + +%postun +/sbin/ldconfig +PKG_ID=ijudt7w61q +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/* +/usr/share/license/%{name} + + diff --git a/res/ara-AE.xml b/res/ara-AE.xml new file mode 100644 index 0000000..abe581e --- /dev/null +++ b/res/ara-AE.xml @@ -0,0 +1,99 @@ + + + + تم الوصول إلى أقصى عدد من الحروف + عرض الصور + تم تجاوز الحد الأقصى لعدد الملفات + إعدادات عرض الشرائح + اختيار الكل + مسح؟ + تعديل + رسالة + ملفات محملة + اسم الألبوم مستخدم بالفعل + حفظ + 20 ثانية + التفعيل + تدوير لليسار + ثانيتان + الرسائل + تمت + غير قادر على تغيير الاسم. جاري استخدام الملف + بريد إلكتروني + أحرف غير صالحة + تم النقل + إلغاء + محدد + مسح + الترجمات المصاحبة + إلغاء + تم بلوغ أقصى عدد من الأحرف (%d) + تم بلوغ أقصى عدد من الأحرف (%d) + عرض شرائح + شرائح + بدء عرض الشرائح + %s موجود بالفعل + جاري التحميل ... + الألبومات + يتعذر إعادة التسمية. اسم الألبوم مستخدم بالفعل + فشلت العملية + جاري الحفظ... + تأثير الانتقال + الموسيقى + تم تحديد %d عناصر + إنشاء مجلد؟ + فشل المسح + تم تحديد عنصر واحد + فيديو + زوم + نسخ + قوس قزح + فاصل عرض الشرائح + مشغل فيديو + عرض الشرائح + ثوان + تدوير لليسار + الصفحة + جاري النسخ... + 10 ثوان + جاري المعالجة... + استوديو + لا يوجد اسم + الصور + التلاشي التدريجي + تعديل + 5 ثوان + لم يتم اختيار عناصر + تم المسح + حذف؟ + موجود بالفعل. هل تريد الاستبدال؟ + جاري المسح... + تمت + 3 ثوان + ملفات الكاميرا + تدوير لليمين + تكرار + تم الحفظ + إذابة + الخلط + جاري النقل... + فشل النقل + الفيديو + نوع ملفات غير مدعم + تغيير الاسم + تمت + تحديد الكل + كافة الألبومات + تغييرالاسم + نقل + لا يمكن المسح + تدوير لليمين + الفترة + موجود مسبقا + إنشاء ألبوم + لا توجد عناصر + إخفاء + فشل الحفظ + diff --git a/res/aze-AZ.xml b/res/aze-AZ.xml new file mode 100644 index 0000000..01c2157 --- /dev/null +++ b/res/aze-AZ.xml @@ -0,0 +1,99 @@ + + + + Simvol sayı maksimuma çatıb + Slayd göstərmə + Faylların sayı maksimumu keçib + Slaydşou parametrləri + Hamısını seç + Silinsin? + Redaktə et + Mesaj + Yükləmələr + Albom adı artıq ist.edilir + Yaddaşa yaz + 20 saniyə + Aktivləşdirmə + Sola döndər + 2 saniyə + Mesajlar + Bitdi + Yenidən adlandırmaq mümkün deyildir + Elektron poçtlar + Simvollar səhvdir + Göndərildi + Ləğv et + Seçilmişi + Sil + Yarımbaşlıqlar + Ləğv et + Simvolların sayı maksimuma (%d) çatıb + Simvolların sayı maksimuma (%d) çatıb + Slyd nmyşi + Slayd + Slayd nümayişini dayandır + %s hazırda mövcuddur + Yüklənir... + Albomlar + Yenidən adlandırmaq mümkün deyil. Albom adı artıq istifadə edilir + Əməliyyat alınmadı + Yaddaşa yazılma + Keçid effekti + Musiqi + %d element seçildi + Qovluq yaradılsın? + Silmək mümkün olmadı + 1 element seçildi + Video + Yaxınlaşdırma/uzaqlaşdırma + Köçür + Diafraqma + Slaydşou intervalı + Video pleyer + Slaydşou + Saniyələr + Sola döndər + Səhifə + Köçürülmə... + 10 saniyə + Emal edilir... + Qalereya + Ad yoxdur + Təsvirlər + Tutqunlaşdır + Redaktə et + 5 saniyə + Heç bir element seçilməyib + Silindi + Silinsin? + Artıq mövcuddur. Üzərindən yazılsın? + Silinmə + Yerinə yetirildi + 3 saniyə + Kamera çarxı + Sağa döndər + Təkrar et + Yaddaşa yazıldı + Seç + Təsadüfi sıralama + Göndərilmə... + Keçmə alınmadı + Video + Dəstəklənməyən fayl növü + Adını dəyişdir + Tamamlandı + Hamsnı seç + Bütün albomlar + Adı dəyişdir + Göndər + Silmək mümkün deyil + Sağa döndər + İnterval + Artıq var + Albom yaradın + Elementlər yoxdur + Sayrışmaq + Yaddaşa yazmaq mümkün olmadı + diff --git a/res/bul-BG.xml b/res/bul-BG.xml new file mode 100644 index 0000000..9c39051 --- /dev/null +++ b/res/bul-BG.xml @@ -0,0 +1,99 @@ + + + + Достигнат максимален брой знаци + Слайдшоу + Надхвърлен е максималният брой файлове + Настройки на слайдшоу + Избери всички + Изтриване? + Редактиране + Съобщение + Изтеглени файлове + Име на албума вече се изп. + Запис + 20 секунди + Активиране + Завъртане наляво + 2 секунди + Съобщения + Готово + Не може да се преименува + Email + Невалидни знаци + Преместено + Отказ + Избрани + Изтриване + Субтитри + Отказ + Достигнат е максималният брой знаци (%d) + Достигнат е максималният брой знаци (%d) + Слайдшоу + Слайд + Започване на слайдшоу + %s вече съществува + Зареждане + Албуми + Не може да се преименува. Името на албума вече се използва + Операцията е неуспешна + Запазване + Ефект на преход + Музика + Избрани са %d елемента + Създаване на папка? + Неуспешно изтриване + Избран е 1 елемент + Видеоклип + Зум + Копиране + Ирис + Интервал на слайдшоуто + Видео плейър + Слайдшоу + секунди + Завъртане наляво + Страница + Копиране... + 10 секунди + Обработване... + Галерия + Без име + Изображения + Избледняване + Редактиране + 5 секунди + Няма избрани елементи + Изтрито + Премахване? + Вече съществува. Презапис? + Изтриване... + Готово + 3 секунди + Материал камера + Завъртане надясно + Повтаряне + Записан + Размиване + Разбъркано + Преместване + Неуспешно преместване + Видеоклипове + Неподдържан вид файл + Преименуване + Завършено + Изб.всички + Всички албуми + Промяна на име + Премести + Невъзможно изтриване + Завъртане надясно + Интервал + Вече съществува + Създаване на албум + Няма елементи + Щори + Запазване неуспешно + diff --git a/res/cat-ES.xml b/res/cat-ES.xml new file mode 100644 index 0000000..0b69fd1 --- /dev/null +++ b/res/cat-ES.xml @@ -0,0 +1,99 @@ + + + + S'ha assolit el nombre màxim de caràcters + Presentació de diapositives + S'ha excedit el nombre màxim de fitxers + Ajustaments de la presentació de diapositives + Seleccioni-ho tot + Esborrar? + Editar + Missatge + Descàrregues + Nom d'àlbum ja en ús + Desar + 20 segons + Activació + Girar cap a l'esquerra + 2 segons + Missatges + Finalit. + No es pot canviar nom + Correu electrònic + Caràcters no vàlids + Mogut + Cancel·lar + Seleccionat + Esborrar + Subtítols + Cancel·lar + S'ha assolit el nombre màxim de caràcters (%d) + S'ha assolit el nombre màxim de caràcters (%d) + Diaposit + Diapositiva + Iniciar presentació de diapositives + %s ja existeix + Carregant... + Àlbums + No es pot canviar el nom. El nom d'àlbum ja està en ús + Operació fallida + Desant... + Efecte de transició + Música + %d elements seleccionats + Crear carpeta? + Error en esborrar + 1 element seleccionat + Vídeo + Zoom + Copiar + Iris + Interval de la presentació de diapositives + Reproductor de vídeo + Presentació de diapositives + segons + Girar cap a l'esquerra + Pàgina + Copiant... + 10 segons + Processant... + Galeria + Sense nom + Imatges + Perdre intensitat + Editar + 5 segons + No s'ha seleccionat cap element + Esborrat + Eliminar? + Ja existeix. Sobreescriure? + Esborrant... + Finalitzat + 3 segons + Rodet càmera + Girar cap a la dreta + Repetir + Desat + Dissoldre + Ordre aleatori + Movent... + Error en moure + Vídeos + Tipus de fitxer no admès + Canviar nom + Completat + Selec tot + Tots els àlbums + Canviar nom + Moure + No es pot esborrar + Girar cap a la dreta + Interval + Ja existeix + Crear àlbum + No hi ha elements + Persiana + Error en desar + diff --git a/res/ces-CZ.xml b/res/ces-CZ.xml new file mode 100644 index 0000000..41cbff4 --- /dev/null +++ b/res/ces-CZ.xml @@ -0,0 +1,99 @@ + + + + Bylo dosaženo maximálního počtu znaků + Prezentace + Byl překročen maximální počet souborů + Nastavení prezentace + Vybrat vše + Odstranit? + Upravit + Zpráva + Stažené položky + Název alba je již použit + Uložit + 20 sekund + Aktivace + Otočit doleva + 2 sekund + Zprávy + Hotovo + Nelze přejmenovat + E-mail + Neplatné znaky + Přesunuto + Zrušit + Vybráno + Odstranit + Titulky + Zrušit + Bylo dosaženo maximálního počtu znaků (%d) + Bylo dosaženo maximálního počtu znaků (%d) + Prezent. + Sklouznutí + Spustit prezentaci + %s již existuje + Nahrávám... + Alba + Nelze přejmenovat. Název alba je již použit + Otevření se nezdařilo + Ukládání... + Přechodový efekt + Hudba + Vybrané položky: %d + Chcete vytvořit složku? + Odstranění se nezdařilo + Byla vybrána 1 položka + Video + Přiblížení + Kopírovat + Duha + Interval prezentace + Videopřeh. + Prezentace + sekundy + Otočit doleva + Stránka + Kopírování... + 10 sekund + Probíhá zpracování... + Galerie + Žádný název + Obrázky + Zvolna mizet + Upravit + 5 sekund + Nejsou vybrány žádné položky + Odstraněno + Odstranit? + Již existuje. Přepsat? + Odstraňování... + Hotovo + 3 sekundy + Soubory z fot. + Otočit doprava + Opakovat + Uloženo + Rozplynout + Náhodně + Probíhá přesouvání + Přesunutí se nezdařilo + Videa + Nepodporovaný typ souboru + Přejmenovat + Dokončeno + Vybrat vše + Všechna alba + Změnit název + Přesunout + Nelze odstranit + Otočit doprava + Interval + Již existuje + Vytvořit album + Žádné položky + Roleta + Uložení se nezdařilo + diff --git a/res/dan-DK.xml b/res/dan-DK.xml new file mode 100644 index 0000000..d87193a --- /dev/null +++ b/res/dan-DK.xml @@ -0,0 +1,99 @@ + + + + Det maksimale antal tegn er nået + Diasshow + Det maksimale antal filer er overskredet + Indstillinger for diasshow + Vælg alle + Slet? + Redigér + Meddelelse + Downloads + Albumnavn allerede i brug + Gem + 20 sekunder + Aktivering + Rotér mod uret + 2 sekunder + Meddelelser + Udført + Kunne ikke omdøbe + E-mail + Ugyldige tegn + Flyttet + Annullér + Valgte + Slet + Undertekster + Annullér + Det maksimale antal tegn (%d) er nået + Det maksimale antal tegn (%d) er nået + Diasshow + Dias + Start diasshow + %s eksisterer allerede + Indlæser data ... + Albums + Kan ikke omdøbe. Albumnavn allerede i brug + Handlingen mislykkedes + Gemmer ... + Overgangseffekt + Musik + %d elementer valgt + Opret mappe? + Sletning mislykkedes + 1 element valgt + Videoklip + Zoom + Kopiér + Iris + Interval for diasshow + Videoafspiller + Diasshow + sekunder + Rotér mod uret + Side + Kopierer ... + 10 sekunder + Behandler ... + Galleri + Intet navn + Billeder + Tone ud + Redigér + 5 sekunder + Ingen valgte elementer + Slettet + Fjern? + Findes allerede. Vil du overskrive? + Sletter ... + Udført + 3 sekunder + Kamerarolle + Rotér med uret + Gentag + Gemt + Opløs + Bland + Flytter ... + Flytning mislykkedes + Videoklip + Filtypen understøttes ikke + Omdøb + Udført + Vælg alle + Alle album + Skift navn + Flyt + Kunne ikke slette + Rotér med uret + Interval + Findes allerede + Opret album + Ingen elementer + Afblænd + Kunne ikke gemme + diff --git a/res/deu-DE.xml b/res/deu-DE.xml new file mode 100644 index 0000000..0538122 --- /dev/null +++ b/res/deu-DE.xml @@ -0,0 +1,99 @@ + + + + Maximal zulässige Zeichenanzahl erreicht. + Diashow + Maximale Anzahl an Dateien überschritten. + Diashoweinstellungen + Alle auswählen + Löschen? + Bearbeiten + Nachricht + Downloads + Albumn. wird bereits verw. + Speichern + 20 Sekunden + Aktivierung + Nach links drehen + 2 Sekunden + Nachrichten + OK + Umbenennen nicht möglich + E-Mail + Ungültige Zeichen + Verschoben + Abbrechen + Ausgewählt + Löschen + Untertitel + Abbrechen + Maximale Anzahl an Zeichen (%d) erreicht. + Maximale Anzahl an Zeichen (%d) erreicht. + Diashow + Gleiten + Diashow starten + %s ist bereits vorhanden + Lädt... + Alben + Umbenennen nicht möglich. Albumname wird bereits verwendet + Vorgang fehlgeschlagen + Speichern... + Übergangseffekt + Musik + %d Elemente ausgewählt + Ordner erstellen? + Löschen fehlgeschlagen + 1 Element ausgewählt + Video + Zoom + Kopieren + Iris + Diashowintervall + Video-Player + Diashow + Sekunden + Nach links drehen + Seite + Wird kopiert... + 10 Sekunden + Verarbeitung läuft ... + Galerie + Kein Name + Eigene Bilder + Ausblenden + Bearbeiten + 5 Sekunden + Keine Elemente ausgewählt + Gelöscht + Entfernen? + Bereits vorhanden. Überschreiben? + Löschen... + OK + 3 Sekunden + Filmrolle + Nach rechts drehen + Wiederholen + Gespeichert + Auflösen + Zufallswiedergabe + Verschiebevorgang aktiv... + Verschieben fehlgeschlagen + Videos + Dateityp nicht unterstützt + Umbenennen + Abgeschlossen + Alle ausw. + Alle Alben + Name ändern + Verschieben + Kann nicht gelöscht werden + Nach rechts drehen + Intervall + Bereits vorhanden + Album erstellen + Keine Elemente + Blenden + Speichern fehlgeschlagen + diff --git a/res/ell-GR.xml b/res/ell-GR.xml new file mode 100644 index 0000000..b687012 --- /dev/null +++ b/res/ell-GR.xml @@ -0,0 +1,99 @@ + + + + Ο μέγιστος αριθμός χαρακτήρων συμπληρώθηκε + Παρουσίαση + Έγινε υπέρβαση του μέγιστου αριθμού αρχείων + Ρυθμίσεις παρουσίασης + Επιλογή όλων + Διαγραφή; + Επεξεργασία + Μήνυμα + Λήψεις + Το όνομα άλμπουμ χρησ. ήδη + Αποθήκευση + 20 δευτερόλεπτα + Ενεργοποίηση + Περιστροφή προς τα αριστερά + 2 δευτερόλεπτα + Μηνύματα + Ok + Δεν είναι δυνατή η μετονομασία + Email + Μη έγκυροι χαρακτήρες + Μετακινήθηκε + Ακύρωση + Επιλεγμένο + Διαγραφή + Υπότιτλοι + Ακύρωση + Συμπληρώθηκε ο μέγιστος αριθμός χαρακτήρων (%d) + Συμπληρώθηκε ο μέγιστος αριθμός χαρακτήρων (%d) + Παρ/σίαση + Διαφάνεια + Έναρξη παρουσίασης + Το αρχείο %s υπάρχει ήδη + Φόρτωση... + Άλμπουμ + Δεν είναι δυνατή η μετονομασία. To όνομα άλμπουμ χρησιμοποιείται ήδη + Λειτουργία απέτυχε + Aποθήκευση... + Εφέ μετάβασης + Μουσική + Επιλέχθηκαν %d στοιχεία + Δημιουργία φακέλου; + Αποτυχία διαγραφής + Επιλέχθηκε 1 στοιχείο + Προσθήκη βίντεο + Ζουμ + Αντιγραφή + Ίριδα + Διάστημα παρουσίασης + Αναπαραγωγή Βίντεο + Παρουσίαση + δευτ. + Περιστροφή προς τα αριστερά + Σελίδα + Αντιγραφή... + 10 δευτερόλεπτα + Επεξεργασία... + Συλλογή + Κανένα όνομα + Εικόνες + Σταδιακή εμφάνιση + Επεξεργασία + 5 δευτερόλεπτα + Κανένα επιλεγμένο στοιχείο + Διαγράφηκε + Αφαίρεση; + Υπάρχει ήδη. Αντικατάσταση; + Διαγραφή... + Τέλος + 3 δευτερόλεπτα + Λήψεις με κάμερα + Περιστροφή προς τα δεξιά + Επανάληψη + Αποθηκεύτηκε + Αποσύνθεση + Τυχαία σειρά + Μετακίνηση... + Αποτυχία μετακίνησης + Βίντεο + Μη υποστηρ. τύπος αρχείου + Μετονομασία + Ολοκληρώθηκε + Επιλ. όλων + Όλα τα άλμπουμ + Αλλαγή ονόματος + Μετακίνηση + Δεν είναι δυνατή η διαγραφή + Περιστροφή προς τα δεξιά + Διάστημα + Υπάρχει ήδη + Δημιουργία άλμπουμ + Κανένα στοιχείο + Ρολό + Αποτυχία αποθήκευσης + diff --git a/res/eng-GB.xml b/res/eng-GB.xml new file mode 100644 index 0000000..c7a7e23 --- /dev/null +++ b/res/eng-GB.xml @@ -0,0 +1,99 @@ + + + + Maximum number of characters reached + Slide show + Maximum number of files exceeded + Slideshow settings + Select all + Delete? + Edit + Message + Downloads + Album name already in use + Save + 20 seconds + Activation + Rotate left + 2 seconds + Messages + Done + Unable to rename + Email + Invalid characters + Moved + Cancel + Selected + Delete + Subtitles + Cancel + Maximum number of characters (%d) reached + Maximum number of characters (%d) reached + Slide show + Slide + Start slideshow + %s already exists + Loading... + Albums + Unable to rename. Album name already in use. + Operation failed + Saving... + Transition effect + Music + %d items selected + Create folder? + Delete failed + 1 item selected + Video + Zoom + Copy + Iris + Slideshow interval + Video Player + Slideshow + seconds + Rotate left + Page + Copying... + 10 seconds + Processing... + Gallery + No name + Images + Fade + Edit + 5 seconds + No item selected + Deleted + Remove? + Already exists. Overwrite? + Deleting... + Done + 3 seconds + Camera roll + Rotate right + Repeat + Saved + Dissolve + Shuffle + Moving... + Moving failed + Videos + Unsupported file type + Rename + Completed + Select all + All albums + Change name + Move + Unable to delete + Rotate right + Interval + Already exists + Create album + No items + Blind + Saving failed + diff --git a/res/eng-PH.xml b/res/eng-PH.xml new file mode 100644 index 0000000..b2231b1 --- /dev/null +++ b/res/eng-PH.xml @@ -0,0 +1,99 @@ + + + + Maximum number of characters reached + Slide show + Maximum number of files exceeded + Slideshow settings + Select all + Delete? + Edit + Message + Downloads + Album name already in use + Save + 20 seconds + Activation + Rotate left + 2 seconds + Messages + Done + Unable to rename + Email + Invalid characters + Moved + Cancel + Selected + Delete + Subtitles + Cancel + Maximum number of characters (%d) reached + Maximum number of characters (%d) reached + Slide show + Slide + Start slideshow + %s already exists + Loading... + Albums + Unable to rename. Album name already in use + Operation failed + Saving... + Transition effect + Music + %d items selected + Create folder? + Delete failed + 1 item selected + Video + Zoom + Copy + Iris + Slideshow interval + Video Player + Slideshow + seconds + Rotate left + Page + Copying... + 10 seconds + Processing... + Gallery + No name + Images + Fade + Edit + 5 seconds + No items selected + Deleted + Remove? + Already exists. Overwrite? + Deleting... + Done + 3 seconds + Camera roll + Rotate right + Repeat + Saved + Dissolve + Shuffle + Moving... + Moving failed + Videos + Unsupported file type + Rename + Completed + Select all + All albums + Change name + Move + Unable to delete + Rotate right + Interval + Already exists + Create album + No items + Blind + Saving failed + diff --git a/res/eng-US.xml b/res/eng-US.xml new file mode 100644 index 0000000..f146f3f --- /dev/null +++ b/res/eng-US.xml @@ -0,0 +1,99 @@ + + + + Maximum number of characters reached + Slideshow + Maximum number of files exceeded + Slideshow settings + Select all + Delete? + Edit + Message + Downloads + Album name already in use + Save + 20 seconds + Activation + Rotate left + 2 seconds + Messages + Done + Unable to rename + Email + Invalid characters + Moved + Cancel + Selected + Delete + Subtitles + Cancel + Maximum number of characters (%d) reached + Maximum number of characters (%d) reached + Slide show + Slide + Start slideshow + %s already exists + Loading... + Albums + Unable to rename. Album name already in use. + Operation failed + Saving... + Transition effect + Music + %d items selected + Create folder? + Delete failed + 1 item selected + Video + Zoom + Copy + Iris + Slideshow interval + Video Player + Slideshow + Seconds + Rotate left + Page + Copying... + 10 seconds + Processing... + Gallery + No name + Images + Fade + Edit + 5 seconds + No items selected + Deleted + Remove? + Already exists. Overwrite? + Deleting... + Done + 3 seconds + Camera roll + Rotate right + Repeat + Saved + Dissolve + Shuffle + Moving... + Moving failed + Videos + Unsupported file type + Rename + Completed + Select all + All albums + Change name + Move + Unable to delete + Rotate right + Interval + Already exists + Create album + No items + Blind + Saving failed + diff --git a/res/est-EE.xml b/res/est-EE.xml new file mode 100644 index 0000000..198d820 --- /dev/null +++ b/res/est-EE.xml @@ -0,0 +1,99 @@ + + + + Lubatud arv märke on täis + Slaidiseanss + Failide maksimaalne arv on ületatud + Slaidiseansi seaded + Vali kõik + Kustutada? + Muuda + Sõnum + Allalaet. failid + Albumi nimi juba kasutusel + Salvesta + 20 sekundit + Aktiveerimine + Pööra vasakule + 2 sekundit + Sõnumid + Valmis + Ei saa ümber nimetada + E-post + Lubamatud tähemärgid + Teisaldatud + Tühista + Valitud + Kustuta + Subtiitrid + Tühista + Maksimaalne tähemärkide arv (%d) on saavutatud + Maksimaalne tähemärkide arv (%d) on saavutatud + Slaidis. + Slaid + Käivita slaidiseanss + %s on juba olemas + Laadimine... + Albumid + Ei saa ümber nimetada. Albumi nimi on juba kasutusel + Toiming nurjus + Salvestamine... + Ülemineku efekt + Muusika + %d üksust on valitud + Kas luua kaust? + BT-peakomplekt sees + 1 üksus on valitud + Video + Suumi + Kopeeri + Iiris + Slaidiseansi intervall + Videomängija + Slaidiseanss + sekundit + Pööra vasakule + Lehekülg + Kopeerimine... + 10 sekundit + Töötlemine... + Galerii + Nimi puudub + Pildid + Hajumine + Muuda + 5 sekundit + Ühtegi üksust ei ole valitud + Kustutatud + Eemaldada? + On juba olemas. Kas kirjutada üle? + Kustutamine... + Valmis + 3 sekundit + Kaamera rullik + Pööra paremale + Korda + Salvestatud + Lahuta + Juhuesitus + Teisaldamine... + Teisaldamine nurjus + Videod + Mittetoetatud failitüüp + Nimeta ümber + Lõpule viidud + Vali kõik + Kõik albumid + Muuda nime + Teisalda + Ei saa kustutada + Pööra paremale + Intervall + Juba olemas + Loo album + Üksusi ei ole + Vari + Salvestamine nurjus + diff --git a/res/eus-ES.xml b/res/eus-ES.xml new file mode 100644 index 0000000..450a54d --- /dev/null +++ b/res/eus-ES.xml @@ -0,0 +1,99 @@ + + + + Gehienezko karaktere kopurura heldu zara + Diapositiba aurkezpena + Gehienezko fitxategi kopurua gainditu duzu + Erakusketaren ezarpenak + Denak aukeratu + Ezabatu? + Editatu + Mezua + Deskargak + Izen hori erabilia dago + Gorde + 20 segundo + Aktibazioa + Ezkerrera biratu + 2 segundo + Mezuak + Amaituta + Ezin da berrizendatu + Posta elektroniko mezuak + Karaktere baliogabeak + Mugitua + Ezeztatu + Aukeratutakoa(k) + Ezabatu + Azpitituluak + Ezeztatu + Gehienezko karaktere kopurura (%d) iritsi zara + Gehienezko karaktere kopurura (%d) iritsi zara + Erakusketa + Diapositiba + Hasi diaporama + %s dagoeneko bada + Kargatzen... + Albumak + Ezin zaio izen berria jarri. Izen hori erabilia dago + Eragiketak huts egin du + Gordetzen + Trantsizio efektua + Musika + %d elementu hautatu dira + Karpeta sortu? + Akatsa ezabatzerakoan + Elementu 1 hautatu da + Bideoa + Zooma + Kopiatu + Irisa + Aurkzpen tartea + Bideo Jogailua + Aurkezpena + segundoak + Ezkerrera biratu + Orria + Kopiatzen... + 10 segundo + Prozesatzen... + Galeria + Izenik gabe + Irudiak + Koloregabetu + Editatu + 5 segundo + Ez da elementurik aukeratu + Ezabatua + Kendu? + Dagoeneko bada. Berridatzi? + Ezabatzen... + Amaituta + 3 segundo + Kamera erroilua + Eskuinera biratu + Errepikatu + Gordeta + Disolbatu + Ausazko ordena + Mugitzen... + Errorea mugitzerakoan + Bideoak + Fitx. mota ez da onartzen + Berrizendatu + Osatua + Haut. den. + Album guztiak + Izena aldatu + Mugitu + Ezin da ezabatu + Eskuinera biratu + Tartea + Dagoeneko badago + Albuma sortu + Elementurik ez + Itsua + Errorea gordetzerakoan + diff --git a/res/fas-AF.xml b/res/fas-AF.xml new file mode 100644 index 0000000..3eca367 --- /dev/null +++ b/res/fas-AF.xml @@ -0,0 +1,99 @@ + + + + تعداد کاراکترها به حداکثر رسیده + اسلايد شو + به حداکثر تعداد مجاز فایل رسیده اید + تنظیمات نمایش اسلاید + انتخاب همه + حذف شود؟ + تصحيح + پيام + دانلودها + نام آلبوم از قبل موجود است + ثبت + 20ثانیه + فعال سازی + چرخش به چپ + 2ثانیه + پيام ها + انجام + تغییر نام ممکن نیست.\nفایل در حال استفاده است + ایمیل + نویسه ها نامعتبر است + منتقل شد + لغو + منتخب + حذف + زیرنویس ها + لغو + به حداکثر تعداد کاراکتر های (%d) رسیده اید + به حداکثر تعداد کاراکتر های (%d) رسیده اید + اسلاید شو + کشویی + شروع نمایش اسلاید + %s از قبل وجود دارد + در حال دانلود... + آلبوم ها + تغییر نام امکانپذیر نیست. نام آلبوم از قبل موجود است + عملکرد انجام نشد + درحال ثبت… + جلوه تغییر وضعیت + موزیک + %d مورد انتخاب شد + ايجاد پوشه؟ + عدم موفقیت در حذف + 1 مورد انتخاب شد + فيلم + زوم + کپی + Iris + فاصله زمانی نمایش اسلاید + پخش کننده فیلم + نمایش اسلاید + ثانيه + چرخش به چپ + صفحه + در حال کپی... + 10ثانیه + در حال انجام... + گالری + بدون نام + تصاوير + ناپدید شدن تدریجی + تصحيح + 5 ثانيه + موردی برای انتخاب وجود ندارد + حذف شد + حذف؟ + از قبل وجود دارد. رونویسی شود؟ + در حال حذف... + انجام + 3ثانیه + فهرست دوربین + چرخش به راست + تکرار + ثبت شد + مخلوط شدن تصاویر + انتخاب دستگاه + در حال انتقال + عدم موفقیت در انتقال + فیلمها + نوع فایل پشتیبانی نشده + تعويض نام + انجام شد + انتخاب همه + همه آلبوم ها + تعويض نام + انتقال + غير قابل حذف + چرخش به راست + مدت زمان + موجود است + ایجاد آلبوم + موردی نیست + چراغ چشمک زن + عدم موفقیت در ذخیره سازی + diff --git a/res/fin-FI.xml b/res/fin-FI.xml new file mode 100644 index 0000000..2bcf2b3 --- /dev/null +++ b/res/fin-FI.xml @@ -0,0 +1,99 @@ + + + + Merkkien enimmäismäärä saavutettu + Diaesitys + Tiedostojen enimmäismäärä on ylitetty + Kuvaesityksen asetukset + Valitse kaikki + Poistetaanko? + Muokkaa + Viesti + Lataukset + Albumin nimi jo käytössä + Tallenna + 20 sekuntia + Aktivointi + Kierrä vastapäivään + 2 sekuntia + Viestit + Valmis + Ei voi nimetä uudelleen + Sähköposti + Virheellisiä merkkejä + Siirretty + Peruuta + Valittu + Poista + Tekstitys + Peruuta + Merkkien enimmäismäärä (%d) on saavutettu + Merkkien enimmäismäärä (%d) on saavutettu + Diaesitys + Dia + Käynnistä kuvaesitys + %s on jo olemassa + Ladataan... + Albumit + Ei voi nimetä uudelleen. Albumin nimi on jo käytössä + Toiminto epäonnistui + Tallennetaan... + Siirtymätehoste + Musiikki + %d kohdetta valittu + Luodaanko kansio? + Poisto epäonnistui + 1 kohde valittu + Video + Zoomaus + Kopioi + Iris + Kuvaesityksen aikaväli + Videosoitin + Kuvaesitys + sekuntia + Kierrä vastapäivään + Sivu + Kopioidaan... + 10 sekuntia + Käsitellään... + Galleria + Ei nimeä + Kuvat + Häivytä + Muokkaa + 5 sekuntia + Ei valittuja kohteita + Poistettu + Poistetaanko? + On jo olemassa. Päivitetäänkö? + Poistetaan... + Valmis + 3 sekuntia + Kamerarulla + Kierrä myötäpäivään + Toista + Tallennettu + Ristikuva + Sekoitus + Siirretään... + Siirto epäonnistui + Videot + Tiedostotyyppiä ei tueta + Nimeä uudelleen + Valmis + V. kaikki + Kaikki albumit + Vaihda nimi + Siirrä + Ei voi poistaa + Kierrä myötäpäivään + Väli + On jo olemassa + Luo albumi + Ei kohteita + Kaihdin + Tallentaminen epäonnistui + diff --git a/res/fra-CA.xml b/res/fra-CA.xml new file mode 100644 index 0000000..2a94a11 --- /dev/null +++ b/res/fra-CA.xml @@ -0,0 +1,99 @@ + + + + Nb. max. de caractères atteint + Diaporama + Nombre maximum de fichiers dépassé + Paramètres du diaporama + Sélectionner tout + Supprimer ? + Modifier + Message + Télécharg. + Nom d'album déjà utilisé + Enreg. + 20 secondes + Activation + Pivoter vers la gauche + 2 secondes + Messages + OK + Impossible de renommer l'élément + Courriel + Caractères non valides + Déplacé + Annuler + Sélectionné + Supprimer + Sous-titres + Annuler + Nombre maximum de caractères (%d) atteint + Nombre maximum de caractères (%d) atteint + Diaporama + Diapo + Lancer le diaporama + %s existe déjà + Chargement... + Albums + Impossible de renommer l'élément. Nom d'album déjà utilisé + Échec de l'opération + Enregistrement ... + Effet de transition + Musique + %d éléments sélectionnés + Créer un dossier ? + Échec de suppression + 1 élément sélectionné + Vidéo + Zoom + Copier + Iris + Intervalle du diaporama + Lecteur vidéo + Diaporama + secondes + Pivoter vers la gauche + Page + Copie ... + 10 secondes + Traitement… + Galerie + Aucun nom + Images + Fondu + Modifier + 5 secondes + Aucun élément sélectionné + Supprimé + Retirer? + Existe déjà. L'écraser? + Suppression ... + OK + 3 secondes + Pellicule + Pivoter vers la droite + Répéter + Enregistré + Fondu enchainé + Mode aléatoire + Déplacement... + Échec du déplacement + Vidéos + Type fichier non supporté + Renommer + OK + Sélectionner tout + Tous les albums + Modifier le nom + Déplacer + Suppression impossible + Pivoter vers la droite + Intervalle + Existe déjà + Créer un album + Aucun élément + Stores vénitiens + Échec de l'enregistrement + diff --git a/res/fra-FR.xml b/res/fra-FR.xml new file mode 100644 index 0000000..e89084e --- /dev/null +++ b/res/fra-FR.xml @@ -0,0 +1,99 @@ + + + + Nb. max. de caractères atteint + Diaporama + Nombre maximum de fichiers dépassé + Paramètres du diaporama + Sélect. tout + Supprimer ? + Modifier + Message + Téléchargements + Nom d'album déjà utilisé + Enregistrer + 20 secondes + Activation + Rotation à gauche + 2 secondes + Messages + Effectué + Impossible de renommer l'élément + Email + Caractères non valides + Déplacé + Annuler + Sélectionné + Supprimer + Sous-titres + Annuler + Le nombre maximum de caractères (%d) est atteint + Le nombre maximum de caractères (%d) est atteint + Diaporama + Défilement + Lancer le diaporama + %s existe déjà + Chargement en cours. + Albums + Impossible de renommer l'élément. Nom d'album déjà utilisé + Échec de l'opération + Enregistrement... + Effet de transition + Musique + %d éléments sélectionnés + Créer un dossier ? + Échec de suppression + 1 élément sélectionné + Vidéo + Zoom + Copier + Iris + Intervalle du diaporama + Lecteur vidéo + Diaporama + secondes + Rotation à gauche + Page + Copie... + 10 secondes + En cours... + Galerie + Aucun nom + Images + Fondu + Modifier + 5 secondes + Aucun élément sélectionné + Supprimé + Supprimer ? + Existe déjà. L' écraser ? + Suppression... + Effectué + 3 secondes + Pellicule + Rotation à droite + Répéter + Enregistré + Fondu enchaîné + Mode aléatoire + Déplacement... + Échec du déplacement + Vidéos + Type fichier non supporté + Renommer + OK + Sélect. tt + Tous les albums + Modifier le nom + Déplacer + Suppression impossible + Rotation à droite + Intervalle + Existe déjà + Créer un album + Aucun élément + Stores vénitiens + Échec de l'enregistrement + diff --git a/res/gle-IE.xml b/res/gle-IE.xml new file mode 100644 index 0000000..20bcd97 --- /dev/null +++ b/res/gle-IE.xml @@ -0,0 +1,99 @@ + + + + Uaslíon na gcarachtar bainte amach + Taispeántas sleamhnán + Uaslíon na gcomhad sáraithe + Socruithe taispeántais sleamhnán + Roghnaigh gach + Scrios? + Cuir in eagar + Teachtaireacht + Ioslódálacha + Ainm albaim in úsáid cheana + Sábháil + 20 soicind + Gníomhachtú + Rothlaigh ar chlé + 2 shoicind + Teachtaireachtaí + Déanta + Ní féidir athainmniú + R-phost + Carachtair neamhbhailí + Bogtha + Cuir ar ceal + Roghnaithe + Scrios + Fotheidil + Cuir ar ceal + Uaslíon na gcarachtar (%d) bainte amach + Uaslíon na gcarachtar (%d) bainte amach + Sleamhnán + Sleamhnán + Tosaigh ar thaispeántas sleamhnán + Tá %s ann cheana + Ag lódáil... + Albaim + Ní féidir athainmniú. Ainm an albaim in úsáid cheana + Theip ar oibríocht + Ag sábháil... + Maisíocht trasdula + Ceol + %d mír roghnaithe + Déan fillteán? + Theip ar scriosadh + 1 mhír roghnaithe + Físeán + Zúmáil + Cóipeáil + Feileastram + Eatramh taispeántais sleamhnán + Seinnteoir Físeán + Taispeántas sleamhnán + soicindí + Rothlaigh ar chlé + Leathanach + Ag cóipeáil... + 10 soicind + Ag próiseáil... + Gailearaí + Níl ainm ann + Íomhánna + Céimnigh + Cuir in eagar + 5 shoicind + Níor roghnaíodh míreanna + Scriosta + Bain? + Ann cheana. Forscríobh? + Ag scriosadh... + Déanta + 3 shoicind + Rolla ceamara + Rothlaigh ar dheis + Déan arís + Sábháilte + Leáigh + Suaitheadh + Ag bogadh... + Theip ar bhogadh + Físeáin + Cineál comhaid gan tacú + Athainmnigh + Curtha i gcrích + Rogh. gach + Gach albam + Athraigh ainm + Bog + Ní féidir scriosadh + Rothlaigh ar dheis + Eatramh + Ann cheana + Déan albam + Níl míreanna ann + Dallóg + Theip ar shábháil + diff --git a/res/glg-ES.xml b/res/glg-ES.xml new file mode 100644 index 0000000..f3e4e7f --- /dev/null +++ b/res/glg-ES.xml @@ -0,0 +1,99 @@ + + + + Número máximo de caracteres alcanzado + Presentación de diapositivas + Superouse o número máximo de arquivos + Axustes de presentación + Seleccionar todo + Eliminar? + Editar + Mensaxe + Descargas + Nome de álbum xa en uso + Gardar + 20 segundos + Activación + Xirar á esquerda + 2 segundos + Mensaxes + Finalizado + Non se pode cambiar o nome + Correo electrónico + Caracteres non válidos + Movido + Cancelar + Seleccionado + Eliminar + Subtítulos + Cancelar + Alcanzouse o número máximo de carácteres (%d) + Alcanzouse o número máximo de carácteres (%d) + Diapos + Diapositiva + Iniciar presentación de diapositivas + %s xa existe + Cargando... + Álbums + Non se pode cambiar o nome. Nome de álbum xa en uso + Fallo na operación + Gardando... + Efecto de transición + Música + %d elementos seleccionados + Crear carpeta? + Erro ao eliminar + 1 elemento seleccionado + Vídeo + Zoom + Copiar + Iris + Intervalo de presentación + Reprodutor de Vídeo + Presentación + segundos + Xirar á esquerda + Páxina + Copiando... + 10 segundos + Procesando... + Galería + Sen nome + Imaxes + Atenuar + Editar + 5 segundos + Non hai elementos seleccionados + Eliminado + Eliminar? + Xa existe. Sobrescribir? + Eliminando... + Finalizado + 3 segundos + Rolo de cámara + Xirar á dereita + Repetir + Gardado + Fundir + Orde aleatoria + Movendo... + Erro ao mover + Vídeos + Tipo de arq. non admitido + C. nome + Completada + Selec todo + Todos os álbums + Cambiar nome + Mover + Non se pode eliminar + Xirar á dereita + Intervalo + Xa existe + Crear álbum + Sen elementos + Persiana + Erro ao gardar + diff --git a/res/hin-IN.xml b/res/hin-IN.xml new file mode 100644 index 0000000..cb453cf --- /dev/null +++ b/res/hin-IN.xml @@ -0,0 +1,99 @@ + + + + वर्णो की संख्‍या अधिकतम पहुँची + स्लाइड शो + फ़ाइल की संख्‍या अधिकतम तक पहुँची + स्लाइड शो सेटिंग्स + सभी चुनें + हटाएँ? + संपादित करें + सन्देश + डाउनलोड + अल्बम नाम पहले से उपयोग में + सुरक्षित + 20 सेकंड + सक्रियण + बाएँ घुमाएँ + 2 सेकंड + सन्देश + हुआ + नाम बदलने में अक्षम + ईमेल + अमान्य वर्ण + ले जाया गया + रद्द करें + चुना गया + हटाएँ + उपशीर्षक + रद्द करें + वर्णों की अधिकतम संख्या (%d) तक पहुँच गया + वर्णों की अधिकतम संख्या (%d) तक पहुँच गया + स्लाइड शो + स्लाइड + स्लाइडशो प्रारंभ करें + %s पहले से मौजूद है + लोड हो रहा है... + एल्बम्स + पुनर्नामित करने में अक्षम. अल्बम नाम पहले से उपयोग में + कार्रवाई विफल + सुरक्षित हो रहा है... + परिवर्तन प्रभाव + संगीत + %d मदें चयनित + फोल्डर बनाएं? + हटाना विफल + 1 मद चयनित + विडियो + ज़ूम + कॉपी करें + आइरिस + स्लाइड शो अंतराल + वीडियो प्‍लेयर + स्लाइड शो + सेकेंड + बाएँ घुमाएँ + पेज + कॉपी कर रहा है… + 10 सेकंड + प्रोसेस हो रहा है… + गैलरी + नाम नहीं + छवियाँ + फीका + संपादित करें + 5 सेकंड + कोई मद चयनित नहीं + हटाया गया + हटाएँ? + पहले से मौजूद है। ओवरराइट करें? + हटाया जा रहा है… + हुआ + 3 सेकंड + कैमरा रोल + दाएँ घुमाएँ + दोहराव + सुरक्षित किया + विलय + शफ़ल + ले जा रहा है… + ले जाना विफल हुआ + विडियो + असमर्थित फ़ाइल प्रकार + पुन: नाम दें + पूर्ण + सभी चुनें + सभी एलबम्‍स + नाम बदलें + ले जाएँ + हटाने में अक्षम + दाएँ घुमाएँ + अन्तराल + पहले से ही मौजूद + अल्बम बनाएँ + कोई मदें नहीं + ब्लाइंड + सुरक्षित करना विफल + diff --git a/res/hrv-HR.xml b/res/hrv-HR.xml new file mode 100644 index 0000000..94a1d59 --- /dev/null +++ b/res/hrv-HR.xml @@ -0,0 +1,99 @@ + + + + Maks. broj znakova + Prezentacija + Maks. broj datoteka + Postavke prezentacije + Odaberi sve + Obrisati? + Uredi + Poruka + Skidanja + Već postoji naziv albuma + Spremi + 20 sek + Uključivanje + Rotiraj ulijevo + 2 sek + Poruke + OK + Nemoguće preimenovati + Email + Neispravni znakovi + Premješteno + Prekid + Odabrano + Obriši + Titlovi + Prekid + Maksimalan broj znakova (%d) + Maksimalan broj znakova (%d) + Prezentacija + Listanje + Pokreni prezentaciju + %s već postoji + Učitavanje... + Albumi + Nemoguće preimenovati. Već postoji naziv albuma + Neuspješno + Spremanje... + Efekt prijelaza + Glazba + %d odabranih stavki + Nova mapa? + Brisanje neuspješno + 1 stavka odabrana + Video + Zoom + Kopiraj + Iris + Interval prezentacije + Video Player + Prezentacija + sekundi + Rotiraj ulijevo + Stranica + Kopiranje... + 10 sek + Procesiranje... + Album + Nema imena + Slike + Zatamni + Uredi + 5 sek + Ništa odabrano + Obrisano + Ukloniti? + Već postoji. Piši preko? + Brisanje... + OK + 3 sek + Snimke kamere + Rotiraj udesno + Ponavljanje + Spremljeno + Razrijedi + Nasumično + Premještanje... + Premještanje neuspješno + Video + Nepodržana vrsta datoteka + Preimenuj + Obavljeno + Označi sve + Svi albumi + Promijenite ime + Premjesti + Brisanje nemoguće + Rotiraj udesno + Interval + Već postoji + Novi album + Nema stavki + Roleta + Spremanje neuspješno + diff --git a/res/hun-HU.xml b/res/hun-HU.xml new file mode 100644 index 0000000..02e98c5 --- /dev/null +++ b/res/hun-HU.xml @@ -0,0 +1,99 @@ + + + + Nincs hely több karakternek + Diavetítés + Elérte a fájlok maximális számát + Diabemutató beállításai + Összes kijelölése + Törli? + Szerkeszt + Üzenet + Letöltések + Ilyen albumnév már van + Ment + 20 másodperc + Aktivál + Forgatás balra + 2 másodperc + Üzenetek + Kész + Nem lehet átnevezni + E-mail + Érvénytelen karakterek + Áthelyezve + Mégse + Kiválasztott + Töröl + Feliratok + Mégse + Elérte a karakterek maximális számát (%d) + Elérte a karakterek maximális számát (%d) + Diavet. + Dia + Diabemutató indítása + Már van %s nevű fájl + Betöltés... + Albumok + Nem lehet átnevezni. Ilyen albumnév már van + Sikertelen művelet + Mentés... + Áttűnés + Zenék + %d tétel kijelölve + Mappát hoz létre? + Törlés sikertelen + 1 tétel kijelölve + Videó + Nagyítás + Másol + Írisz + Diabemutató intervalluma + Videolejátszó + Diabemutató + másodperc + Forgatás balra + Oldal + Másolás... + 10 másodperc + Feldolgozás folyamatban + Galéria + Nincs név + Képek + Áttűnés + Szerkeszt + 5 másodperc + Nincs kiválasztott tétel + Törölve + Törli? + Már létezik. Felülírja? + Törlés... + Kész + 3 másodperc + Filmszalag + Forgatás jobbra + Ismétlés + Mentve + Áttűnés + Véletlen sorrend + Áthelyezés... + Az áthelyezés sikertelen + Videók + Nem támogatott fájltípus + Átnevez + Kész + Mind kijel. + Összes album + Név módosítása + Áthelyez + Nem törölhető + Forgatás jobbra + Intervallum + Már létezik + Album létrehozása + Nincs tétel + Rács + A mentés nem sikerült + diff --git a/res/hye-AM.xml b/res/hye-AM.xml new file mode 100644 index 0000000..f68f465 --- /dev/null +++ b/res/hye-AM.xml @@ -0,0 +1,99 @@ + + + + Հասել եք նիշերի առավելագույն քանակին + Սլայդ շոու + Ֆայլերի առավելագույն քանակը գերազանցվել է + Սահկահանդեսի ընտրանքները + Ընտրել բոլորը + Ջնջե՞լ + Խմբագրել + Հաղորդագրություն + Բեռնումներ + Ալբմի անունն արդեն գրծվմ է + Պահպանել + 20 վայրկյան + Ակտիվացում + Պտտել ձախ + 2 վայրկյան + Հղրդգրթ + Պատրաստ + Հնարավոր չէ վերանվանել + Էլ.փոստ + Անվավեր նիշեր + Տեղափոխված է + Չեղարկել + Ընտրված + Ջնջել + Ենթավերնագրեր + Չեղարկել + Հասել է նիշերի առավելագույն քանակին (%d) + Հասել է նիշերի առավելագույն քանակին (%d) + Սլյդ շոու + Սլայդ + Սկսել սլայդերի ցուցադրում + %s-ն արդեն գոյություն ունի + Բեռնում է... + Ալբոմներ + Անհնար է վերանվանել: Ալբոմի անունն արդեն գործածվում է + Գործողությունը ձախողվեց + Պահպանում է... + Փոխանցման էֆեկտ + Երաժշտությն + %d տարր է ընտրվել + Ստեղծե՞լ թղթապանակ + Ջնջումը ձախողվեց + 1 տարր է ընտրվել + Վիդեո + Մասշտաբ + Պատճենել + Ծիածան + Սահկահանդեսի միջակայքը + Տեսանվագարկիչ + Սահկահանդես + վայրկյաններ + Պտտել ձախ + Էջ + Պատճենում է... + 10 վայրկյան + Ընթացքում է + Պատկերասրահ + Անուն չկա + Պատկերներ + Անհետացող + Խմբագրել + 5 վայրկյան + Որևէ տարր ընտրված չէ + Ջնջված է + Հեռացնե՞լ + Արդեն գոյություն ունի: Վերագրանցե՞լ + Ջնջվում է... + Կատարված է + 3 վայրկյան + Խցիկի հոլովակ + Պտտել աջ + Կրկնել + Պահպանվեց + Լուծել + Պատահական + Տեղափոխում... + Տեղափոխումը ձախողվեց + Տեսահոլովակներ + Ֆայլի չապահովված տիպ + Վերանվանել + Ավարտված է + Ընտրել բլր + Բոլոր ալբոմները + Փոխել անունը + Տեղափոխել + Անհար է ջնջել + Պտտել աջ + Դադար + Արդեն գոյություն ունի + Ստեղծել ալբոմ + Տարրեր չկան + Գալարավարագույր + Պահպանումը ձախողվեց + diff --git a/res/isl-IS.xml b/res/isl-IS.xml new file mode 100644 index 0000000..32f9bc7 --- /dev/null +++ b/res/isl-IS.xml @@ -0,0 +1,99 @@ + + + + Hámarksfjölda stafa hefur verið náð + Glærusýning + Komið er fram yfir hámarksfjölda skráa + Stillingar skyggnusýningar + Velja allt + Á að eyða? + Breyta + Skilaboð + Niðurhal + Heitið er þegar í notkun + Vista + 20 sekúndur + Virkjun + Snúið til vinstri + 2 sekúndur + Skilaboð + Lokið + Mistókst að breyta heiti + Tölvupóstur + Ógildir stafir + Flutt + Hætta við + Valið + Eyða + Texti + Hætta við + Hámarkfjölda stafa (%d) hefur verið náð + Hámarkfjölda stafa (%d) hefur verið náð + Skyggnur + Glæra + Hefja skyggnusýningu + %s er til fyrir + Hleð... + Möppur + Mistókst að endurnefna. Heitið er þegar í notkun + Aðgerð mistókst + Vista... + Skipting + Tónlist + %d atriði valin + Á að búa til möppu? + Ekki tókst að eyða + 1 atriði valið + Myndskeið + Aðdráttur + Afrita + Augasteinn + Tími milli mynda + Myndspilari + Skyggnusýning + sekúndur + Snúið til vinstri + Síða + Afritun stendur yfir... + 10 sekúndur + Vinnsla í gangi... + Gallerí + Ekkert heiti + Myndir + Lækka + Breyta + 5 sekúndur + Það eru engir hlutir valdir + Eytt + Á að fjarlægja? + Er þegar til. Viltu skrifa yfir? + Verið er að eyða... + Lokið + 3 sekúndur + Myndarúlla + Snúið til hægri + Endurtaka + Vistað + Leysa upp + Stokka + Verið er að flytja... + Ekki tókst að flytja + Myndskeið + Óstudd skráargerð + Endurnefna + Lokið + Velja allt + Allar plötur + Breyta heiti + Færa + Það er ekki hægt að eyða + Snúið til hægri + Bil + Er þegar til + Búa til albúm + Engin atriði + Rimlagardína + Mistókst að vista + diff --git a/res/ita-IT.xml b/res/ita-IT.xml new file mode 100644 index 0000000..0454e0b --- /dev/null +++ b/res/ita-IT.xml @@ -0,0 +1,99 @@ + + + + Raggiunto numero massimo di caratteri + Presentazione + Superato numero massimo di file + Impostazioni presentazione + Seleziona tutto + Eliminare? + Modifica + Messaggio + Download + Nome album già in uso + Salva + 20 secondi + Attivazione + Ruota a sinistra + 2 secondi + Messaggi + Fatto + Impossibile rinominare + E-mail + Caratteri non validi + Spostato + Annulla + Selezionato + Elimina + Sottotitoli + Annulla + Raggiunto numero massimo di caratteri (%d) + Raggiunto numero massimo di caratteri (%d) + Present. + Scorrimento + Avvia presentazione + %s esiste già + Caricamento... + Album + Impossibile rinominare. Nome album già in uso + Operazione non eseguita + Salvataggio... + Effetto di transizione + Musica + %d elementi selezionati + Creare cartella? + Eliminazione non riuscita + 1 elemento selezionato + Video + Zoom + Copia + Iride + Intervallo presentazione + Lettore video + Presentazione + secondi + Ruota a sinistra + Pagina + Copia... + 10 secondi + Elaborazione... + Galleria + Nessun nome + Immagini + Sfumatura + Modifica + 5 secondi + Nessun elemento selezionato + Eliminato/i + Rimuovere? + Già esistente. Sovrascrivere? + Eliminazione... + Fatto + 3 secondi + Foto personali + Ruota a destra + Ripeti + Salvato + Dissolvenza + Riproduzione casuale + Spostamento... + Spostamento non riuscito + Video + Tipo di file non support. + Rinomina + Fatto + Sel. tutto + Tutti gli album + Cambia nome + Sposta + Impossibile eliminare + Ruota a destra + Intervallo + Già esiste + Crea album + Nessun elemento + Veneziana + Errore durante il salvataggio + diff --git a/res/jpn-JP.xml b/res/jpn-JP.xml new file mode 100644 index 0000000..0a46aad --- /dev/null +++ b/res/jpn-JP.xml @@ -0,0 +1,99 @@ + + + + 最大文字数に達しました。 + スライドショー + ファイルの最大件数を超えています。 + スライドショーの設定 + 全て選択 + 削除しますか? + 編集 + メッセージ + ダウンロード + アルバム名は既に使用しています。 + 保存 + 20秒 + アクティベーション + 左に回転 + 2秒 + メッセージ + 完了 + 名前を変更できません。 + Eメール + 無効な文字です。 + 移動しました。 + キャンセル + 選択済み + 削除 + 字幕 + キャンセル + 最大文字数(%d)に達しました。 + 最大文字数(%d)に達しました。 + スライドショー + スライド + スライドショーを開始 + %sは既に存在します。 + 読み込み中... + アルバム + 名前​を​変更​できません。​アルバム名​は​既に​使用​されて​います + 操作に失敗しました。 + 保存中... + 通過効果 + 音楽 + %d件選択 + フォルダを作成しますか? + 削除できませんでした。 + 1件選択 + 動画 + ズーム + コピー + アイリス + スライドショーの間隔 + 動画 + スライドショー + 秒 + 左に回転 + ページ + コピー中... + 10秒 + 処理中... + ギャラリー + 名前なし + 画像 + フェード + 編集 + 5秒 + アイテムを選択していません。 + 削除しました。 + 削除しますか? + 同名ファイルがあります。上書きしますか? + 削除中... + 完了 + 3秒 + カメラロール + 右に回転 + 繰り返し + 保存しました。 + ディゾルブ + シャッフル + 移動中... + 移動に失敗しました。 + 動画 + 未対応のファイルです + 名前を変更 + 完了しました。 + 全て選択 + 全アルバム + 名前を変更 + 移動 + 削除できません。 + 右に回転 + 間隔 + 既に登録されています。 + アルバム​作成 + アイテムがありません。 + ブラインド + 保存に失敗しました。 + diff --git a/res/kat-GE.xml b/res/kat-GE.xml new file mode 100644 index 0000000..d715dee --- /dev/null +++ b/res/kat-GE.xml @@ -0,0 +1,99 @@ + + + + მიღწეულია სიმბოლოების მაქსიმალური რაოდენობა + სლაიდშოუ + გადაჭარბებულია ფაილების მაქსიმალური რაოდენობა + სლაიდ–შოუს პარამეტრები + ყველას არჩევა + წაიშალოს? + შეცვლა + შეტყობინება + გადმოწერილები + ალბომის სახელი უკვე არის + შენახვა + 20 წამი + გააქტიურება + მარცხნივ მოტრიალება + 2 წამი + შეტყობინებები + შესრულდა + სახელს ვერ შეცვლით + ელ-ფოსტა + სიმბოლოები არასწორია + გადატანილია + გაუქმება + შერჩეული + წაშლა + სუბტიტრები + გაუქმება + მიღწეულია სიმბოლოების მაქსიმალური რაოდენობა (%d) + მიღწეულია სიმბოლოების მაქსიმალური რაოდენობა (%d) + სლაიდ–შოუ + სლაიდი + სლაიდშოუს დაწყება + %s უკვე არსებობს + იტვირთება... + ალბომები + სახელს ვერ შეცვლით. ალბომის სახელი უკვე გამოყენებულია + ოპერაცია ვერ შესრულდა + ინახება... + გადასვლის ეფექტი + მუსიკა + არჩეულია %d ელემენტი + შექმნით საქაღალდეს? + წაშლა არ მოხერხდა + არჩეულია 1 ელემენტი + ვიდეო + მასშტაბი + ასლი + ირისი + სლაიდ–შოუს ინტერვალი + ვიდეო პლეერი + სლაიდ–შოუ + წამი + მარცხნივ მოტრიალება + გვერდი + კოპირდება... + 10 წამი + მუშავდება... + გალერეა + უსახელო + გამოსახულებები + ნელ-ნელა ჩაქრობა + შეცვლა + 5 წამი + ელემენტი არ არის შერჩეული + წაშლილია + წაიშალოს? + უკვე არსებობს. გადავაწერო? + წაშლა... + შესრულებულია + 3 წამი + ვიდეოფრაგმენტი + მარჯვნივ მოტრიალება + გამეორება + შენახულია + თანდათან გაქრობა + გადანაცვლება + გადატანა... + გადატანა ვერ შესრულდა + ვიდეოები + ფაილის ტიპი გაუთვალისწინ. + ხელახლა დასათაურება + დასრულდა + ყველა + ყველა ალბომი + სახელის შეცვლა + გადატანა + წაშლა შეუძლებელია + მარჯვნივ მოტრიალება + ინტერვალი + უკვე არის + ალბომის შექმნა + ელემენტები არ არის + დაბინდვა + ვერ შეინახა + diff --git a/res/kaz-KZ.xml b/res/kaz-KZ.xml new file mode 100644 index 0000000..cb945a7 --- /dev/null +++ b/res/kaz-KZ.xml @@ -0,0 +1,99 @@ + + + + Таңбалардың ен көп саны артты + Слайд-шоу + Ең көп файлдар санынан асып кетті + Слайдшоу параметрлері + Бәрін бөлектеу + Өшіресіз бе? + Өзгерту + Хабарлама + Жазылған + Альбом атауы пайдаланылуда + Сақтау + 20 секунд + Активтеу + Солға бұру + 2 секунд + Хабарламалар + Дайын + Атын өзгерту мүмкін емес + Эл. пошта + Қате әріптер + Орналастырылды + Тоқтату + Таңдалды + Жою + Субтитрлер + Тоқтату + Ең көп таңбалар санына (%d) жетті + Ең көп таңбалар санына (%d) жетті + Слайдшоу + Слайд + Слайдшоуды бастау + %s бар + Жазылуда... + Альбомдар + Атауын өзгерту мүмкін емес. Альбомның атауы пайдаланылуда + Әрекет сәтсіз аяқталды + Сақталуда... + Өтпелі әсер + Музыка + %d элемент таңдалды + Қалта құрасыз ба? + Жою үстінде үзіліп кетті + 1 элемент таңдалды + Бейне + Ауқымы + Көшіру + Жыланқияқ + Слайдшоу аралығы + Бейне ойнатқыш + Слайдшоу + секунд + Солға бұру + Бет + Көшірілуде... + 10 секунд + Өңделуде... + Галерея + Ондай есім жоқ + Суреттер + Тегіс пайда болу + Өзгерту + 5 секунд + Мазмұны таңдалған жоқ + Жойылды + Жоясыз ба? + Бар. Қайта жазу керек пе? + Жойылуда... + Аяқталды + 3 секунд + Камера білігі + Оңға бұру + Қайталау + Сақталған + Жоқ болу + Кездейсоқ тәртіп + Орналастырылды + Орналастырылмады + Бейнежазбалар + Қолданылмайтын файл түрі + Атын өзгерту + Аяқталды + Барл. таң. + Барлық альбомдар + Атын өзгерту + Орналастыру + Жою мүмкін емес + Оңға бұру + Аралық + Қолданыста бар + Альбом жасау + Баптар жоқ + Көрінбейді + Сақтау сәтсіз + diff --git a/res/kor-KR.xml b/res/kor-KR.xml new file mode 100644 index 0000000..e17ff69 --- /dev/null +++ b/res/kor-KR.xml @@ -0,0 +1,99 @@ + + + + 입력 가능한 최대 글자수를 초과하였습니다 + 슬라이드쇼 + 최대 파일 수를 초과하였습니다 + 슬라이드쇼 설정 + 모두 선택 + 삭제할까요? + 편집 + 메시지 + 다운로드 관리 + 사용 중인 이름입니다 + 저장 + 20초 + 실행 + 왼쪽으로 회전 + 2초 + 메시지 + 완료 + 이름을 변경할 수 없습니다 + 이메일 + 글자가 바르지 않습니다 + 이동되었습니다 + 취소 + 단일 선택 + 삭제 + 자막 + 취소 + 최대 글자 수(%d개)를 초과하였습니다 + 최대 글자 수(%d개)를 초과하였습니다 + 슬라이드쇼 + 슬라이드 + 슬라이드쇼 시작 + %s이(가) 저장되어 있습니다 + 로딩 중... + 앨범 + 사용 중인 앨범 이름이므로 변경할 수 없습니다 + 작업을 수행하지 못하였습니다 + 저장 중... + 전환 효과 + 음악 + %d개의 항목이 선택되었습니다 + 폴더를 추가할까요? + 삭제하지 못하였습니다 + 1개의 항목이 선택되었습니다 + 동영상 + 확대/축소 + 복사 + 아이리스 + 슬라이드쇼 전환 간격 + 비디오 플레이어 + 슬라이드쇼 + 초 + 왼쪽으로 회전 + 페이지 + 복사 중... + 10초 + 처리 중... + 갤러리 + 이름이 없습니다 + 이미지 + 페이드 + 편집 + 5초 + 선택된 항목이 없습니다 + 삭제되었습니다 + 제거할까요? + 사용 중인 이름입니다. 덮어쓸까요? + 삭제 중... + 완료 + 3초 + 카메라 앨범 + 오른쪽으로 회전 + 반복 + 저장되었습니다 + 디졸브 + 셔플 + 이동 중... + 이동하지 못하였습니다 + 동영상 + 지원되지 않는 파일 형식입니다 + 이름 변경 + 완료되었습니다 + 모두 선택 + 모든 앨범 + 이름 변경 + 이동 + 삭제할 수 없습니다 + 오른쪽으로 회전 + 간격 + 이미 저장되어 있습니다 + 앨범 추가 + 항목이 없습니다 + 블라인드 + 저장하지 못하였습니다 + diff --git a/res/lav-LV.xml b/res/lav-LV.xml new file mode 100644 index 0000000..75f04fa --- /dev/null +++ b/res/lav-LV.xml @@ -0,0 +1,99 @@ + + + + Sasniegts maksimālais rakstzīmju skaits + Slaidrāde + Pārsniegts maksimālais failu skaits + Slaidrādes iestatījumi + Izv. visu + Vai dzēst? + Rediģēt + Ziņa + Lejupielādes + Alb.nosauk. jau tiek liet. + Saglabāt + 20 sekundes + Aktivizēšana + Pagriezt pa kreisi + 2 sekundes + Ziņas + Gatavs + Nevar pārdēvēt + E-pasts + Nederīgas rakstzīmes + Pārvietots + Atcelt + Izvēlēts + Dzēst + Subtitri + Atcelt + Sasniegts maksimālais rakstzīmju skaits (%d) + Sasniegts maksimālais rakstzīmju skaits (%d) + Slaidrāde + Slaids + Sākt slaidrādi + %s jau pastāv + Ielādē... + Albumi + Nevar pārdēvēt. Albuma nosaukums jau tiek lietots + Darbība neizdevās + Saglabā... + Pārejas efekts + Mūzika + Ir izvēlēti %d objekti + Vai izveidot mapi? + Neizdevās izdzēst + Ir izvēlēts 1 objekts + Video + Tālummaiņa + Kopēt + Varavīksne + Slaidrādes intervāls + Video atskaņotājs + Slaidrāde + sekundes + Pagriezt pa kreisi + Lapa + Kopē... + 10 sekundes + Notiek apstrāde... + Galerija + Nav vārda + Attēli + Izgaist + Rediģēt + 5 sekundes + Nav izvēlētu objektu + Izdzēsts + Vai noņemt? + Jau pastāv. Vai pārrakstīt? + Dzēš... + Gatavs + 3 sekundes + Kam.fotoatt.rul. + Pagriezt pa labi + Atkārtot + Saglabāts + Izšķīdināt + Jaukt + Pārvieto... + Pārvietošana neizdevās + Video + Neatbalstīts faila tips + Pārdēvēt + Pabeigts + Izv. visu + Visi albumi + Mainīt vārdu + Pārvietot + Nevar izdzēst + Pagriezt pa labi + Intervāls + Jau pastāv + Izveidot albumu + Nav vienumu + Aizēnošana + Saglabāšana neizdevās + diff --git a/res/lit-LT.xml b/res/lit-LT.xml new file mode 100644 index 0000000..fd405be --- /dev/null +++ b/res/lit-LT.xml @@ -0,0 +1,99 @@ + + + + Pasiektas didžiausias simbolių skaičius + Skaidrių demonstravimas + Viršytas didžiausias leistinas failų skaičius + Skaidrių rodymo nustatymai + Pasirinkti viską + Ar trinti? + Redaguoti + Žinutė + Atsisiųsti elem. + Albumo pavadinimas jau yra + Išsaugoti + 20 sekundžių + Aktyvinimas + Sukti į kairę + 2 sekundės + Žinutės + Atlikta + Neįmanoma pervardinti + El. paštas + Neteisingi simboliai + Perkelta + Atšaukti + Pasirinkta + Trinti + Subtitrai + Atšaukti + Pasiektas didžiausias simbolių skaičius (%d) + Pasiektas didžiausias simbolių skaičius (%d) + Skaid.rod. + Skaidrė + Pradėti skaidrių rodymą + %s jau yra + Įkeliama... + Albumai + Neįmanoma pakeisti pavadinimo. Toks albumo pavadinimas jau yra + Veiksmas nepavyko + Įrašoma... + Perėjimo efektas + Muzika + Pasirinkta elementų: %d + Ar kurti aplanką? + Ištrinti nepavyko + Pasirinktas 1 elementas + Vaizdo įrašas + Mastelio keitimas + Kopijuoti + Rainelė + Skaidrių rodymo intervalas + Vaizdo įrašų leistuvas + Skaidrių rodymas + sekundės + Sukti į kairę + Puslapis + Kopijuojama... + 10 sekundžių + Apdorojama... + Galerija + Nėra vardo + Vaizdai + Išblukimas + Redaguoti + 5 sekundės + Niekas nepasirinkta + Ištrinta + Ar šalinti? + Jau yra. Perrašyti? + Trinama... + Atlikta + 3 sekundės + Nuotr. rodymas + Sukti į dešinę + Kartoti + Išsaugota + Panaikinti + Maišyti + Perkeliama... + Perkelti nepavyko + Vaizdo įrašai + Nepalaikomas failo tipas + Pervardyti + Atlikta + Rin. Viską + Visi albumai + Keisti vardą + Perkelti + Ištrinti nepavyko + Sukti į dešinę + Intervalas + Jau yra + Sukurti albumą + Elementų nėra + Žaliuzės + Išsaugoti nepavyko + diff --git a/res/mkd-MK.xml b/res/mkd-MK.xml new file mode 100644 index 0000000..99abc99 --- /dev/null +++ b/res/mkd-MK.xml @@ -0,0 +1,99 @@ + + + + Достигнат е максималниот број знаци + Слајдови + Максималниот број фајлови е надминат + Опции за слајдовите + Избери ги сите + Да се избрише? + Измени + Порака + Преземено + Името на албумот постои + Сочувај + 20 секунди + Активирање + Ротирај лево + 2 секунди + Пораки + Готово + Не може да се преименува + Е-пошта + Погрешни знаци + Преместено + Откажи + Избраните + Избриши + Титли + Откажи + Достигнат е максималниот број знаци (%d) + Достигнат е максималниот број знаци (%d) + Слајдови + Слајд + Почни слајдови + %s веќе постои + Активирање... + Албуми + Не може да се преименува. Името на албумот постои + Неуспешна операција + Се снима... + Премин + Музика + Избрани се %d записи + Направи нова папка? + Неуспешно бришење + Избран е 1 запис + Видео-запис + Зголемено + Копирај + Зеница + Период на слајдовите + Видео-плеер + Слајдови + секунди + Ротирај лево + Страна + Се копира... + 10 секунди + Обработување... + Галерија + Нема име + Слики + Затемнување + Измени + 5 секунди + Не се избрани содржини + Избришано + Отстрани? + Веќе постои. Пресними? + Се брише... + Извршено + 3 секунди + Ролна на камера + Ротирај десно + Повторување + Меморирано + Растворање + Произволно + Се преместува... + Неуспешно преместување + Видео-записи + Неподдржан вид фајл + Преименувај + Завршено + Изб. сите + Сите албуми + Смени име + Премести + Не може да се избрише + Ротирај десно + Интервал + Веќе постои + Нов албум + Нема записи + Ролетна + Неуспешно снимање + diff --git a/res/nld-NL.xml b/res/nld-NL.xml new file mode 100644 index 0000000..c8b65d3 --- /dev/null +++ b/res/nld-NL.xml @@ -0,0 +1,99 @@ + + + + Maximumaantal tekens bereikt + Diapresentatie + Maximumaantal bestanden overschreden + Instellingen diashow + Alles selecteren + Verwijderen? + Bewerken + Bericht + Downloads + Albumnaam al in gebruik + Opslaan + 20 seconden + Inschakelen + Linksom draaien + 2 seconden + Berichten + Gereed + Kan de naam niet wijzigen + E-mail + Ongeldige tekens + Verplaatst + Annuleren + Geselecteerd + Wissen + Ondertitels + Annuleren + Maximumaantal tekens (%d) bereikt + Maximumaantal tekens (%d) bereikt + Diashow + Pictogram + Diashow starten + %s bestaat al + Laden... + Albums + Kan de naam niet wijzigen. Albumnaam al in gebruik + Bewerking is mislukt + Opslaan... + Overgangseffect + Muziek + %d items geselecteerd + Map maken? + Verwijderen mislukt + 1 item geselecteerd + Video + Zoomen + Kopiëren + Iris + Interval diashow + Videospeler + Diashow + seconden + Linksom draaien + Pagina + Kopiëren... + 10 seconden + Verwerken... + Galerij + Geen naam + Afbeeldingen + Uitvloeien + Bewerken + 5 seconden + Geen items geselecteerd + Verwijderd + Verwijderen? + Bestaat al. Overschrijven? + Verwijderen... + Gereed + 3 seconden + Camerarol + Rechtsom draaien + Herhalen + Opgeslagen + Oplossen + Willekeurig + Verplaatsen... + Verplaatsen is mislukt + Video's + Niet-onderst. bestandtype + Naam wijzigen + Voltooid + Alles sel. + Alle albums + Naam wijzigen + Verplaatsen + Kan niet verwijderen + Rechtsom draaien + Interval + Bestaat al + Album maken + Geen items + Jaloezie + Opslaan mislukt + diff --git a/res/nob-NO.xml b/res/nob-NO.xml new file mode 100644 index 0000000..3bb6b9c --- /dev/null +++ b/res/nob-NO.xml @@ -0,0 +1,99 @@ + + + + Nådd maksimalt antall tegn + Bildefremvisning + Maks. antall filer overskredet + Bildefremvisninginnstillinger + Merk alt + Slette? + Rediger + Melding + Nedlastinger + Albumnavn allerede i bruk + Lagre + 20 sekunder + Aktivering + Roter mot klokken + 2 sekunder + Meldinger + Utført + Kan ikke gi nytt navn + E-post + Ugyldige tegn + Flyttet + Avbryt + Valgt + Slett + Undertekster + Avbryt + Maksimalt antall tegn (%d) er nådd + Maksimalt antall tegn (%d) er nådd + Bildevisn + Lysbilde + Start bildefremvisning + %s finnes allerede + Åpner... + Album + Kan ikke gi nytt navn. Albumnavnet er allerede i bruk + Operasjonen mislyktes + Lagrer... + Overgangseffekt + Musikk + %d elementer valgt + Opprette mappe? + Kunne ikke slette + 1 element valgt + Videoklipp + Zoom + Kopier + Iris + Bildefremvisningsintervall + Videospiller + Bildefremvisning + sekunder + Roter mot klokken + Side + Kopierer... + 10 sekunder + Behandler... + Galleri + Ingen navn + Bilder + Fade + Rediger + 5 sekunder + Det er ikke valgt noen elementer + Slettet + Fjerne? + Finnes allerede. Vil du overskrive? + Sletter... + Utført + 3 sekunder + Kamerabilder + Roter med klokken + Gjenta + Lagret + Oppløs + Tilfeldig avspilling + Flytter... + Flyttingen mislyktes + Videoklipp + Filtypen støttes ikke + Endre navn + Fullført + Velg alle + Alle album + Endre navn + Flytt + Kan ikke slette + Roter med klokken + Intervall + Finnes allerede + Lag album + Ingen elementer + Persienne + Kunne ikke lagre + diff --git a/res/pol-PL.xml b/res/pol-PL.xml new file mode 100644 index 0000000..c848cca --- /dev/null +++ b/res/pol-PL.xml @@ -0,0 +1,99 @@ + + + + Osiągnięto maksymalną liczbę znaków + Pokaz slajdów + Przekroczono maksymalną liczbę plików + Ustawienia pokazu slajdów + Zaznacz wszystko + Usunąć? + Edytuj + Wiadomość + Pobrane + Nazwa albumu już w użyciu + Zapisz + 20 sek. + Aktywacja + Obróć w lewo + 2 sek. + Wiadomości + Gotowe + Nie można zmienić nazwy + E-mail + Nieprawidłowe znaki + Przeniesiono + Anuluj + Wybrany + Usuń + Napisy + Anuluj + Osiągnięto maksymalną liczbę znaków (%d) + Osiągnięto maksymalną liczbę znaków (%d) + Pok. slajd + Slajd + Rozpocznij pokaz slajdów + %s już istnieje + Ładuję... + Albumy + Nie można zmienić nazwy. Nazwa albumu już w użyciu + Operacja nie powiodła się + Zapisywanie... + Efekt przejścia menu + Muzyka + Wybrane elementy: %d + Utworzyć katalog ? + Błąd usuwania + Wybrane elementy: 1 + Film + Powiększenie + Kopiuj + Koło + Czas wyświetlania slajdów + Odtwarzacz wideo + Pokaz slajdów + s + Obróć w lewo + Strony + Kopiowanie... + 10 sek. + Przetwarzanie... + Galeria + Bez nazwy + Obrazy + Zanikanie + Edytuj + 5 sek. + Nie wybrano elementów + Usunięto + Usunąć? + Już istnieje. Zamienić? + Usuwanie... + Gotowe + 3 sek. + Rolka aparatu + Obróć w prawo + Powtórz + Zapisano + Przenikanie + Kolejność losowa + Przenoszenie... + Błąd przenoszenia + Filmy + Nieobsługiwany typ pliku + Zmień nazwę + Zakończono + Zazn. wsz. + Wszystkie albumy + Zmień nazwę + Przenieś + Nie można usunąć + Obróć w prawo + Okres + Już istnieje + Utwórz album + Brak elementów + Zasłona + Błąd zapisywania + diff --git a/res/por-BR.xml b/res/por-BR.xml new file mode 100644 index 0000000..5c8140f --- /dev/null +++ b/res/por-BR.xml @@ -0,0 +1,99 @@ + + + + Número máximo de caracteres atingido + Exibição de slides + Número máximo de arquivos excedido + Configurações da apresentação de slides + Selecionar tudo + Apagar? + Editar + Mensagem + Downloads + Nome de álbum existente + Salvar + 20 segundos + Ativação + Girar para a esquerda + 2 segundos + Mensagens + Concluído + Impossível renomear + E-mail + Caracteres inválidos + Movido + Cancelar + Selecionado + Apagar + Legendas + Cancelar + Número máximo de caracteres (%d) atingido + Número máximo de caracteres (%d) atingido + Ver slides + Transição + Iniciar apresentação de slides + %s já existente + Carregando... + Álbuns + Impossível renomear. Nome de álbum já utilizado + Operação falhou + Salvando... + Efeito de transição + Músicas + %d itens selecionados + criar pasta? + Erro ao apagar + 1 item selecionado + Vídeo + Zoom + Copiar + Iris + Intervalo da apresentação de slides + Video Player + Apresentação de slides + segundos + Girar para a esquerda + Página + Copiando... + 10 segundos + Processando… + Galeria + Sem nome + Imagens + Desbotar + Editar + 5 segundos + Sem itens selecionados + Apagado + Remover? + Já existe. Substituir? + Apagando… + Concluído + 3 segundos + Giro da câmera + Girar para a direita + Repetir + Salvo + Dissolver + Modo aleatório + Movendo… + Erro ao mover + Vídeos + Tipo de arq. não suportado + Renomear + Concluído + Sel. Tudo + Todos os álbuns + Alterar nome + Mover + Impossível apagar + Girar para a direita + Intervalo + Já existe + Criar álbum + Sem itens + Persiana + Erro ao salvar + diff --git a/res/por-PT.xml b/res/por-PT.xml new file mode 100644 index 0000000..fa9f2fd --- /dev/null +++ b/res/por-PT.xml @@ -0,0 +1,99 @@ + + + + Número máximo de caracteres atingido. + Apresentação de slides + Número máximo de ficheiros excedido + Definições da apresentação de slides + Seleccionar tudo + Eliminar? + Editar + Mensagem + Transferências + Nome de álbum já utilizado + Guardar + 20 segundos + Activação + Rodar para a esquerda + 2 segundos + Mensagem + Concluído + Impossível mudar nome + E-mail + Caracteres inválidos + Movido + Cancelar + Seleccionado + Eliminar + Legendas + Cancelar + Número máximo de caracteres (%d) atingido + Número máximo de caracteres (%d) atingido + Diaporama + Slide + Iniciar apresentação de slides + %s já existente + A carregar... + Álbuns + Impossível mudar o nome. Nome de álbum já utilizado + Operação falhou + A guardar... + Efeito de transição + Música + %d itens seleccionados + Criar pasta? + Falha ao apagar + 1 item seleccionado + Vídeo + Zoom + Copiar + Íris + Duração da apresentação + Leitor de Vídeo + Apresentação de slides + segundos + Rodar para a esquerda + Página + A copiar... + 10 segundos + A processar... + Galeria + Sem nome + Imagens + Saída gradual + Editar + 5 segundos + Sem itens seleccionados + Eliminado + Remover? + Já existe. Substituir? + A eliminar... + Concluído + 3 segundos + Rolo da câmara + Rodar para a direita + Repetir + Guardado + Dissolver + Aleatório + A mover... + Falha ao mover + Vídeos + Tipo fich. não suportado + Mudar nome + Concluída + Selec. tudo + Todos os álbuns + Alterar nome + Mover + Impossível apagar. + Rodar para a direita + Intervalo + Já existe + Criar álbum + Sem itens + Persiana + Falha ao gravar + diff --git a/res/ron-RO.xml b/res/ron-RO.xml new file mode 100644 index 0000000..d70d126 --- /dev/null +++ b/res/ron-RO.xml @@ -0,0 +1,99 @@ + + + + Adăugare la marcaje + Expuneri diapozitive + Numărul maxim de fişiere a fost depăşit + Setări expunere diapozitive + Selectare toate + Ştergeţi? + Editare + Mesaj + Descărcări + Numele este deja în uz + Salvare + 20 secunde + Activare + Rotire stânga + 2 secunde + Mesaje + Gata + Imposibil de redenumit + Email + Caractere nevalide + Mutat + Anulare + Selectat + Ştergere + Subtitrare + Anulare + Numărul maxim de caractere (%d) a fost atins + Numărul maxim de caractere (%d) a fost atins + Ex. diap. + Diapozitiv + Începere expunere de diapozitive + %s există deja + Încărcare... + Albume + Imposibil de redenumit. Numele albumului este deja în uz + Operaţie nereuşită + Se salvează... + Efect de tranziţie + Muzică + %d elemente selectate + Creaţi folder? + Ştergerea nu a reuşit + 1 element selectat + Videoclip + Panoramare + Copiere + Curcubeu + Interval expunere diapozitive + Player video + Expunere diapozitive + secunde + Rotire stânga + Pagină + Copiere... + 10 secunde + Se procesează... + Galerie + Nici un nume + Imagini + Estompare + Editare + 5 secunde + Niciun element selectat + Şters + Eliminare? + Există deja. Suprascrieţi? + Se şterge... + Efectuat + 3 secunde + Capturi cameră + Rotire dreapta + Repetare + Salvat + Dizolvare + Amestecare + Mutare + Mutarea nu a reuşit + Videoclipuri + Tip de fişier neacceptat + Redenumire + Finalizat + Sel. int. + Toate albumele + Schimbare nume + Mutare + Imposibil de şters + Rotire dreapta + Interval + Există deja + Creare album + Niciun element + Jaluzele + Salvare nereuşită + diff --git a/res/rus-RU.xml b/res/rus-RU.xml new file mode 100644 index 0000000..812d3bd --- /dev/null +++ b/res/rus-RU.xml @@ -0,0 +1,99 @@ + + + + Достигнуто максимальное число символов + Слайд-шоу + Превышено максимальное число файлов + Параметры + Выбрать все + Удалить? + Изменить + Сообщение + Загрузки + Имя альбома используется + Соxранить + 20 секунд + Активация + Повернуть влево + 2 секунды + Сообщения + Готово + Невозможно переименовать + E-mail + Недопустимые символы + Перемещено + Отмена + Выбрано + Удалить + Субтитры + Отмена + Достигнуто максимальное число символов (%d) + Достигнуто максимальное число символов (%d) + Слайд-шоу + Слайд-шоу + Запустить + %s уже существует + Загрузка... + Альбомы + Невозможно переименовать. Имя альбома уже используется + Сбой операции + Сохранение... + Эффект перехода + Музыка + Выбрано элементов: %d + Создать папку? + Сбой удаления + Выбран 1 элемент + Видео + Масштаб + Копировать + Радуга + Интервал для слайд-шоу + Видео\nплеер + Слайд-шоу + сек. + Повернуть влево + Страница + Копирование... + 10 секунд + Обработка... + Галерея + Нет имени + Картинки + Растворение + Изменить + 5 секунд + Элементы не выбраны + Удалено + Удалить? + Уже существует. Перезаписать? + Удаление... + Готово + 3 секунды + Каталог фото + Повернуть вправо + Повторить + Соxранено + Растворение + Случайный порядок + Перемещение... + Сбой перемещения + Видео + Неподдерживаемый тип файла + Переименовать + Завершено + Выбр. все + Все альбомы + Изменить имя + Переместить + Невозможно удалить + Повернуть вправо + Интервал + Уже существует + Создать альбом + Нет элементов + Жалюзи + Сбой сохранения + diff --git a/res/screen-density-xhigh/00_button_radio.png b/res/screen-density-xhigh/00_button_radio.png new file mode 100644 index 0000000000000000000000000000000000000000..83a1a54e9394db67f4d101cfef2bf33773219901 GIT binary patch literal 4817 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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..aa2a5c158f39c0dd2546676b1ce783d88a63c0d9 GIT binary patch literal 3659 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 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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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_select_all_press_web.png b/res/screen-density-xhigh/00_icon_select_all_press_web.png new file mode 100644 index 0000000000000000000000000000000000000000..57e1eed527071fa8ad6e425f7d646e08d9a7985b GIT binary patch literal 4635 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%0Aebp>pPz6`P9q##uvj@bkK z@^0bF^Z$jRt6w-gui3sacw!(?c^GD~3baLlo=F7^JrlDB`jwf9-_Cvh^Q8*UI`Z%R zHAaR-%oM?K|+nsV)6DE;-7pp zky^UGt1o?TvOK*XMlX(ts0KO~Be6 zK$*D!o17nJ>^@j4y_?_%LeGw?iCGwiUbG{gYmu`l0leo+Ff(Bb8m@QbgDpOz{--`YNMX~2o9KTd}~ zyphK6dB=prniR*8fjKR;SaR@(S=dA_^f>-~p$BIG^a7YulM4Whl7l~N5AQO75P;Qc zuQcI%)W9S_v$D6;;Cr&3CrA=^$9@90gPymJj^PRDG=WhL@UrQ$*W&ApvuU7(m^%20(K#+7_DzP-2oc`C4t}buvv6FME69UcI07Hkft_eSXxz%z0#qVPcPtq1xY&B8V zc`$5ZZ2(c2z0>r<)LMa7DEt<10Df^9S1ufy7g^KK3{72ce%d@?xuH8O)V6|VBoyjd z8UNq)+;98JmZ!s?{quJtdja?HOBjAmo)B4+;s~CZ(=*BSu5aD3sOW8nwXzNbS-2@^ zb>w$0Z(SXOVcy*mb$7iO-4pnEc|zjMiapRjrzYkBf?VIk^moEy^Ar@Gb8TPM_Ck-~ zZHrd4JPr8?C0yP8(&gR4`Z`{Bb$&Cv z)d}*0lQ0VhdIWFVzQeQP-~Q3_M5WUM%FMwmyCM48A$r@Qu8zS?39twHv(DS#(x8XR;jjpWQtEKXj7 zmYn~TaW&Oug)1*dk~25=WjA)a$hK**(|UeW0y2x!&@xGwxJuBhyd@kUKr^E3e4^to zmb&gn&fUDP9iD9XoodPPm7johWe%Xsu*lV5?0%S78=z}A+nCG>r!2fIRyW6J_t8eS zs&xDI8xpWmmQv8QG+t9wT>PrzO7+QaZ-Psn<{0nq4)E>(D63GEJ-u945vvKXEc(O* zv~*(iRTEpp-5DNAeKxrn{=j5N5XJeTXFfIMc#}s^-a425_1MjYKySbv0Wgx9y@j=x z3Mn%KvAXFh?>|}e@P}E|jmw-_=?&O>0E_~-4<~607<+w`_a5)&J;CCF8wOl5{m{4l zgE6-Tzkd?i0>LQHKMwK#0Ra1)Ky)-$ RcI5y7002ovPDHLkV1iBS+MWOa literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_select_all_web.png b/res/screen-density-xhigh/00_icon_select_all_web.png new file mode 100644 index 0000000000000000000000000000000000000000..56e3fbbe6d977e614b319846d08966d4369f5bda GIT binary patch literal 4410 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 AA^-pY literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_expand_closed.png b/res/screen-density-xhigh/00_list_expand_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f639ec983c729698cd183b90239606443bbcf0 GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_expand_closed_press.png b/res/screen-density-xhigh/00_list_expand_closed_press.png new file mode 100644 index 0000000000000000000000000000000000000000..b421ad12c552e414a5c71024700a4cc030381dee GIT binary patch literal 3098 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_02.png b/res/screen-density-xhigh/00_list_process_02.png new file mode 100644 index 0000000000000000000000000000000000000000..bc43e8b7abbdbb71ddf9fa0c16ecd46c7dde8cab GIT binary patch literal 3879 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_05.png b/res/screen-density-xhigh/00_list_process_05.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f3fc5af64b9724c06bd1c945719c88e0512517 GIT binary patch literal 3936 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 Rc3A)b002ovPDHLkV1j5kAm0E0 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_12.png b/res/screen-density-xhigh/00_list_process_12.png new file mode 100644 index 0000000000000000000000000000000000000000..35fb68f3ddd8ed682461aa0d2b58de6a6ad881f1 GIT binary patch literal 3921 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_13.png b/res/screen-density-xhigh/00_list_process_13.png new file mode 100644 index 0000000000000000000000000000000000000000..adcf94f093ed7e6441f8b8e0273e2850218d0395 GIT binary patch literal 3926 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 Di}_&R literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_15.png b/res/screen-density-xhigh/00_list_process_15.png new file mode 100644 index 0000000000000000000000000000000000000000..31676026337813da870fb51eb583cb4346e73c37 GIT binary patch literal 3978 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_17.png b/res/screen-density-xhigh/00_list_process_17.png new file mode 100644 index 0000000000000000000000000000000000000000..1a059dd60d0a446a878b34a9791afeb4de5de66d GIT binary patch literal 3865 zcmV+!59aWRP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000C;Nklm9b~4 zoL)<6ta3fm@$S>T=LEiS;1Iwm-B_oBIwqp84unxN33w6p<=ocAdzNEqV(`5>L57o? zE&yB;^iUHU#KX6OHU(w|u%fdrqN#uv_YGV@dxma&tg+4|wbF5*$^m?#2(7cUlhjfK z312Zzzcz`QhPtL8C9`6frs>!Pu*#hZa-|aOXs&VHVVb6_3GjfL3YMc?>Fzs8)6}mE zJXVa^ZNOHcuQj>6HE^VG<;yL?R^5B1aP7brcqI9JR>_#QE!kY}tE}uVS(l?*T1Y(3mvMN8U*wv}f7|03riSYoT6eJt>tOw57QkbX9Npa9 zFaS6>IPfXJDuI~-xRc7VY}D`fqvdk>?*9J%ssFpXyT!%D#kZ4_lb(@~m+Kb-zQ3n(X;seLrXm9SXbbohi9L_^`~CUR z(b4ZZz`P|uVZorrHOjrcy;UB11)_npL86QncR_e7mI4P>Kx_~ZZ0?Zsn>bzw@t^(e8o*c(fd;n3ni_N+U@=Wy zX`cMqhNi55#;fWS0taxpE~{!%@epBtq8MA^pxRV5Em(j?bUk0Qz(0pY-OZ-Nqk|S5 zoe=yS^35*ULmNPS@}Lo{EwF&*1m$ZwKdiWUj@2>Ybq^`DT!Pjh}%>Hn=^zshx+i0$+{Xp#-!w?Y#X^>kat- b(%%69WiB~=o_ov900000NkvXXu0mjfM9e$j literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_18.png b/res/screen-density-xhigh/00_list_process_18.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7f410603c23edd73170d682028a1dae932c112 GIT binary patch literal 3815 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_19.png b/res/screen-density-xhigh/00_list_process_19.png new file mode 100644 index 0000000000000000000000000000000000000000..3a33a9501e79c81ae8edfb63e44bab43299dffda GIT binary patch literal 3896 zcmV-856AF{P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000DINklY!N-CN$EMW>9ceEA<8MbIK|6{jwd$TlYvOpQ6NfpL>4X-E)^$&(F_zNixC< zlNSd(mKDx<*Y9QkLI44k2|f2ESDpnug>PeNn)(5E2$=wwQQbwty(b8K4Pe^@z7OCK zzjsH_QG90Pbl8clkPHwl5?k*W6vEX^(O{GAL= zC6!R|d*(6F*JS2*eE_wq$%)~ z!NiUMt3odgE|@d{jtr)Jdqh~(ymf(W&N*kkz;n&#Yh}fBY%$ICi4U+&yMh`SiU@;g zM><~~X@Zqby8^?Kt;XUeI*yU!7lmc=Kej)^RdFLn?QRFCT@_d~1r80sLzde9an3^< zaPT()*D25iILGisx8G(aVCMOB&0*(5Z$un~hB6l!htAN#Zzm z*~@zaiw;DgRL>3>H^x1i-8;=vHp1^Iq!oexq~O?=I;?JB zJ}SSLR`7GP*<^7XuYB4Y_Z*x)V0SFjL>T>cuDA&R2#W1US58(nRHPT*@8o;I*#KN zX=h)9(x)$!I`e)1!^1;V6vea&usql8V*yf9fLhg9nRJB<54ZSX1I}qg>mup$h>MDx z%BrScA!F>Os;Y~prziIK_!t1d`T6-e2!d}ez`DKV@&IPt#n!N-z54!sy-3qk*ftNP z#&nrR^FxrtCowS6q;hQY;!q^CBrTkPw}zcZGB9AB60$T+OIKiF(J~v5DThAhtOJ&2 zEi~J$>jA(97VYM~z@{8@0JnqjL&*gCTL{+Nx#?_aZCGqXM}juN0>Db=yDq?h`5dWl zXnF9hTk7U%np$(`HsBKG+cFV=n;rt$%mQ1Ia?lo7PE&W5k-s_6l*K4WnrKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000D3NklQ0o z4gmCLD!piV0l{VfjsXfggQfPDaa^k9|cR52cXRUo|I>IA%y>T+o6;wHc$DXX%yMv&pb zDFZMf=vWaOc;g#E>jDQFu)MN1qA7>x&-H9UJDP61t5D~NuEKJlngaMi5n83RmDG|4 z30Klj4;G1!B~sC6jBVQhmbp_-u2i5MOBJpgGsb$00QcyU!Io&(RL>nS#@xEV z+mb%p1#A_1BX_n+N~CUy<+4oRajuBN(fnbl82r2L&(Ial(Ns5ELUpUaWnJJv0=&#Nw|Htr%{3fcSCj*w{%*$@2pdZ%)F7ba@E*PGS7XYj(Jef>*Vv{a9(~6=< zXD)BN08mx-e6^suuRFpx znq!&Ykc&?Nd?9dS)oF;6O?s5TvY^tm4GG#v^~q#%a(;gP@&5ka)d`Z0W)j{*duFWq z#l^*k)6>)av$M1Jx3{<4-SZ?#wEA!^Xwg;^1XI-?9v@X+oCxKj0vjg4QctEH zmaReaBM)7fD}hz6oy#ThK81L*OVnsR$WIU~%PS4Dr5jBfvZ=9+HB6=p9A0F@ZS7f?Gdp7Fs*4 zxNj5Sg{44f1-P2djq!X&(zj4%hUden*39NB041NjR3dJG=XW1e|K;yHOwr(u`tVrhm_>MJ8}-$r5^SeSqsLM0@FTBXsk3>@-vT^2SsZ3AS| za|o*BkY6|zD+(v^U<4w0QK+6$Dib6z85EE~^=0^akZ4qp3V<|#>g@?qSzg{ODoA?y zkTGkBESVL-7rwNGtvF;kifUN^px5gudO8J0_5z@7Q=@ZT zQQ$*5DWcG#3RpujDN2&yRFp%;Jbe*@S}PL064vNmCJIX#V3245kU|C2YExX#(K<8& z`rVD!qIKeQEd)eBIye=PV)aONT_Iz+`*TAkAm$A#3{hZ3k*N5vG*u00&|p4?jGa(q z3K@$*6>zzH0hhsJFa$IZPJb*A#Xh?Wl_iZnIsVWrD_d9x znx?N>A6vY-Jdg&vF$i`wYG{YLaX1TkFh4+S7@jEw!$$mx*VYi;U1OW?ega<<7~`?A zuilv^tBxG0S1y}1+^A6w*~AA5E%WO_`aB5@Q6S%Tvw3a}|4YK5xJvzxei^OE-0Y0s zHGKI3k@(i~NB_BXao@w)Rz$B4+*s1YHrwtnUQ%K|a?`G^pxoKN$PnHj5PJ@q} zI*TCOa;5x6;)P(`6DKijd!(L~9bs{&A*9*za`vtH?6Jdj*bN=e^$F&=_9ay$( zujJ%{MfEz1@_0M3%4ddmAlhA|!u>{?aJ{`y8QS0fufMRvkN(Z&nER3nCmnOoJ^lBR zWL4FaadqCoY20rrt6a~ZGquLKZ0>T@{(WB`Nw7R+&Ee-KM&Nyf#`z!Kl3b||bNJdQ z{-u-Hu{Ax*L$|@&}Ot3|%Zl2;83rfSP0&8ulTCzOlV;9v~R$y@<$lqn$U2$3Td0rmTsr%@NCQr6u zIVzhlpEXF9R#bsq>YcIsyJGQ_Yyu8(HMEuCgs%5!$1i z77|;!C3(ap$Hj~7W(5ab?*`&NbGiSEQ%m1C|JpFosHMcU^hfzo@!xIO+EW=fG49+t z{c}p`Pkn*W2Khg}OWibQ+!2`-`Yf|Ke7UR(@-xyuISJw)w;wmld}mi_{UW}~cyM@E zRAO9Wq02#K?UGydeAS7x>h+sBz3;Ng8ugm~(5-bYJFdb5a}V3Dws;7NTzDsO>V~wW z2&enDTdc?O5p#9h-D2y{f7)xYJ4iFoZ`pBp*wN9k0=l)QzYOY(ecBMR;N4u-_+e`5 z;{43a%#VwUspmwlef`KMrvUx>50;Ln+!`G{FgZC10{|cm7#k%zH3l@chb1&VJ^$ph zk&*Z;X6Z%Jx;CBa0abXT*Wi4e5hSY18XFvZbk6!%SJL$KslzQFRtt~2Z@%?tR;5;d z+J5%znwtXyv-r3@d!B_#zG%}$nPqdDq_WZZuim4iJrl%!bm!+w!nZ8~gip2GDhkRc zdzs$e+oyJiJUmsiL$obTH5b}4H4-Vy$T|zx8{eV4Ij4eMhgaHoBumV%luY_PC~Qgjrr7qh zw8Nq)^G?;bKk#aY&HV30Z{ikxVejCUA9Z>6qE=xS=CdE|bDLG$RJKjuX>=%0+k)4CPR`+GHEiH5b46A zpsdnWDi(=IqGc;ou*g$f%A-~e#ZrYT5368ZgoPq@fyD(EI#F@=4^Q`;opWZs*S+`m z{LbXXiK13Hcsc+8uu2fkizmhq>ubM~_`**Hw8XFm=O^J}ECts~v?vfE!*-)&fl4Ar z<57t${ew=FVA!Q76O!;G;Wk)`si+bwhH6l02sR-WX3$8adr+Lb8P^GGMuz^E)stXfy>o$!- zehR_&a4655N)pDA5loAcnN-kU3bG(Fi$R4LAe+J7N~VJlNQ3A!Fwh?YVP+rGgW5K7fj89} zNrlLXO0^8r>#XH@7A+6eD)*wYNG+x!Kg}O0?S%XD1L*hM=j>82hUFndBbE;+kN==2&BP zFeSJ&V`$%^Yfa4^^^GN2Fs*gT@zKag*+e}wTVy1C)Ml!;h|YcTXx}TP`Kc_Ea%aPY z4ZSSXwYBbDQrP`Ly^~Sc{KX%q?27KB-fH}N)#TSemsvM{(%71Hzzm`*>86bx|KB&IB}*}Yq(3>yJDRp z_vburiH~8VF|Ha9$~pD+=KN$}n&SHAKW1uUZhr4Hx8+y^_%9yy8zl`fe7G%fpCGRV_S(V6pf_SjbM&xbztCvgt`nzYiC*CTo z-mKa5_z!QJpjE1i)uBwA)#WkfkE=b79oS3xW`s4I$J?2G70n_4$aRe}r~mdXr$uBm zpvR4RJ)yzF(v-Gqx1(1~R!3^(T-0>XJ2p|@z0xQQUpM?({t&AmC&$HOEsM43b5gq3 zAn^JOmSh6^Q|ww#w)ge*LFadN-M@cd_qa-Is$DlwTK(-x-~;=Gl6m>Kd}eyUMdC8k z-*@KcEAB}61kmxS?}Ey?&6jb^W}m-^(Wgy{TFAZ%&-z~fov0can>%erIvrv?dkVXU zCtZz_fz(ff+ew~CT>r+IlRh(7Rwps?w}t$zHb&v9DYvCMt@X0QxB4a33~bwSkT0$! z{j0j_dU@y7@LgZ*Kbr1U7wRxy$nCYy^SL1>Z6o5bDicNK76&WYDd#{XLpA&dvl5NyR|`*@!qp%&th*BGb|W}y?&^* zOyTi<@k7fA=D8xl3As3{+vj67&>vx1VT4bOUrSzcZ1p^qnEd5h*FAvx{ja~hJu$E| tcCx@T5)ni|L6k~NHV`4ZakCuJl;J9hZD|n% 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 G7yKJ=j6Yid literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_28.png b/res/screen-density-xhigh/00_list_process_28.png new file mode 100644 index 0000000000000000000000000000000000000000..6d30d393e8319b536a07378240e2b29c26a67a4b GIT binary patch literal 2124 zcmbVNc~ld39#1$tC`X}`avK9mDUxJD2qc`j6ofz?1R*LyNG6blWI{551Y`vixrC|+ zZNa6|s!u71qEbi&EMlu7((G&>hHsHWUzr*F>oX#g46kO5JeM02_Pm|!cPPvK)z6& zdJ{w#`XVtm299BeQU#C%$Jb$SDv1nXBVqw68DEeL!k7dwQ7rYtE_~OH#fXJ|*l15S zfh}WzN#dXkIT)D{#ua2F3n)TtfIr4pMMVT8Ak4?8Bq>q_Rpp0$rAtNTx@|lb^9lkd z`(a-@6~pFW7?2#qc;X1|0s=D{M? zJ0V5%3a;F0NN-1snnX z>Bc+J3a(lP;v+x>q?8MgdWf7>$w==0+K>*2ctZ`Bi;<%6Q<#uIDFLN$Fw+l-5gtk4^?{ zsj!~ub7F8We5l<1GPlXjZVHd8D5~eio}nJj+2}OZk9HMowglAlwXt^V=ReZrIRzSJ<|EYictrk878UQ5Cef-mN0^=dK#i z9PZcCS`THQs>AiYQLHlCMYi6g1E-Z7e|mH9W)S^(OnfTQk^8qY@*BV}|4Ogf!dptVcMD++dqY>(qY@xOQ0O z`}43NXK&TG%06iscjJZ*kW=cyL$kq|huXuu3-+l`VywE_oOw6zbhi#S=5+p3&nCZN zCBG#>`(>JMrlw=1a>i7|8NG*=#%f`WWXErrO@Btg2-Q8UZJ_?=e;D51l-aW4;{@3fZ%^tt$ePw$L zZ+Ltc=UaExi$2ociIs7SJP=xmpCZzX4xZJIj+!dIdO61U?gd#OVRH0{=1W7y4Zg$E zTD_m_Ki(3NK9QqA6R$C1ciuU2kgar`E7VuoX`Bu<00xGeYRs53)S^KVFP>LuWmntP zaU!-%W3A;F`Vy|x-2Tr!6{}QD-y-u_@akThdC|ju}BMlr&q^>3vvbzG?hO zP)saG8C*VW(ex?z!1xEo&C)1Y8SR;OW1Tb-9TI5o zws;@CCQG4M+@qE48fbri>O-GAE&PB^HfC4O*HrkQ@!lbcjg39Eyu2)UYH9F&LrIBA z0-AKNX6?x2!_2{Zv(n8!R!}*I0QA?W@Z9tpIW`rGc}bk@3+wDlE(`<$d#E~b4_~e^buI;sfWDs(5b9=dN<9C*6%=VW{qxaqqbgM6m zrutveXnreenlM~8vCpyWwxG==Loy@K;fjd*Z`+>q?S!|My^481o!G GKKDPv=UGhv literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_29.png b/res/screen-density-xhigh/00_list_process_29.png new file mode 100644 index 0000000000000000000000000000000000000000..8d905223c6d81037688fe03497c77cff107547c8 GIT binary patch literal 2133 zcmbVNcTiJ#9uJ{OQABAjEhKZx?m#LbAt9lp08tP&lzsv}_SOc;X!B}|)s1_&zSg1&z4j?#EK_g7h&vE_OBz!1^5JrTkcs!dB8bI`C zK>1_)Q^LqBKhhGHBU6C_nGjgAD~9ZToxz4v5K;gK|}tT!CQ5 z`eX12o>(T5t5wGGe2A6>D8-urQJ7LLMZC{1Rs0$I|2ysvT+#oNGc4o`*4P~X)htU} zPzM^PpIRSUe7Zb<47xE&=xUJQx;HSG*-j2CG)^-}-c4*hwu*VIyw$xOkvF`9fJ;p8vzhFN^|aMbL~QAu z4Ge_WgG#fq5zpR&`vouN2}urF-;o^uB)r7K6^5JLr9I?rR^l?>W4Mw z9sjX;Y#LlFTFwY->ZB;xPLZiCr3ZH%*PJ?fb$6-G;uDD~SxA7?5bfb1z-z&rO@uC)9mtyqClsZCIPfZDVb>Hpn)S_wT9Al8s zsIA4#_?TK9X<3$LcK`A8iX3;tN}A8#nsyBF!wy)&+&LXyg)cW;Y3{W{eMqb(?=h!I#o=B|Y zx~yH(I`~U@gRA|c&5ni?JX`NFn%%y&%WNENbH}k?vRd!E7_zeXn>B_Q++X&&?f`T_ z_4^0={BA~WlVoOQ665K`Tk~scYYUvXm#4jE4r8&r z>N~E_NA$#Gj?Vl&nTmGVRDuv>xdk*E?xKb+B{f>T^C+31T3aTXNr)9l{j26vV;xca z3hHEMM4_8`j`i9;F8giD0(K_J)d$1VpI^OVIudxA5cfdb82io0wJXo#GhM<3*2?$> zb1kg{H{a@;-_+Obfc~L*=yv5m%kdf|Rm;&NpX;Kr@BQ?{kV&+jdgwc@t%?{Ex4{^O?b{(A8=jMnX zM@B}3d!Kaea=5kgR?*2DZrbj)_6_;%`@ozW`?S>59&tq3vr>857}-mIZTz%t^;vX& zhs$YXSy`@~bm8zNxKsou8YVFIeBagN916{0bi$zsdL@IM#-vo@6$y2&r<`Feq%@0}{2;p`uH&>W!==@?8LS-4V&NI;0rmijB zj^={uZ2UG}3O{mS=7EjHz0K!sH@X_Wz8($u<%H0pr*=JhB2n=T^}z-aZsw^ku( z{1Hd;i7+$kqOVc1v7a)XeeXIqzEeAEwcA`qy8|gN{>41bGfV-6<}R?5T*;yJR;w3` PKY9*(J?pOwe(}En8k$pJ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_process_30.png b/res/screen-density-xhigh/00_list_process_30.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e392f2390cdc3509621e82f2709cf78ea3618e GIT binary patch literal 2173 zcmbVOc~ld39uKDwiX5^cJdhBC3YcVaa3q324g?{Daz>GDLNbsjIZQ^vQOmL5BG|H} zS`p|9tF}doLa+raB2lEG0kIf?V1-udfgsT+qM+_X#N9u9-S>9hoB3Uz&*yvo-kW`~ zF`KQC&PW6TVI3JkkAue`!)sv35zEIWD6-2B=mVv{Q$z&Wrz!3--7=e-Jh#_t^MlAPO zR-l7&o=hl(gc32zpvX;=?1qBTu%}BQh@?#BJ7KZ>ZKB|m;j+0>93BhcL?T06Z_sim z4*ZWB??uZKa-<+G4wOrF%Xn}-(mj^RaPI!xkO2sLLt)8;a8bCKbO~>_2oyt+^k6i6 zg5?YO6cWIoQt1pTiAEwZ2zWe|Mh&1-iT(^4oft;K`z>p{mrDTr{Ajdr5=_P883b|w z10M(wsRSyWN&`s5Wp1Qc4spdiaM`ZVV0Vej_){*0CIh*UM3x|tWG;6=tUv-u+P$uC9tKKuVO?j(b9#9P57#Vyu{&={d7J)Erilm1nWNW8u&a%cr9l9&lqoO`wPub%S zN3Tt7$&PMID7y~%&^$R0ZV({sODnBigUS8g@D=71Rh5}{oRjh*gZkJZhh)6(R=whP z=f#H?HjUZoj>ShbUwx)uXjk05TQWA5^7sJ%H>ddqgqy4D=)AQfxlbfg#mY|ydAh_C%PS^OGLD)veL~{PlwoWoSt}#`hpO| z83C}49tEsYi(1!oDIZ!}#Kd1vfZ8OBX!0Rw(IMb@IZV4)q! z@xO#=Z{Ct-5ft>|L}>f?lxe5!=dM-N?UqtRbzvcv z&Joe$S6)5!KwBghR6p8F-MC`V{z_q4$Az`?-)|Y}F$ZkyKks2ZE2A@+@{qmv_6u7W z#EU1bCrMB*=9NYF$Y8$Km>(1^y`}S#!e5r0x+X1zS zOGNbZx^VWj&X&*{_1m(Tg&Qx;(%g9`Quy*c0^|L{fRb```7!&UmB7aX#&e!pX5S}$ zYgz(V+!hGdR{40nKJ)VMJ)e{H4Zl8e*^z7-qc_g8pUC-2{ph2RxrFYfpG|9zhq_Lb zs?YUQmYAIhf~+?ZziMqIc3pC7I(2GHty-nyedu9v)H%yj|F!i9>j{rKX1QQGul!;9 z&M2bPsz_P>Y0cKwGrB!({P?S8wW|xjtz(;%Q(LB_bKzTE<3~1CNeU)af1?!aCQTm> z-+{am{nYC5>@0~hlTal&+TCE*L^wjGC#9&173-(#eDeFtLYSXTOgha!aF+!|z5daA z`nz@P&C2s%zL5Tln3K^hE=9Q{O+XH!bm6~4$ch!dcZc|=f{z$9U zvXC1+b2W&>^S2Hwqkp=ru{V3w+1YustD_?)jJpcCkS7#+|E1FIpOhr9SD98_dfw;R z!13RYM9!rNTK$yq&4!s`j`4)FA)0o$+Gy;+YUl`@1{CHoy86Cw@YM%w!q3x62!TfDwCIXh;rDDW4v_Cbg%CTzmMWgwxhwdFj zuRdrIYBlqvBgXB{r_MV}*ThZS(OMKI6Wz# zHXHQaz-J{BN!r_^>5(tXbZL`f_qv09`n;&C-4)TVECGaVU6DyeYK)2Dhai#>LqAF7 G6#W~My>sRO literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01-1_crop_rectangle.png b/res/screen-density-xhigh/T01-1_crop_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..6e89c378e0f8e79eaa27b18fd92b3af58da7fd18 GIT binary patch literal 2813 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 DuZK3+ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_1_face_tag_icon_message.png b/res/screen-density-xhigh/T01_1_face_tag_icon_message.png new file mode 100644 index 0000000000000000000000000000000000000000..44e00580533b751005cbce81371e27a87afbb09a GIT binary patch literal 3231 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_Nocontents_picture.png b/res/screen-density-xhigh/T01_Nocontents_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..0f984803828306623a3394585b881bb6ce9878f1 GIT binary patch literal 7487 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_album_edit_rename_bg.png b/res/screen-density-xhigh/T01_album_edit_rename_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..01a75d84ecb67f8a0e52ef55cad203717a3714fb GIT binary patch literal 7795 zcmWkycRUoah8c^hEE`Mehy~EjYbLjwnZzBcgYSsEHOtLbxCZ zr`Mm~A8%*h?swk2nVo&#`Ank0V+~3&W-n!EdGV{{uvPd#!f$`Ee^qy*17K z0DzqK|A7bO7eWAlOy5;i)xf~T%iqh-#mk#hOI4NA+tPe1br_uayB;FWKcNy zaR}3S8HLpGg42UI;jpAAx^y0XC@EO`CA4gT-mv$Mni?U?Na;(0)YPbCdP6~qS7h@f zzoBnZW6NK@`h4*#wA_8R<78v(8Z)Pet;H2JO_20}D6%yr45gwds$lGQe#QX@tDI09Ox57l0S^l^g{0=oR#cvL@V6Z^81c@S+fSJ^twr zbwE*cfO1GGtO8J0$BQb;)w~Sh}B}mAJ#MD%nop)S|QGia`7T-2sS-3Aa zk4ZdQlKLm^3jma+)8BfFy9yeosv94dPHmyG7TW42zTvX7Tf1JLsPVr2aKHQ`rmh7= znwX>Hh@(8N-`v|Jba_Tz`r;(XsgYV41C(xlH^q7X9~-r@*KG?6>%V``YY)IIZ9kia zUpx0%_n2NiKZ}sRJURN=waOhW{xn*H@bqWjmqT3?>qG`A!ft6JP2;ka{N|GFE7yRQ zU7Hy{-I^hdPwJ!mWSlsPD-o8#H+XOQ#$k0u@Pa^bMGAQDrid4sF7)oHJ;AZgeXyB- z&*}*P9JG7&e&YoZM7hNNnh3nvQ@YY9y$3`&X=V5Tz_Ul(!p5JQl!ie7@TfGJ|Gf&! zVJ}3mhnTgOXsMU{(ncBq;~waPfnj70QLMf;e6=w!-uSWiZ2UGN-;~)TdkkITGrg&V z`<{HDQt+lew*?jV@^(a%5~_@VXlh4yL^(j;+netJn~$fc7m zr6~q~Wz6|RlkGsk7hfj9O8sNH+z22Za~a>EA%=`@G*tLTfl+OH_kbCp{)T+g!Cx#t zjiIz)(zlseAz8W%J6YpG{XI=lby&3L4}?Tw;JK*qP(Q5Up&)6d{b&PMEk(@`^Lvw8 zg7(BC`-z4?LYio`9#Uz-Kp3YjyNafnuG!;x&3Bxv+>&>`lRh9NKp6Jj=gNGi)6Dbn z&e;IOPFyU(OjGdgEKM4%2srem>c9hTnnYFc`)#lBwHn?UPt#1RPkX}eZVFZvNNO_Q z&HVJ;!M%}01}VrXFcSB>=y(5biQg>0p$C>^MRv+QZ%>U@dEuYkw3*hy>yqolj=AD0 zPs;P*%kRpJ??|Otz|dta@Os09ceIi(@@2+i8MJgz=r>tknOzuNPF(B%_1SGR)cYZBA2vFHP_?Obdgb)MG~ zGyWF-F#7b*WLer-JXtLKBF0tK71ckg$)Dh!j2fp^Ju?cgQ-301v{ps>ExYDPb&*mNraaD#P0Mt?p|$r;QU8VT~4ymMh6B z8T1rnkLrZ0-BB!M?T-SxJu7!}i@Tmh73+Fc{s`{Gp0kFFTp3?^oL3%cP?!-nQE(G4 zQjA072c>+x`q7xxWSpY|)OqHMElbABPx+ot5pXVg>FsgqrYtk$^KJcc}m%6W)+ zpgcNyTY9_saJ{w)z6v>AIo;v0FJo`UX7i*96vXDlu?5(Ixq_8e8;c+d!IpO|9~`wB ze_K?T@3wS!##zXiqs*RIJZ(}(7oqRXwxioC?^L!u&U{=`JnP*5e!t~YOI0h=`}KL^ z#kv-cmT+5VJ4WZ$!Mgt4%+Ad4kKrj-3M7;X3sg017HkoI&AxQ9CbB>B#|w9r!Uqqt zH$|MyCcqQ(5^F8AqkIFdMMec*HJllp+x%j2FOw2=Vn&5?6om^|hL%Sb?DcphHX-R1jYThggDc9rBv^iX3SG!IZ}aBOR9b=kIo-uKl)MN zET%70FQhHSuUIYYCjb4xN6C*$L&8qxUuMjT%(R~Cu*wMY*GYRm?^?Os!6mE~t&*>W zGUkemJoOGP8}B=et7NDWrV*6QR@Qy__#yJ23Yh;LL-M@?+Q56MWWjxGea>7WQ_@o} z=T)uv*&iQh^6Q0U{7vtW3g#Y^Knbq5A?{bb?$D*wT`rItN3GV!8^xK(&+4H>eM}! z_*o{qrdVKX=S$P)#n%rC_eySdX!>Y=WwfB;bxeiW%r-h}-DDc&eS#Os*64`@;!TKa zFzEvjwh-SQtg94kMKkI5++zcoHIJ~x)$onFS+&YgNr?XrY+ z983P4S+wjpxl;VpwfF?@iQbIUjN^sYMbn8=U1Ig-Y4(N3Q}kmGpPgZXX@V<~yHqW6 zZQo|trWK6gX|n>`8dSp^UDri>fkKqhluuF$hgR=;KMMZ6c|y8!!cHmsJs>%>_7}-l zjsP}iHW4>i{z1Nafl>a2rJdzR{V$4Bvs*txE;SZ8s0$_K&4aaZ#-CijZ^nGhbUv6! zF3Ktjj}SgvvRQo75{k7SUvZ=M+WQFh|23_4lZ2J)kQ=u;_~3ugxVTPh`oT26Ue?-U z%YRG$I`gakaC>2UeqEcDd)sbECnnVCWRs=%!T9oFXYfA5&FoCEjKXp!F2w6(@Z@NP zVL8J0{?+(s`$FLTU37>}Sa>9&~<@M71-cqDnPhcr-YDwdSI4*YLI{he( zT9qg*FKslQGJd=Gp`wh;s*>;3=4GYogu?_+G2``{>(M$!29b!(Z(PnAj*KQNFEW`j zGj9k9a&edT5<-i&^(LpiCR`5yLhb=TR4f3T-Q3De0C*t^09!TyAe##Sj9wYmgX#c4 zTdeg+#W?8ul4WRekz-!ukL^GOtQ_`>jNe}2rUx(bBTTgB5(<_|O1IHH<}#^u(ehbv zpq=gUv~t`}lgdqr{PjJazm(?qjqMZU%<>BrJ=2C}BJH=$jujF`$=XbycG$dgdk`SgaAqiDZdp%5byC&>tUI4 zRpfL8qCqVR0D5AG+$rGNLZGS*1lS0!4TeP_eI5BGEn>xpYcV!x1(7{HJb*p)FQeBv zUiVpdN%!jB-txuHB=zNJA7_UoC^o6DhvNmSsca$N=iFU>yJ;CSgG%4h^z-ySroHb$&skUt)SUdfDZ_5$|$ieqrZ61JNN0*od1)I#F!0i2zw(R?}>Z7_sGhBEk_%pBOg6 zckyD<0;%6&Dd#E%@nkE-rMgs}_tRkDG2nE@S<0xRbD}?e>yL zbYR5l+)ZeN?$6Xkuf>S{?8NQQ_Vy`dzk1Jj3-n~L#88JU=@FO2EVw3LO7rYD3(Fxw z5A`T@F%@&zyU{iRg#S(FEEz(xH%70vK@UAsi#&b^TP1?Me1kO8t{OyGjJFB@#%Vza z-x!Ppo}ZtKw^<$6$$56~q_=mUV@Os^INtkV^`=Hf{$WMBey<*!&VP)9S2eT7M-u`y zDQfCEg%$Xg?p3pHl$0q9PMs8>IH@QNM&Y%wSLU&12l1 zefrP$+oe6e|4dCmTmBWGlP&bKr-%|G)8R{p=eweR#DXJCg;(ZsK5cLojNzdmJ^Yi} z(I#TNt`m7W50hh7auV#SIGP(hYi4p?q_=2wbT9&FDSb=#NS&&TWU(YMj4ecS+fv5sI7l9v&xNGU+384&O7@!@&594XpmN zuU6F_T3I35?l?M>w%9IYylqz`E1PZCWhf{W?0X{Ax^#(JZr>{kAEo%;{hR-7|L~nc z@TcYE9JKKg0X4>fb8)Y)zW))BunpLr{3i?Q1DbV}xp!I%(M;tkAW9Ia4YKd_JOwwKpt;xb(6GTPc8o)9h|6OSR$4>}cGD~x056>>k zh&7n!43Fw8=<d=&Dkerq#qNn@3Wxe4=;O%B_`%Jm^HOx_{noRhDLn(p|Lq609>hPKrR{zn`64vBsY}nk&kc zZ+xtsrvkcS2BO5A8gG}+8O}z4!>ho7Ko8@@V6>n3&*Md}cH8ja=N(qhTItjl=zwuv zkw*tAbAI&;k`0vN(FCsdiP1B8TaonNh>JC}iHlBhNDO@;+et*Oy3OHkf^Y-UrDoB{ z)sE?_lyi`}7~QM>NjKpXZmk4}eI;qHGM^L`HXm#^E!lY)?WOeZ3rDBB`;ipWd;8%4 zamk18YviS8d9$=f3;k|WODn?;x=x?maN_a3gZ{PNis8Cx0bwKG^QACS(V-vr-*#|m z!E0003jK`uv$9A3KN5PQpRUZ~gr(?P`p ze-mcCmhcH*1YX1L@DYLE+FT9Ywk(vmvzRlu28V#4;u>ONlJDhr`>zJOR*#%FZ{UF9 zMIPIDkMfO1f<`>cnH3TYOP;0SLsgkId9~0QGr<6XzdQiXcn&IQ0if%Yi2i%oPF+RyAAgF_cE${h-&JMgPXs0-I@4hq8 z^TD0SP&(AHVIE6Ic1DHz#_M5_PbTOXqGsK|5mpjCOD60;Wf8q6@kih|7P(39%Kv_v z813+?$gW}HmK_Bq0A)?aWGlsw)weuGp!6DI@7@fXwQx#qbF=ZLLxLH(kF3Sq>F|k( zHF_a_S(t1lG=)#GJB!%q&Ja=7RDn3D@JW4_AQ;aZN90LT#3c3L+l76mBV) zL9n)PJw>ApAA+($zcM6y6UO0!9?F^?i6I)#+Yi$xRuMfNyXfi{b$(ui4SpqOW$E6_ zoKlM!fhd5T8cQ+HngACxltQ8u!}Nak4gGSIoK^Kcnk^bW4m zW{lwHZU1e)tC;C7BFe}Kg39-iM(~xHf6g6(EHZ9;?A+02g-zu*-^@fr84x09G~9QJ z60abZpL3m%PNL8O6av!WYg&m>|L#%(zb4a|bDyRKP^`^UU9-&Sx7{r@68pS;BSZ+m zgkEjd0tVXsu~2JEe3;rRI#i0}sTp6v1LGsolYafB#eX05F~6T9d7i%LnTqN26uplt z^>9e^A6cbCl2U~&SzkgsDNY-_+6GeTA%EoTe6D9VK6JniLCd$!K>@(EdqDRQ;6HuQb@V55Pb!!~0Vv?K>bSDRktvu5}Kp zXlN#6n3CEg0mE$W#0^c;cn>-AqO!pbaj)Obc*^ZOR3u{n$oZh2!wD8+*#+EeAw1R_ zwdELDi<;SJ_{R;P6bVCHkf3J_$IUBS6Sbzx&`zT%i~CRj5JVv!rj~e07BtVe`MC@A z8Z0EOF{~9qFy@9-pVVw=+FXy?S`nhlbfl_OZhtE z>S8cHZF23lEDuG$^V)6AQMC~4&DsT*StNIZ68?P1`gm+yb;*;BtpA_++zX1{5i+PZ z3VyVK#rpiehTBlb?|{>Sl@QLN66>I#<8M~qT%_3mWr)$Jj6~h`U!{o4;6L2N5PL?} zBPRPvEeckpYxxg#O(lL#q7@8)LHUBelm3_*4o6NMxizH!7E5^B+lHgBy#tPo?LBw> zE0$B4hJa+bp_3~j*uU}wY7WArLUJ;~A&A-Uo?rbW(csH>dl%%%a>Vvg0dh`$ew7kU zO_j`9Zbu2uepp8#aealO=FZbqpU;L_4B~jMePvT`!_!XR5hA`v1m!}jiD<5zeB6Md1{M>s961L;Kld~Yn^$nG{W1@<`Ig)U z!*2J!JKw;Vv9Qoq-@%_-e>~h7y63L1KM{8JXUhJ$n;ZX}+u)K#Qpm>Z35^M&=$k*^ zemAI+9CJiHw(B{$l5oYHecahWwRY{P-p6>`+~DQr%Lnj+E;Vpxf7;l0+S?+&R8~~@ zYNWB-f0d93+*uA?sTpVPbaHDAJ^2yWeYrFih}XlIf;rnin1|Cj8fjOlc5f=;f3I%0@8EkdkQ1;M(V+h!r>(>Gwi|JM#&Ys_*>`lj+sGnPOMBsgwDiYs z?l~GuQb_nHB-{ja)^5@iady43+g@w-cTXhyysW++ptF1pkC|m|p2a4!f}os;+T>+1 z17a17MeOHQZexCO^5p5*xG?`HKc|qL0|)^Ks);edRaEM4q_TxV^NRD%E}F8G7zyj; z+E#9(+c#eHARMaqbwVUic74C0A*9OKimG4PZpl%#b&E^i4Ncvgf0XFC*G>= zCnK5K$U6DYU|~^pVBCplh!Yk6SfkGlMU1f^%FcEh1(h*AEY~1ATf*J45lb#7#2irG z3HZXmC~*Dl&_BZWHtYZXU1DL*RW`N0y3QG+>@s=Yy>`6VQg8WSnkCP*Gt5C9eF%YY zqk6P5Qu$EQ5c|>D?;s#-g?jvy3@s%nG7JE>R)~lG5TXu==3Z1Vt;NH`oE+k5o})3h z#KJOGAra`N=w}xqo1d2#K9-(09C7^>M{wIILAUO1QR$&sK2cIrO6j1wawzqf$_-j) zu28B*7Vg|x{ATWFWJg5h&FY{AEOR~=p}D(I27J||eTW3oEPS)fFnB?De)opTUQ^nmaH7#yW-*@5?+ z;8(Z22?kGJbzm6oX~8UZr0Zw0JL2L7y(1#nCniMX!0K zXySxB@WTd@DLHZQ>HPrpdv8!2X@_rQPzs5liiP^Ijk5Ey@R&k=al%7McB3&!-`N!CJ~~ZS}Rkn=}m6= z)Ew-hPZ+1?aCcJ9TI}ul7ew%bICydVgUPeghAbigxH}M@p}$cAn(eZKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000JiNklZMCv@Tq$xLSA0-etA z>eq7l4Z1-rh?r59#ggy#%0w>{-cvk!s9B!eJm>f_jxX#u&JlyO>kOv!0qj z-_)B_N3&l9z>>*iy7YRzaic7f&1RFLD1HMV3Sf~|LC)FaGKE)G6>2g7#;ayuN1%5Q zxLp9u04xA(G&?qGy8+l+T3U|f10DeMdcCowrR5j^JK0snQkn%oDd8!~2~|#60bUh0 zMMsVtabCWB`Aj;U*2}W2lVzD_jJ>uOmY0_WNs=nc%E~^^m&<2nW`YwF6QhD4ECT?~ z^D8{hGv!?n1X&ctY-3|%TYrCl2tb_nPe$1T0>#=V01nL0&rh=VP!<*zCIIXwoP_{{ z+z>JVFqM>)eD*$`y2ZuCdjObd59$DLLJmC|s6$?oOeV8;?%WB5LZLXvaf~s>Ii1d( zRaI3^qtU2ekBv|$6ip-&X{*&*Y&M&VR6p$k5L411A%{ZsL|Ge>NF4yLa!_x?HYO`nga|rMbzR z!bF-S5C}}#Y_<-c&o>Mp3}6Ppbj~yE^ZABtHd{v^5SUyeRP+Fn0OD@9TeR71J97@- zSCONzkVuDy3qS>9tX&KEuCA_!$B!TXlem12SR$+9apfG*(>NvomVtqRudA!8S7ou; z+1aP5R4Qe++wBH}q2Lu@j;jOkkR~Oru#iYx>jqG-g&Bs1hNc0u0%!#A1Avq5?d?~i z(de|gUo;w>Zf|eD3g9GwGt~drp`oE^E#m>GBb=oG#Jn6xCX;E0!|@w|@syXBp9%(p z_tw%027~v?%gav#_#Qx`!{NA^OeWJCbs(<`&A`CGqi{I<1i&)@iO$Z>(~=||TuVoi zq=TKEou?>)i-g1BCxJj+07)9KQpPyKbI zpCEf%=K#lXj0Rr;Ajq<;)1puP1=3$4dt2v#)oLwP-DCN9Jf7B~PyKl%-zR%p=YYv% zDv>0~sDKz58JW_ePyHDHUXmoE$z&?o@=bj1+&Q-r2F=aQ!>Lp%vmU)vDwSz&ZXQ;` zkL+wc3)R%rd`YS8%GA_U#Ow9mUXPyF>%BcSH5DNT3dqjZJK%D;B){K(h}b0I_xndY z9?#84B$9Yjw(9YCZu`18@x(a41h7amY99|7><=+UFQZ{51}vnYx?G_aosz^IbUZAvy8 zjYdQD_4U8>_4Pfce7%_L8EAE6qTD#0zKNQen$qjnum5PVSezQ^`!xsnRSHO&`PgEy zIJ>*MFSfR}x|JLUz*7KERP8B!PqenSy1To(FKPw98b)OWlsw%D-~eN+W1}${4u{7E z2M7PUapT6LzP`SwYQtMjoH+4Cb#?Vu4u@l39tY@m0R9FLQiqUom2?2u&lvlCvo7MX zSZu~@HkWOdJ&xnPr3+0MK$2H2i&Fhc&&|y(Y}SCA37&AJSF6k^4x|CZo0^(BVzJob z`&3ei#bS$1O-&s{1WNglsVj2=l`K95u#Xt2lx}P5sr#$zn6i47a_X+SRqCy8E5&C3 zJSXNE1MnEYJb+~(X9ZHk(=&7_-$f_wdInnyL_WHVW_%vNEa6KjlOyDKx4es8M3HK<6ni4Ie{$_}>3hMH@^7qusbKpak?f;3l9r)NC_-_DC WPcdG_O{Cxe00005QOiEP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000H1Nkl~nm+dtE+{zM8Y+#1}%Oe5I%J z-M#zX_xJbny+lYUag@ox5vL=sfTf=ZAqL?k0+zb2;#3B#eUS=%Dv0z%-9V3a`{G~P?(#Yot=Uz2LmvnlHEHovGcz-n9LL#~A&}!Z+cPsWmjIk1f3sh?_o{%w z7km!j;=;m0E(`@078Y^&0U6@qUCa7K@JoTqmD%2x|@sZ^@I@AoCR z@B6Y+sZ`VHbRNJ}&HC{!?^8YJeG~0Ak?Gjp(wa?NYgQJ^T?4@10G`{n{Unpgthuh+ z?#GR;>$WqQ%$jZ6PXIh8p9cB%dhZ7_gt1GVA7;%Sx!a{u=^=n;eEtpjsVbMy-kGEvL)zz>|17S@z7WFD+I*bdGDgOdow81A?Xckt z)BR@voLgO8{r=juYg65Xzj^cK=KTEpuK@l4@I7N1o$yFgA&|t}8u{eMJ{P`bz-!~|elu|aw$H%_|P~&Hr9Vw+31SJg3jVDs6)K{HC zM5EC&6u8OdlIaV2E0)P**6!cG|I^sm*su@+QcBcnwMHhBS!2vU=l*xZJ_=VQqtWP@ z(b3T_1Dtn)n8~4>Ubh@j=<;Mx2-Ipdg=6B{*EdPVF9B3++kTqOW^cK!>oIA)Y&Lt# zw(Y01`b!P_SmYB2kRtyeI;n+oS1hE;XOv;|0XdEn2QW@AC_ z-35T9rKP(Y8ygR3_1D~I@i`UqNdV*IA4CbtW$0DN>VZ;+f^PV}ZxVT?n8YfXh31X7 z0A4LFF8;o_xL9J6zT$OBYe)E7C2tDA82Ja$P>{UVUcVeLp`(mRlh*XL`W&H9O#uIB zxzgnIBrPvB1)?-cv-3A(|O+{^dTBMJfvKN$4!}X`AfY&*026;ePzva5F z`zc6HIa)yje~i1 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_album_icon_folder.png b/res/screen-density-xhigh/T01_album_icon_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef79e8ba049d911f5c48d464345fa2aeb902785 GIT binary patch literal 3479 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_button_circle_bg_normal_press.png b/res/screen-density-xhigh/T01_button_circle_bg_normal_press.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5f8b242d7203cc396533b436e8c8507fd95534 GIT binary patch literal 5141 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 Y02G%!6Bpplz5oCK07*qoM6N<$f^IL^3IG5A literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_button_reveal.png b/res/screen-density-xhigh/T01_button_reveal.png new file mode 100644 index 0000000000000000000000000000000000000000..973b0eac55d5e9b8eaf635cc9603a90464df13d8 GIT binary patch literal 3108 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_controlbar_icon_camera.png b/res/screen-density-xhigh/T01_controlbar_icon_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..e243ff2d742b383bbe72ac38e282f9cb1cbde70f GIT binary patch literal 3903 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 N002ovPDHLkV1jZVR)_!q literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_controlbar_icon_delete.png b/res/screen-density-xhigh/T01_controlbar_icon_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..2980bdc5e08ffc2a727bf4441acb3c3539d3095a GIT binary patch literal 3518 zcmV;v4MFmWP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0008%Nkl{0K+ic)GI*j7Q=p$QkDV<>>@E>=a#n9K(gOlI(1va zP$;zI)ucjqt)>6t(xc&UxX@@c9s?v236_@J8FINCnM}t1Q(Q`!?H89`X~P1Tril>3 z)j-oUq?DYVp4#_+HV`Xp7{(~@*2N{0&1UlnfDnTD`T1- z00svKe^;y3FD@qAQp&tvzze|l9%q6oEozzu!1D4kx~}^Id~k5U-rnBL9Q-Ui>`^+u zxw$!VeSPg^nac3+a4nrqmw~74C=KlU<2tg{9Lf3WH*VnuBrfH(< zI;LqlLZwnEG)=>@to{IQ<>YN(H4=&Z>Uy)Eo-PBcz=vow>f`~tz@iW$>jm(=r;=*5 z`o}PgB*5C*+H>HeU0)~^zHV)8?E<@Vb93*3&bmAalv)oZ7x)#f)oOp*_g7a}7HyVwa!w{vrq#YHd6|e$UzzSFaD_{kzfEBO;?i1ki^YcgT`-_WS^r*KZb^e-c%};e*gyt2Fmq%Jp+sauN;QV0^fj_bbLKKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0006dNklvL3q8As1m?_&a-^@JOh52m(sYte2DHsQP~HdGp8=4wXIE7lk1{V&g6 ztzhK20Ip)g*D-n`$^dK|139=n!~%D0@j4rvj?oiQLPUAXEPn!61u*h1)c}^RnbR3T zPD$G!YM#wX*~p!q*8LU+^#?%6zn*sQ~<8=}vUkC3+jWLo3 zZ8&N^aC3z&saGd+{C6(mq6-gDV&osLaB62VM3ewH3!>p=M066=maR(>8F{E`{-sjvF3cgPf+fmp1DNV&p^qy0oxFW)Z^3 zhuqO$TGH>9mL(pbN&GWj1dMKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007lNkl95QaZIo_kgY!5!cVa5|7HaHzm^5LAKV3a~2(sQ{=TbYPXB z=X=2qSuzZ<;BNPX73TgKW|$G2^y}aKclV^hcDv=0am9rr6U+oN!Avj{wBXvhfcL)b z&7A=<$KI&>s*ifGP0MLg*A~;1&1*G<_ntBlalYt!RMf z5TfTGcn8dtiiIdT0ajXqS4MI(VA&BlWZfk&(=MP^(0e}zzMat!UqsC)1+ULUt^uk& zmmC3KWR1|A-JNgJse%%g-y`qI*OolGlMswSwI8xcO-2l5sY!(+$22+e_l6}S=)Et1 z-%3MCO|S-TfhMJkPCIlvR72FxujdQL^q2M%8hmsOSh>D>Kz8S-_ z3k3mc=iH4+LGS&jN4fV;F3R))*7aiqY@O5=P(Qm|APhlwve$GTMi##js{^`VTo)qMe>uHiGxTm6aSM9#V z3`%8a)}-E56BQ@uF#n*Zw3L(yfsfasS~cg~>PT~Z%0%V|Ijn68su*{U?nRw*GyXgX z(dOf@MbQwv#Mao0f4ZceCY*Bf*MpgdjC%geziDg%z&K6k2D_M7CSt!3{5lQgS tHB0{Y_hkBx{H|IimNc=P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0006MNklB^jzfJC5(*aak30YGBSckI;hAlNC$|6?00UqE41fXfKLftBU6fMB04@Ns z1^0Fba0XEHEh3`cFNvC^nu7ZRka*w#0U+&zoC26H?75~D0Ja^U#Q=`#eMv;OA%H$s z-`f^1CMwe6+O;bYoyG#50X!VS!~i}GfNgL(WFw=Fex!1;a#hZG#Wa9keD0Q>@|0Q@jj zKrC>x0i~3Q3L!1ouMA~gG8E2Kr*e4kW8$yx1dao+oDpIePZIF7qiw>vmJG z#o%1@g9n%gR@UHLHN5+tnzc(UGp?Jv02B&R*h&RU18UJpYo07!z_}h-6ad~_&ppEP z!L{3v5ZzfG&$soEY_{g7OSQL70(Y)*K0-AbW|YuPgf<9%eRvB@GGDCI$v3VNVywkc@k8 zr&)JP1xh%amoYSrnQ;FR-eK8yFwyp3BpSeOJOZz%OF z;aIbTi=}44CZU3hv(;QLrKoH^+FG;xpTxUFz3uB}`@ShXuT}N74}{nA>xpsu`T2P) zzwDwU__&3?o%#0LX*YAquJC>l;cGvfvN`h7OOw9G5}GpIM>ptjuig55&r?&NeowW@ zZl{Lu9gwo&Kw3j00x z-|yVNKizKr=D6y7RsY1>+x}-{UIzK;W5pZ?g@P+L`?6lTC^;HPnD~ABKJDDoqA91J z9?yI^d-m*iU%#5JzIy7!bo0q4FJx_95u&9(B}o1cm;LXnm--$`r*qnbd+Gk&_C@vs z+mEyjZ^R#LoxVna;}RS^+xq40+uU*k34_^Zdul2_|Fk)qHaTgdhVI|>x_24g@l5;6 k664{`4UMl48Gl%69$q=AHTC`kV2WYzboFyt=akR{03swSE&u=k literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_controlbar_icon_move.png b/res/screen-density-xhigh/T01_controlbar_icon_move.png new file mode 100644 index 0000000000000000000000000000000000000000..99e3cd7e567a4585107a05783beff3174461e7c8 GIT binary patch literal 3289 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 XBcshCA%YWI00000NkvXXu0mjfHuD$8 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_controlbar_icon_save.png b/res/screen-density-xhigh/T01_controlbar_icon_save.png new file mode 100644 index 0000000000000000000000000000000000000000..39baa6a2ede1733000ae98098034506eca3f19c4 GIT binary patch literal 3238 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 Y0G~tc&d7UTwEzGB07*qoM6N<$g1FW5_5c6? literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_controlbar_icon_share02.png b/res/screen-density-xhigh/T01_controlbar_icon_share02.png new file mode 100644 index 0000000000000000000000000000000000000000..f58e87ef25406e036930470b56412f007590c1c0 GIT binary patch literal 3637 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_icon_thumbnail_bookmark.png b/res/screen-density-xhigh/T01_icon_thumbnail_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb690af79494c784da628d53b8679b9588faa42 GIT binary patch literal 3807 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_main_folder_bg.png b/res/screen-density-xhigh/T01_main_folder_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..16d1d5965e0d44e55e6c0e015be43729cfd137fc GIT binary patch literal 4436 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 ZK%u2iXylP8_n)%`m>OCcVD#Od{uk7Av3mdj literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_places_thumbnail_bg.png b/res/screen-density-xhigh/T01_places_thumbnail_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0fb2745ed5baa434ae4dd3678e6e28ace06e5f GIT binary patch literal 3330 zcmb7GXE5B0*Zv8?>b-M`zIu<&u3m!`D~J}B=p|~fdP|7tWrZXRAT>06G1?AOH%ASO9>`)Ex?a@W9O{&?msn$Cq0l3g!0o_i=UibOC^nC6omM zX0gYlieEj27$zaJ41LTQNx97-sYr$l0Wc4U#vqBObdk}lhgMsgh<&&ui7+h<`GV0* zlp=*}fno1RjV14uVlTGXN5Go*zyC*ktiA z5|m^B-1IIw8rNI#qF)F1%rNw zjpL|Q#5JPVzT4``^LM1mCI0ODrwzVnX}f4$qVw;)Urvq6I3{0%;+&Ru(seIe$Zsw= zXYTduJGH^V44Yc92_fX7;V;;_*s^&wIK&?<=r zH)yh-_OOU{6La+3UG5>jbdZmO@b&jXXdq-ykR1LF!nH9Fp@i`UPOyW-Hw{kNZZo%p zOkXPTUdvW0RbT2qj-hdBF$k^dPkn6Bm$=tIByy$bAJ3ePmdlET`C{wOOeKY1{Xep)zK}27{aWKjy_Bv79g^(+!9pU_?`D7VOP{1$4fZ%by2eT(PVh79GT;rIUBVnfJ$^r->sHqEx|HnB^d zw5H{|0`ry1QW&jV`XfkPDaO3sEU}Va_E~}Acr25?VOibV>=`yUW;eWh{g1$Q+LdfB zliaUX(_?$OKXQK%o(5A;CNRbhB_V`Z3t3255Ujy0^?63+tTU;sLoi7Nse`=TeCm83 zOE?$0!=`>LKV3uktwSTN5UJz?B%jX zZBj0_9@ROyIq(|28nYVRgD!dWVFjwZOS{ARBAQBb$Ux9mP#2LtaTm2~v1qYUK~}+J ztg3W|7O(awV=wK{3jXX}fy*oY^cY!ej% zfT8ieF|NSexUF2cT-iw3XlVS)_}lThe7QnZsd?$$!rj98!nGEMMcNloz_qOai}%m}8cg|%UOff$R% zcwr(O5l+mAmH~7hF0(5$qCMi}l`08k;v!WI=OfO@fRFwRN)MG*3nq$i>JbB{IeQWa z_$1Bbg3Km{eoVOE9c58Cql;ihv<1YTB&8-B#*B&Qs)-k}53US%Z5aff`Pr?9O`o9( zn+kgmE3x%Bd7L{garw;`**C())-nNK`-Y+4&98D0H_Bw~U$g`4rp7uR)`DZ=T$Q-An-$ zNPYqYVRE!)w9TE1^RVYUpVQQpur9wE7Y{XGl(cCwYNp53#ccP~@wg5Dd{xJT-_4uI zm~f|xe-Qa&?kkDoj$>+HB!ysnV!Ty?dYW$%oNY=fS1x#J85*#r^+zj5Yqby|WvW;& zW*`Svs}_H%vZT;1+paz+?rQyI7LJ1Jdm3^mii6Se-kzV9tq8ZNg5F@R<57NlSdVEYKle1 z55F{xVqYl~9lg0Zr0bZ~@e9S0Z8F{!Nq9(HtJ0c+0ej7w z)*M>pq9eNm!i+tlANP#L^fVKA9FSX*ZO2C(EYBa>nZhNk*P0#wB%s*U7?V@b3|Qt| z#;66M<&bUmM4!>m`O8@!t7`h&o=mzXg^ zokEL(3mYe!cGE9vQ*-;PVVAntzo?63Rjfk|PGBSMOM5XhnTX@b7pQDhM5OrdWe4nA zO!%(z#M)D8pQCn~!1ZbEo77$9PUQ*P@ueP)AWm z0lLlBqYW3<)g11M-(xRUm{>XO3jK%aW^T4vQFW#3B+LgtfInMfT8Z=*yqXy6SPT}# z)peS7+MjA1YA!-o5@*$Iu9p{%mZP3_2bY{oE$iZm<6|eUGtSbfp?A~s)5j7h6Ap^+ zt0^jOsQX{-T~j)CjzxUts<&74ufp)9~lcj3Z;Pp?8w;0U|Kri@a zn{#a(@6XuqBm36B8&G~znH(?wr7OHmmSp6)kj+`WiOJzRi;S0XX&fyrzoLVPSKD{(?kl+48XPk}hkESU|E@ z0G;=85a*IGO~w79)}A$R_(vZaGTOxb^KwIn4PkZxy1&VGBBv=GO z+=~Czh~EFx{}cSL`oAX&78!E?Tkrpof{)6@D5P=NW!Dqu+Bb@9Jams*WYb;YIHFgW zY#Nh&%u)C))1xZ&?a@4ud+C2rk)xSpF literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T01_toolbar_icon_delete_dim_web.png b/res/screen-density-xhigh/T01_toolbar_icon_delete_dim_web.png new file mode 100644 index 0000000000000000000000000000000000000000..08e773bdc4b9af985ce6c836c723598da4822e8a GIT binary patch literal 3530 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 + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_FORM_ALBUM_LIST.xml b/res/screen-size-normal/IDL_FORM_ALBUM_LIST.xml new file mode 100644 index 0000000..9c1b3fb --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_ALBUM_LIST.xml @@ -0,0 +1,21 @@ + + + + + 720 +

+ + + + +
+ + +
+
+ + +
+ diff --git a/res/screen-size-normal/IDL_FORM_ALBUM_LIST_EDITOR.xml b/res/screen-size-normal/IDL_FORM_ALBUM_LIST_EDITOR.xml new file mode 100644 index 0000000..24abc78 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_ALBUM_LIST_EDITOR.xml @@ -0,0 +1,31 @@ + + + + + 720 +
+ + + + +
+ + + + + +
+
+ + + + +
+ +
diff --git a/res/screen-size-normal/IDL_FORM_ALBUM_NAME_EDITOR.xml b/res/screen-size-normal/IDL_FORM_ALBUM_NAME_EDITOR.xml new file mode 100644 index 0000000..011d6b6 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_ALBUM_NAME_EDITOR.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_FORM_FILE_LIST.xml b/res/screen-size-normal/IDL_FORM_FILE_LIST.xml new file mode 100644 index 0000000..a785490 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_FILE_LIST.xml @@ -0,0 +1,21 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+
diff --git a/res/screen-size-normal/IDL_FORM_FILE_LIST_EDITOR.xml b/res/screen-size-normal/IDL_FORM_FILE_LIST_EDITOR.xml new file mode 100644 index 0000000..ee99223 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_FILE_LIST_EDITOR.xml @@ -0,0 +1,26 @@ + + + + + 720 +
+ + + + +
+ + + + + +
+
+ + + + +
+
diff --git a/res/screen-size-normal/IDL_FORM_IMAGE_CROP.xml b/res/screen-size-normal/IDL_FORM_IMAGE_CROP.xml new file mode 100644 index 0000000..ff005c6 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_IMAGE_CROP.xml @@ -0,0 +1,18 @@ + + + + + + 720 +
+ + + + +
+ + +
+
diff --git a/res/screen-size-normal/IDL_FORM_SETTING_MAIN.xml b/res/screen-size-normal/IDL_FORM_SETTING_MAIN.xml new file mode 100644 index 0000000..502cb54 --- /dev/null +++ b/res/screen-size-normal/IDL_FORM_SETTING_MAIN.xml @@ -0,0 +1,22 @@ + + + + + 720 +
+ + + + +
+ + +
+ + + + + +
diff --git a/res/screen-size-normal/IDL_SLIDESHOW_SETTING_POPUP.xml b/res/screen-size-normal/IDL_SLIDESHOW_SETTING_POPUP.xml new file mode 100644 index 0000000..b70e9b0 --- /dev/null +++ b/res/screen-size-normal/IDL_SLIDESHOW_SETTING_POPUP.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/res/slk-SK.xml b/res/slk-SK.xml new file mode 100644 index 0000000..3dd8fad --- /dev/null +++ b/res/slk-SK.xml @@ -0,0 +1,99 @@ + + + + Bol dosiahnutý maximálny počet znakov + Prezentácia + Prekročil sa maximálny počet súborov + Nastavenia prezentácie + VybraÅ¥ vÅ¡etky + OdstrániÅ¥? + UpraviÅ¥ + Správa + Stiahnuté položky + Názov albumu sa už používa + UložiÅ¥ + 20 sekúnd + Aktivácia + OtočiÅ¥ doľava + 2 sekundy + Správy + Hotovo + Nedá sa premenovaÅ¥ + E-mail + Neplatné znaky + Presunuté + ZruÅ¡iÅ¥ + Vybrané + OdstrániÅ¥ + Titulky + ZruÅ¡iÅ¥ + Dosiahol sa maximálny počet znakov (%d) + Dosiahol sa maximálny počet znakov (%d) + Prezent. + Vysunutie + SpustiÅ¥ prezentáciu + %s už existuje + Načítava sa... + Albumy + Nedá sa premenovaÅ¥. Názov albumu sa už používa + Operácia zlyhala + Ukladanie... + Efekt prechodu + Hudba + Vybraté položky: %d + VytvoriÅ¥ priečinok? + Vymazanie sa nepodarilo + 1 vybratá položka + Video + Zoom + KopírovaÅ¥ + Clona + Interval prezentácie + Prehrávač videí + Prezentácia + sekundy + OtočiÅ¥ doľava + Stránka + Kopírovanie... + 10 sekúnd + Prebieha spracovanie... + Galéria + Žiadny názov + Obrázky + Stmievanie + UpraviÅ¥ + 5 sekúnd + Nie sú vybraté žiadne položky + Odstránené + OdstrániÅ¥? + Už existuje. PrepísaÅ¥? + Odstraňovanie... + Hotovo + 3 sekundy + Kat. fotoaparátu + OtočiÅ¥ doprava + OpakovaÅ¥ + Uložené + Prelínanie + Náhodné poradie + Presúvanie... + Presunutie sa nepodarilo + Videá + Nepodporovaný typ súboru + PremenovaÅ¥ + Dokončené + VybraÅ¥ vÅ¡. + VÅ¡etky albumy + ZmeniÅ¥ názov + Presunúť + Nedá sa odstrániÅ¥ + OtočiÅ¥ doprava + Interval + Už existuje + VytvoriÅ¥ album + Žiadne položky + Roleta + Uloženie sa nepodarilo + diff --git a/res/slv-SI.xml b/res/slv-SI.xml new file mode 100644 index 0000000..629b2dd --- /dev/null +++ b/res/slv-SI.xml @@ -0,0 +1,99 @@ + + + + Doseženo je največje dovoljeno Å¡tevilo znakov + Diaprojekcija + Največje dovoljeno Å¡tevilo datotek je preseženo + Nastavitve diaprojekcije + Izberi vse + IzbriÅ¡em? + Uredi + Sporočilo + Prenosi + Ime albuma se že uporablja + Shrani + 20 sekund + Vklop + Zavrti v levo + 2 sekundi + Sporočila + Končano + Ni mogoče preimenovati + E-poÅ¡ta + Neveljavni znaki + Premaknjeno + Prekliči + Izbrano + IzbriÅ¡i + Podnapisi + Prekliči + Doseženo je največje Å¡tevilo znakov (%d) + Doseženo je največje Å¡tevilo znakov (%d) + Diaproj. + Prehod + Začni diaprojekcijo + %s že obstaja + Nalaganje... + Albumi + Ni mogoče preimenovati. Ime albuma se že uporablja + Postopek ni uspel + Shranjujem + Učinek prehoda + Glasba + %d predmetov izbranih + Ustvarim mapo? + Brisanje ni uspelo + 1 predmet je izbran + Video + Povečava + Kopiraj + Mavrica + Interval diaprojekcije + Video predvajalnik + Diaprojekcija + sekund + Zavrti v levo + Stran + Kopiram ... + 10 sekund + Obdelujem... + Galerija + Brez imena + Slike + Zatemnitev + Uredi + 5 sekund + Ni izbranih predmetov + Izbrisano + Odstranim? + Že obstaja. PrepiÅ¡em? + BriÅ¡em + Končano + 3 sekunde + Mapa s slikami + Zavrti v desno + Ponovi + Shranjeno + Raztopi + Naključno + Premikam + Premikanje ni uspelo + Videoposnetki + Nepodprta vrsta datoteke + Preimenuj + Končano + Izberi vse + Vsi albumi + Spremeni ime + Premakni + Brisanje ni mogoče + Zavrti v desno + Interval + Že obstaja + Ustvari album + Ni predmetov + Zastor + Shranjevanje ni uspelo + diff --git a/res/spa-ES.xml b/res/spa-ES.xml new file mode 100644 index 0000000..650c027 --- /dev/null +++ b/res/spa-ES.xml @@ -0,0 +1,99 @@ + + + + Alcanzado el número máximo de caracteres + Presentación de diapositivas + Alcanzado el número máximo de archivos + Configuración de presentación de diapositivas + Seleccionar todo + ¿Eliminar? + Editar + Mensajes + Descargas + Nombre de álbum ya en uso + Guardar + 20 segundos + Activación + Girar a la izquierda + 2 segundos + Mensajes + Hecho + Imposible cambiar el nombre + Correo electrónico + Caracteres no válidos + Movido + Cancelar + Seleccionado + Eliminar + Subtítulos + Cancelar + Número máximo de caracteres (%d) alcanzado + Número máximo de caracteres (%d) alcanzado + Pres diap + Diapositiva + Iniciar presentación de diapositivas + %s ya existe + Cargando... + Álbumes + No se puede cambiar el nombre. Nombre de álbum ya en uso + Error de funcionamiento + Guardando... + Efecto de transición + Música + %d elementos seleccionados + ¿Crear carpeta? + Error al borrar + 1 elemento seleccionado + Vídeo + Zoom + Copiar + Iris + Intervalo de presentación de diapositivas + Reproductor de vídeo + Presentación de diapositivas + segundos + Girar a la izquierda + Página + Copiando... + 10 segundos + Procesando... + Galería + Sin nombre + Imágenes + Desaparición + Editar + 5 segundos + Ningún elemento seleccionado + Eliminado + ¿Eliminar? + Ya existe. ¿Desea reemplazarlo? + Eliminando... + Eliminar + 3 segundos + Carrete + Girar a la derecha + Repetir + Guardado + Fundir + Reproducción aleatoria + Moviendo... + Error al mover + Vídeos + Tipo de archiv no admitido + Renombrar + Finalizado + Seleccionar todo + Todos los álbumes + Cambiar nombre + Mover + No se puede eliminar + Girar a la derecha + Intervalo + Ya existe + Crear álbum + Ningún elemento + Efecto persiana + Error al guardar + diff --git a/res/spa-MX.xml b/res/spa-MX.xml new file mode 100644 index 0000000..95c416c --- /dev/null +++ b/res/spa-MX.xml @@ -0,0 +1,99 @@ + + + + Se ha alcanzado el número máximo de caracteres + Presentación de diapositivas + Se ha excedido el número máximo de archivos + Configuración de presentación de diapositivas + Todo + ¿Eliminar? + Editar + Mensaje + Descargas + Nombre de álbum ya existe + Guardar + 20 segundos + Activación + Girar a la izquierda + 2 segundos + Mensajes + Realizado + No se puede renombrar + Correo + Caracteres no válidos + Movido + Cancelar + Seleccionado + Eliminar + Subtítulos + Cancelar + Número máximo de caracteres (%d) alcanzado + Número máximo de caracteres (%d) alcanzado + Pres diap + Deslizar + Iniciar presentación de diapositivas + %s ya existe + Cargando... + Álbumes + No se puede renombrar. Nombre de álbum ya existe + Error de funcionamiento + Guardando... + Efecto de transición + Música + %d elementos seleccionados + crear carpeta? + Error al eliminar + 1 elemento seleccionado + Video + Zoom + Copiar + Iris + Intervalo de presentación de diapositivas + Reproductor de Video + Presentación de diapositivas + segundos + Girar a la izquierda + Página + Copiando... + 10 segundos + Procesando... + Galería + Sin nombre + Imágenes + Aparecer + Editar + 5 segundos + No se ha seleccionado nada + Eliminado + ¿Eliminar? + Ya existe. ¿Desea sustituirlo? + Eliminando... + Realizado + 3 segundos + Carrete + Girar a la derecha + Repetir + Guardado + Fundir + Aleatorio + Moviendo… + Error al mover + Videos + Tipo de arch. no admitido + Renombrar + Completo + Todo + Todos los álbumes + Renombrar + Mover + No puede eliminar + Girar a la derecha + Intervalo + Ya existe + Crear álbum + Ningún elemento + Persiana + Error al guardar + diff --git a/res/srp-RS.xml b/res/srp-RS.xml new file mode 100644 index 0000000..02c2fd1 --- /dev/null +++ b/res/srp-RS.xml @@ -0,0 +1,99 @@ + + + + Dostignut maksimalan broj karaktera + Slajd-Å¡ou + Dostignut je maksimalan broj fajlova + PodeÅ¡avanja za slajd-Å¡ou + Izaberi sve + ObriÅ¡i? + Izmeni + Poruka + Preuzimanja + Naziv albuma već u upotr. + Sačuvaj + 20 sekundi + Aktivacija + Rotiraj ulevo + 2 sekunde + Poruke + Gotovo + Nemoguće preimenovati + E-poÅ¡ta + Neispravni karakteri + PremeÅ¡teno + PoniÅ¡ti + Označeno + ObriÅ¡i + Titlovi + PoniÅ¡ti + Dostignut maksimalan broj karaktera (%d) + Dostignut maksimalan broj karaktera (%d) + Slajd-Å¡ou + Slajd + Pokreni slajd-Å¡ou + %s već postoji + Učitavanje... + Albumi + Nemoguće preimenovati. Naziv albuma već u upotrebi + Operacija neuspeÅ¡na + Memorisanje... + Efekat prelaza + Muzika + %d stavke/i označene/o + Kreiraj folder? + Brisanje neuspeÅ¡no + 1 stavka izabrana + Video zapis + Zumiranje + Kopiraj + Iris + Interval za slajd-Å¡ou + Video plejer + Slajd-Å¡ou + sekunde + Rotiraj ulevo + Strana + Kopiranje... + 10 sekundi + Obrada... + Galerija + Nema imena + Slike + Izbledi + Izmeni + 5 sekundi + Nema izabranih stavki + Obrisano + Ukloni? + Već postoji. PrebriÅ¡i? + Brisanje... + Gotovo + 3 sekunde + Traka kamere + Rotiraj udesno + Ponovi + Sačuvano + Rastvori + Nasumično + PremeÅ¡tanje + PremeÅ¡tanje neuspeÅ¡no + Video zapisi + Nepodržani tip fajla + Preimenuj + ZavrÅ¡eno + Izab. sve + Svi albumi + Promeni ime + Premesti + Nemoguće obrisati + Rotiraj udesno + Interval + Već postoji + Kreiraj album + Nema stavki + Roletna + Memorisanje neuspeÅ¡no + diff --git a/res/swe-SE.xml b/res/swe-SE.xml new file mode 100644 index 0000000..951e9bf --- /dev/null +++ b/res/swe-SE.xml @@ -0,0 +1,99 @@ + + + + Maximalt antal tecken har använts + Bildspel + Högstsa antal filer har överskridits + Bildspelsinställningar + Välj alla + Radera? + Redigera + Meddelande + Nedladdningar + Albumnamnet används redan + Spara + 20 sekunder + Aktivera + Rotera moturs + 2 sekunder + Meddelanden + Klar + Kan inte byta namn + E-post + Ogiltiga tecken + Flyttad + Avbryt + Markerade + Radera + Textning + Avbryt + Högsta antal tecken (%d) har uppnÃ¥tts + Högsta antal tecken (%d) har uppnÃ¥tts + Bildspel + Bild + Starta bildspel + %s finns redan + Laddar... + Album + Kan inte byta namn. Albumnamnet används redan + Åtgärden misslyckades + Sparar... + ÖvergÃ¥ngseffekt + Musik + %d objekt valda + Skapa mapp? + Radering misslyckades + 1 valt objekt + Videoklipp + Zoom + Kopiera + Iris + Bildspelsintervall + Videospelare + Bildspel + sekunder + Rotera moturs + Sida + Kopierar... + 10 sekunder + Bearbetar... + Galleri + Inget namn + Bilder + Tona + Redigera + 5 sekunder + Inga objekt valda + Raderad + Ta bort? + Används redan.\nSkriv över? + Raderar... + Klar + 3 sekunder + Kamerarulle + Rotera medurs + Upprepa + Sparad + Lös upp + Blanda + Flyttar... + Det gick inte att flytta + Videoklipp + Filtypen stöds ej + Byt namn + Slutförd + Välj allt + Alla album + Byt namn + Flytta + Kan inte radera + Rotera medurs + Intervall + Finns redan + Skapa album + Inga objekt + Fördragning + Det gick inte att spara + diff --git a/res/tha-TH.xml b/res/tha-TH.xml new file mode 100644 index 0000000..d1abb35 --- /dev/null +++ b/res/tha-TH.xml @@ -0,0 +1,99 @@ + + + + จำนวนตัวอักษรเกินขอบเขต + เลื่อนชม + เกิน​จำนวน​ไฟล์​สูง​สุด​แล้ว + การ​กำหนด​การ​แสดง​สไลด์ + เลือก​ทั้ง​หมด + ลบ? + แก้ไข + ข้อ​ความ + ดาวน์​โหลด + ชื่อ​อัลบั้ม​ใช้​อยู่​แล้ว + บันทึก + 20 ​วินาที + ใช้​งาน + หมุน​ซ้าย + 2 ​วินาที + ข้อความ + เรียบร้อย + เปลี่ยน​ชื่อ​ไม่​ได้ + อีเมล์ + อักขระ​ไม่​ถูก​ต้อง + ย้าย​เรียบ​ร้อย + ยก​เลิก + เลือก + ลบ + คำ​บรรยาย + ยก​เลิก + ถึง​จำนวน​ตัว​อักษร​สูง​สุด (%d) + ถึง​จำนวน​ตัว​อักษร​สูง​สุด (%d) + สไลด์​โชว์ + สไลด์ + เริ่ม​การ​แสดง​สไลด์ + %s มีอยู่แล้ว + โหลด... + อัลบั้ม + ไม่​สามารถ​เปลี่ยน​ชื่อ ชื่อ​อัลบั้ม​ใช้​อยู่​แล้ว + การ​ทำ​งาน​ล้ม​เหลว + บันทึก...   + เอ​ฟเฟ็กต์​การ​เปลี่ยน + เพลง + เลือก %d ​รายการแล้ว + สร้าง​แฟ้มใหม่? + ลบ​ผิด​พลาด + เลือก 1 ​รายการ + วี​ดี​โอ + ซูม + คัด​ลอก + ไอ​ริ​ส + ช่วง​เวลา​การ​แสดง​แบบ​สไลด์ + เครื่อง​เล่น​วีดีโอ + สไลด์โชว์ + วินาที + หมุน​ซ้าย + หน้า + กำลัง​คัด​ลอก... + 10 วินาที + ดำเนิน​การ... + แกลเลอรี่ + ไม่​มี​ชื่อ + รูป​ภาพ + จางหายไป + แก้ไข + 5 ​วินาที + ไม่​มี​รายการ​ที่​เลือก + ลบ​แล้ว + ลบ? + มี​อยู่​แล้ว เขียน​ทับ? + ลบ... + เรียบร้อย + 3 วินาที + การ​หมุน​กล้อง + หมุน​ขวา + ซ้ำ + บันทึก\nเรียบร้อย + ละลาย + สับ​เพลง + กำลัง​ย้าย... + การ​ย้าย\n​ผิด​พลาด + วี​ดี​โอ + ไม่​รอง​รับ​\nชนิด​ไฟล์ + เปลี่ยน​ชื่อ + เรียบ​ร้อย + เลือก​หมด + อัลบั้ม​ทั้ง​หมด + เปลี่ยน​ชื่อ + ย้าย + ลบ​ไม่​ได้ + หมุน​ขวา + ช่วง​เวลา + มี​อยู่​แล้ว + สร้าง​อัลบั้ม​ใหม่ + ไม่มีรายการ + บัง + การ​บันทึก​ผิด​พลาด + diff --git a/res/tur-TR.xml b/res/tur-TR.xml new file mode 100644 index 0000000..0c7cd7b --- /dev/null +++ b/res/tur-TR.xml @@ -0,0 +1,99 @@ + + + + Maksimum karakter sayısına ulaşıldı + Slayt gösterisi + Maksimum dosya sayısı aşıldı + Slayt gösterisi ayarları + Hepsini seç + Sil? + Düzenle + Mesaj + Ä°ndirilenler + Albüm adı zaten kullanılıyor + Kaydet + 20 saniye + Etkinleştirme + Saat yönünün tersine döndür + 2 saniye + Mesajlar + Kaydet + Yeniden adlandırılamıyor. Dosya kullanımda. + E-posta + Geçersiz karakter + Taşındı + Ä°ptal + Seçili + Sil + Altyazılar + Ä°ptal + Maksimum karakter sayısına (%d) ulaşıldı + Maksimum karakter sayısına (%d) ulaşıldı + Slayt şov + Slayt + Slayt gösterisini başlat + %s zaten var + Yükleniyor... + Albümler + Yeniden adlandırılamıyor. Albüm adı zaten kullanılıyor + İşlem başarısız + Kaydediliyor… + Geçiş efekti + Müzik + %d öğe seçildi + Klasör oluşturulsun mu? + Silinemedi + 1 öğe seçildi + Video + Yakınlaştır + Kopyala + Ä°ris + Slayt gösterisi aralığı + Video Oynatıcı + Slayt gösterisi + saniye + Saat yönünün tersine döndür + Sayfa + Kopyalanıyor... + 10 saniye + Uygulanıyor... + Galeri + Ä°sim yok + Resimler + Soldur + Düzenle + 5 saniye + Seçili öğe yok + Silindi + Kaldır? + Zaten var. Üzerine yazılsın mı? + Siliniyor... + Tamamlandı + 3 saniye + Kamera klasörü + Saat yönünde döndür + Tekrarla + Kaydedildi + Çöz + Karışık + Taşıyor... + Taşıma başarısız + Videolar + Desteklenmeyen dosya türü + Yeniden adlandır + Tamamlandı + Tümünü seç + Tüm albümler + Ä°sim değiştir + Taşı + Silinemiyor + Saat yönünde döndür + Aralık + Zaten var + Albüm oluştur + Öğe yok + Kör + Kaydetme başarısız + diff --git a/res/ukr-UA.xml b/res/ukr-UA.xml new file mode 100644 index 0000000..f950606 --- /dev/null +++ b/res/ukr-UA.xml @@ -0,0 +1,99 @@ + + + + Досягнуто максимальної кількості символів + Слайд-шоу + Перевищено максимальну кількість файлів + Установки слайд-шоу + Вибрати всі + Видалити? + Редагувати + Повідомлення + Завантаження + Ім’я альбому вже викор. + Зберегти + 20 секунд + Активація + Обернути ліворуч + 2 секунди + Повідомлення + Готово + Неможливо перейменувати + Email + Хибні символи + Переміщено + Скасувати + Вибране + Видалити + Субтитри + Скасувати + Досягнуто максимальної кількості символів: %d + Досягнуто максимальної кількості символів: %d + Слайд-шоу + Слайд + Розпочати слайд-шоу + %s вже існує + Завантаження... + Альбоми + Неможливо перейменувати. Ім’я альбому вже використовується + Збій операції + Збереження... + Ефект переходу + Музика + Вибрано %d об’єктів + Створити папку? + Збій видалення + Вибрано 1 об’єкт + Відео + Масштаб + Копіювати + Ірісова діафрагма + Інтервал слайд-шоу + Відеоплеєр + Слайд-шоу + секунди + Обернути ліворуч + Сторінка + Копіювання... + 10 секунд + Обробка... + Галерея + Немає імені + Зображення + Загасання + Редагувати + 5 секунд + Об’єкти не вибрані + Видалено + Видалити? + Вже існує. Переписати? + Видалення... + Готово + 3 секунди + Плівка камери + Обернути праворуч + Повторення + Збережено + Розчинення + Випадковий порядок + Переміщення... + Збій переміщення + Відео + Непідтримуваний тип файла + Перейменувати + Завершено + Вибр. всі + Усі альбоми + Змінити ім'я + Перемістити + Неможливо видалити + Обернути праворуч + Інтервал + Вже існує + Створити альбом + Немає об’єктів + Жалюзі + Збій збереження + diff --git a/res/urd-IN.xml b/res/urd-IN.xml new file mode 100644 index 0000000..e648629 --- /dev/null +++ b/res/urd-IN.xml @@ -0,0 +1,99 @@ + + + + کریکٹر کی حد ہو گئی + سلائیڈ شو + فائلوں کی زیادہ سے زیادہ تعداد تجاوز کرگئی + سلائڈ شو سیٹنگیں + تمام منتخب کریں + مٹانا؟ + تبدیلی + پیغام + ڈاؤن لوڈز + البم نام پہلے استعمال میں + محفوظ + 20 سیکنڈز + ایکٹیویشن + بائيں گھمائيں + 2 سیکینڈ + پیغامات + ٹھیک ہے + نیا نام دینے سے قاصر + ای میل + ناجائز حروف + منتقل ہوا + منسوخ + انتخاب ہوگیا + مٹانا + ذیلی عنوانات + منسوخ + حروف کی انتہائی تعداد (%d) آن پہنچی + حروف کی انتہائی تعداد (%d) آن پہنچی + سلائڈ شو + سلائیڈ + سلائڈ شو شروع کریں + %s پہلے سے موجود ہے + لوڈنگ... + البمز + نیا نام دینے سے قاصر۔ البم نام پہلے سے استعمال میں ہے + عملیہ ناکام ہوگیا + محفوظ۔۔۔ + تبدیل کا اثر + میوزک + %d اشیا منتخب ہوگئیں + فولڈر تخلیق کریں؟ + مٹانا فیل + 1 شے منتخب ہوگئی + ویڈیو + زوم + کاپی + Iris + وقفہ سلائڈ شو + ویڈیو پلیئر + سلائڈ شو + سیکنڈز + بائيں گھمائيں + صفحہ + کاپی ہورہی ہے... + 10 سیکنڈز + پروسیسنگ + گیلری + نام نہیں + تصویر + فیڈ + تبدیلی + 5 سیکنڈز + کوئی آئٹم پشند نہیں کیا + مٹ گیا + مٹائیں؟ + پہلے سے موجود ہے۔ اس کے اوپر لکھیں؟ + مٹ رہا ہے... + ٹھیک ہے + 3 سیکینڈ + کیمرا رول کریں + دائيں طرف گھمائيں + دھرائیں + محفوظ ہوا + گھل جانا + شفل + بھیج رہا ہے... + ہلانے فیل + ویڈیوز + غیر تائید کردہ فائل قسم + نام بدلیں + مکمل + سب منتخب + تمام البمز + نام میں تبدیلی + منتقل + مٹا نہیں سکا + دائيں طرف گھمائيں + وقفہ + پہلے سے موجود + البم تخلیق کریں + ائیٹمز نہیں ہے + چلمن + مہفوظ کرنا فیل + diff --git a/res/uzb-UZ.xml b/res/uzb-UZ.xml new file mode 100644 index 0000000..690a353 --- /dev/null +++ b/res/uzb-UZ.xml @@ -0,0 +1,99 @@ + + + + Belgilar soni ruxsat etilgan maksimal miqdorga yetdi + Slayd-shou + Fayllar soni maksimal miqdordan oshib ketdi + Slayd-shou parametrlari + Barchasini tanlash + O'chirilsinmi? + Tahrirlash + Xabar + Yuklanishlar + Albom nomi ishlatilmoqda + Saqlash + 20 soniya + Faollashtirish + Chapga aylantir. + 2 soniya + Xabarlar + Bajarildi + Nomini o‘zgartirib bo‘lmaydi + E-pochta + Mumkin bo‘lmagan belgilar + Ko‘chirilgan + Bekor qilish + Tanlangan + O'chirish + Tagsarlavhalar + Bekor qilish + Belgilar soni ruxsat etilgan maksimal miqdorga (%d) yetdi + Belgilar soni ruxsat etilgan maksimal miqdorga (%d) yetdi + Slayd-shou + Slayd + Slayd-shouni boshlash + %s avvaldan mavjud + Yuklanmoqda... + Albom + Nomni o‘zgartirib bo‘lmaydi. Albom nomi avvaldan ishlatilmoqda + Operatsiya bajarilmadi + Saqlanmoqda... + Almashuvchi effekt + Musiqa + %d element tanlangan + Jild yaratilsinmi? + Yo‘q qilish bajarilmadi + 1 element tanlangan + Video + Masshtabni o‘zgartirish + Nusxa olish + Gulsapsar + Slayd-shou intervali + Video pleyer + Slayd-shou + soniya + Chapga aylantir. + Sahifa + Nusxa ko‘chirilmoqda... + 10 soniya + Bajarilmoqda... + Galereya + Nom yo‘q + Tasvirlar + Xiralashish + Tahrirlash + 5 soniya + Element tanlanmagan + O'chirildi + Olib tashlansinmi? + Avvaldan mavjud. Ustidan yozilsinmi? + O'chirilmoqda… + Bajarildi + 3 soniya + Kamera roli + O‘ngga aylantir. + Takrorlash + Saqlandi + Erish + Tasodifiy + Ko‘chirilmoqda... + Ko‘chirib bo‘lmadi + Videolar + Quvvat-maydigan fayl turi + Nom o‘zgartirish + Yakunlandi + Bar. tanla + Barcha albomlar + Nomni o‘zgartirish + Ko‘chirish + Yo‘q qilib bo‘lmaydi + O‘ngga aylantir. + Interval + Avvaldan mavjud + Albom yaratish + Elementlar yo‘q + Jalyuzi + Saqlab bo‘lmadi + diff --git a/res/zho-CN.xml b/res/zho-CN.xml new file mode 100644 index 0000000..d579042 --- /dev/null +++ b/res/zho-CN.xml @@ -0,0 +1,99 @@ + + + + 已达到最大字符限制 + 幻灯片 + 已超过最大文件数 + 幻灯片播放设定 + 全选 + 删除? + 编辑 + 信息 + 下载列表 + 相册名已使用 + 存储 + 20 秒 + 激活 + 向左旋转 + 2 秒 + 信息 + 完成 + 无法重命名 + 电子邮件 + 字符无效 + 已移动 + 取消 + 已选择 + 删除 + 字幕 + 取消 + 已达到最大字符数(%d) + 已达到最大字符数(%d) + 幻灯片 + 幻灯片 + 开始播放幻灯片 + %s 已存在 + 载入中… + 相册 + 无法重命名。相册名已使用 + 操作失败 + 正在保存... + 转换效果 + 音乐 + 已选择%d个项目 + 创建文件夹吗? + 删除失败 + 已选择1个项目 + 录像 + 缩放 + 复制 + 彩色效果 + 幻灯片播放间隔 + 视频播放器 + 幻灯片 + 秒 + 向左旋转 + 页面 + 正在复制... + 10 秒 + 处理中... + 图库 + 无名称 + 图片 + 淡出 + 编辑 + 5 秒 + 未选择项目 + 已删除 + 移除? + 已存在。覆盖? + 删除中.. + 完成 + 3 秒 + 滚动照相机 + 向右旋转 + 重复 + 已保存 + 溶解 + 随机播放 + 移动中... + 移动失败 + 视频 + 不支持的文件类型 + 重命名 + 已完成 + 选择全部 + 所有相册 + 更改名称 + 移动 + 无法删除 + 向右旋转 + 间隔 + 已经存在 + 新建相册 + 无项目 + 百叶窗 + 储存失败 + diff --git a/res/zho-HK.xml b/res/zho-HK.xml new file mode 100644 index 0000000..c98e831 --- /dev/null +++ b/res/zho-HK.xml @@ -0,0 +1,99 @@ + + + + 字元數目已達上限 + 投影片播放 + 已超過檔案數量上限 + 投影片設定 + 選擇全部 + 刪除嗎? + 編輯 + 訊息 + 下載項目 + 相簿名稱已使用 + 儲存 + 20 秒 + 啟動 + 左轉 + 2 秒 + 訊息 + 完成 + 無法重新命名 + 電子郵件 + 字元無效 + 已移動 + 取消 + 已選擇 + 刪除 + 字幕 + 取消 + 已達字元數目上限 (%d) + 已達字元數目上限 (%d) + 投影片放映 + 滑動 + 開始播放投影片 + %s 已存在 + 正在載入... + 相薄 + 無法重新命名。相簿名稱已使用 + 操作失敗 + 正在儲存... + 過場效果 + 音樂 + 已選擇 %d 個項目 + 要建立資料夾嗎? + 刪除失敗 + 已選擇 1 個項目 + 影片 + 縮放 + 複製 + 光圈 + 投影片間隔 + 影片播放器 + 投影片 + 秒 + 左轉 + 頁面 + 正在複製... + 10 秒 + 正在處理... + 媒體瀏覽器 + 無名稱 + 圖像 + 褪色 + 編輯 + 5 秒 + 未選擇項目 + 已刪除 + 要移除嗎? + 已存在。要覆蓋嗎? + 正在刪除... + 完成 + 3 秒 + 相簿 + 右轉 + 重複 + 已儲存 + 融化 + 隨機播放 + 正在移動... + 移動失敗 + 影片 + 不支援的檔案類型 + 重新命名 + 已完成 + 選擇全部 + 全部專輯 + 更改名稱 + 移動 + 無法刪除 + 右轉 + 間隔 + 已存在 + 建立相簿 + 無項目 + 百葉窗 + 儲存失敗 + diff --git a/res/zho-SG.xml b/res/zho-SG.xml new file mode 100644 index 0000000..9e4ffef --- /dev/null +++ b/res/zho-SG.xml @@ -0,0 +1,99 @@ + + + + 已达最大字符数量 + 幻灯片播放 + 已超过最大文件数 + 幻灯片播放设定 + 全选 + 删除? + 编辑 + 讯息 + 下载 + 相册名已使用 + 储存 + 20秒 + 启动 + 向左旋转 + 2秒 + 讯息 + 已完成 + 无法重命名 + 电邮 + 字符无效 + 已移动 + 取消 + 已选定 + 删除 + 说明字幕 + 取消 + 已达到最大字符数(%d) + 已达到最大字符数(%d) + 幻灯片 + 滑动 + 开始播放幻灯片 + %s 已存在 + 裝载中… + 相册 + 无法重命名。相册名已使用 + 操作失败 + 储存中… + 转换效果 + 音乐 + 已选择%d个项目 + 创建文件夹吗? + 删除失败 + 已选择1个项目 + 录像 + 变焦 + 复制 + Iris 效果 + 幻灯片播放间隔 + 视频播放器 + 幻灯片 + 秒 + 向左旋转 + 页面 + 复制中… + 10 秒 + 处理中… + 画廊 + 无名称 + 图像 + 淡出 + 编辑 + 5秒 + 未选择项目 + 已删除 + 移除? + 已存在。覆盖? + 删除中… + 已完成 + 3秒 + 滚动照相机 + 向右旋转 + 重复 + 已储存 + 溶化 + 随机播放 + 移动中… + 移动失败 + 录像 + 不支持的文件类型 + 重命名 + 已完成 + 选择全部 + 所有相册 + 更改名称 + 移动 + 无法删除 + 向右旋转 + 间隔 + 已经存在 + 新建相册 + 无项目 + 百叶窗 + 储存失败 + diff --git a/res/zho-TW.xml b/res/zho-TW.xml new file mode 100644 index 0000000..5f8c14b --- /dev/null +++ b/res/zho-TW.xml @@ -0,0 +1,99 @@ + + + + 已達字元數上限 + 投影片放映 + 已超過檔案數量上限 + 投影片設定 + 全選 + 要刪除嗎? + 編輯 + 訊息 + 下載 + 相簿名稱已被使用 + 儲存 + 20 秒 + 啟動 + 向左旋轉 + 2 秒 + 訊息 + 完成 + 無法重新命名 + 電子郵件 + 字元無效 + 已移動 + 取消 + 已選擇 + 刪除 + 字幕 + 取消 + 達到%d個最大字元 + 達到%d個最大字元 + 投影片放映 + 投影片 + 開始播放投影片 + %s 已存在 + 正在載入... + 相簿 + 無法重新命名。相簿名稱已被使用 + 操作失敗 + 正在儲存... + 轉換效果 + 音樂 + 已選擇 %d 項目 + 要建立資料夾嗎? + 刪除失敗 + 已選擇 1 項目 + 影片 + 縮放 + 複製 + 光圈 + 投影片放映間隔 + 影片播放器 + 投影片 + 秒 + 向左旋轉 + 頁面 + 正在複製... + 10 秒 + 正在處理... + 媒體瀏覽器 + 無姓名 + 圖像 + 淡化 + 編輯 + 5 秒 + 無已選項目 + 已刪除 + 要移除嗎? + 已存在。要覆寫嗎? + 正在刪除... + 完成 + 3 秒 + 相簿 + 向右旋轉 + 重複 + 已儲存 + 分解 + 隨機播放 + 正在移動... + 移動失敗 + 影片 + 不支援的檔案類型 + 重新命名 + 已完成 + 選擇所有 + 所有相簿 + 變更名稱 + 移動 + 無法刪除 + 向右旋轉 + 間隔 + 已存在 + 建立專輯 + 無項目 + 百頁窗 + 儲存失敗 + diff --git a/shared/data/GalleryDefaultSettings.ini b/shared/data/GalleryDefaultSettings.ini new file mode 100644 index 0000000..6a88ee0 --- /dev/null +++ b/shared/data/GalleryDefaultSettings.ini @@ -0,0 +1,5 @@ +#IMAGE_VIEWER_SETTING +SLIDESHOW_INTERVAL_VALUE=3 +TRANSITION_EFFECT_VALUE=0 +REPEAT_VALUE=0 +SHUFFLE_VALUE=0 \ No newline at end of file diff --git a/shared/res/screen-density-xhigh/mainmenu.png b/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..34aacd0b6307cf62eaaba501f73c5dbf4931d31b GIT binary patch literal 57662 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�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 !S|%Bvod1_q7uDa@hSo0L=DuhAp>5^%9!x^Q!x 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 a`r7**`21G7G$+Y>Zn)`P|9su;pZR}zP;Y$z 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/GlAlbumInfo.cpp b/src/GlAlbumInfo.cpp new file mode 100644 index 0000000..5225570 --- /dev/null +++ b/src/GlAlbumInfo.cpp @@ -0,0 +1,388 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumInfo.cpp + * @brief This is the implementation file for AlbumInfo class. + */ + +#include "GlAlbumInfo.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; + +AlbumInfo::AlbumInfo(void) + : __pDirectoryFullPathList(null) + , __pContentIdList(null) + , __pFolderThumnailBitmap(null) +{ +} + +AlbumInfo::~AlbumInfo(void) +{ + if (__pDirectoryFullPathList != null) + { + delete __pDirectoryFullPathList; + } + + if (__pContentIdList != null) + { + delete __pContentIdList; + } + + if (__pFolderThumnailBitmap != null) + { + delete __pFolderThumnailBitmap; + } +} + +String +AlbumInfo::GetAlbumName(void) const +{ + String returnValue; + if ((__albumName != null) && (__albumName.GetLength() > 0)) + { + returnValue = __albumName; + } + + return returnValue; +} + +void +AlbumInfo::SetAlbumName(const String& albumName) +{ + if (&albumName == null) + { + __albumName = EMPTY_SPACE; + } + else + { + __albumName = String(albumName); + } +} + +String +AlbumInfo::GetDirectory(int index) const +{ + String fullDirPath = *(static_cast(__pDirectoryFullPathList->GetAt(index))); + return fullDirPath; +} + +IList* +AlbumInfo::GetDirectoryListN(void) const +{ + if (__pDirectoryFullPathList == null) + { + return null; + } + + IList* pDirectoryFullPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + IEnumerator* pEnum = __pDirectoryFullPathList->GetEnumeratorN(); + String* pItem = null; + while (pEnum->MoveNext() == E_SUCCESS) + { + pItem = new (std::nothrow) String((static_cast(pEnum->GetCurrent()))->GetPointer()); + pDirectoryFullPathList->Add(pItem); + } + delete pEnum; + + return pDirectoryFullPathList; +} + +void +AlbumInfo::ClearDirectoryList(void) +{ + if (__pDirectoryFullPathList != null) + { + delete __pDirectoryFullPathList; + } + + __pDirectoryFullPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); +} + +void +AlbumInfo::AppendDirectory(const String& directoryPath) +{ + if (&directoryPath == null || directoryPath == EMPTY_SPACE) + { + return; + } + + if (__pDirectoryFullPathList == null) + { + __pDirectoryFullPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + + __pDirectoryFullPathList->Add(new (std::nothrow) String(directoryPath)); +} + +void +AlbumInfo::AppendDirectoryList(const ICollection& directoryList) +{ + if (&directoryList == null || directoryList.GetCount() == 0) + { + return; + } + if (__pDirectoryFullPathList == null) + { + __pDirectoryFullPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + IEnumerator* pEnum = directoryList.GetEnumeratorN(); + String* pItem = null; + + while (pEnum->MoveNext() == E_SUCCESS) + { + pItem = new (std::nothrow) String((static_cast(pEnum->GetCurrent()))->GetPointer()); + __pDirectoryFullPathList->Add(pItem); + } + delete pEnum; +} + +int +AlbumInfo::GetDirectoryCount(void) const +{ + if (__pDirectoryFullPathList == null) + { + return 0; + } + else + { + return __pDirectoryFullPathList->GetCount(); + } +} + +IList* +AlbumInfo::GetContentIdListN(void) const +{ + if (__pContentIdList == null) + { + return null; + } + + IList* pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + IEnumerator* pEnum = __pContentIdList->GetEnumeratorN(); + ContentId* pItem; + while (pEnum->MoveNext() == E_SUCCESS) + { + pItem = new (std::nothrow) ContentId(*static_cast(pEnum->GetCurrent())); + pContentIdList->Add(pItem); + } + delete pEnum; + + return pContentIdList; +} + +ContentId +AlbumInfo::GetContentId(int index) const +{ + ContentId contentId = *(static_cast(__pContentIdList->GetAt(index))); + return contentId; +} + +result +AlbumInfo::Construct(void) +{ + __albumName = EMPTY_SPACE; + __pDirectoryFullPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + __pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = E_SUCCESS; + if (GetLastResult() != E_SUCCESS || __pDirectoryFullPathList == null || __pContentIdList == null) + { + delete __pDirectoryFullPathList; + __pDirectoryFullPathList = null; + delete __pContentIdList; + __pContentIdList = null; + r = E_FAILURE; + } + + return r; +} + +result +AlbumInfo::Construct(const String& albumName, ContentType contentType, const IList& directoryList, + const IList& contentIdList) +{ + if (&albumName == null) + { + __albumName = EMPTY_SPACE; + } + else + { + __albumName = albumName; + } + + if (&directoryList == null) + { + ClearDirectoryList(); + } + else + { + ClearDirectoryList(); + AppendDirectoryList(directoryList); + } + + if (&contentIdList == null) + { + ClearContentIdList(); + } + else + { + AppendContentIdList(contentIdList); + } + + return E_SUCCESS; +} + +result +AlbumInfo::Construct(const AlbumInfo& albumInfo) +{ + if (&albumInfo == null) + { + __albumName = EMPTY_SPACE; + ClearDirectoryList(); + ClearContentIdList(); + return E_SUCCESS; + } + __albumName = albumInfo.GetAlbumName(); + + ClearDirectoryList(); + IList* pDirList = albumInfo.GetDirectoryListN(); + AppendDirectoryList(*pDirList); + delete pDirList; + + ClearContentIdList(); + IList* pContentIdList = albumInfo.GetContentIdListN(); + AppendContentIdList(*pContentIdList); + delete pContentIdList; + + return E_SUCCESS; +} + +void +AlbumInfo::ClearContentIdList(void) +{ + if (__pContentIdList != null) + { + delete __pContentIdList; + } + + __pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); +} + +void +AlbumInfo::AppendContentId(const ContentId& contentId) +{ + if (&contentId == null) + { + return; + } + + if (__pContentIdList == null) + { + __pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + ContentId* pItem = new (std::nothrow) ContentId(contentId); + __pContentIdList->Add(pItem); +} + +void +AlbumInfo::AppendContentIdList(const ICollection& contentIdList) +{ + if (&contentIdList == null || contentIdList.GetCount() == 0) + { + return; + } + + if (__pContentIdList == null) + { + __pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + + IEnumerator* pEnum = contentIdList.GetEnumeratorN(); + ContentId* pItem = null; + + while (pEnum->MoveNext() == E_SUCCESS) + { + pItem = new (std::nothrow) ContentId(*(static_cast(pEnum->GetCurrent()))); + __pContentIdList->Add(pItem); + } + delete pEnum; +} + +void +AlbumInfo::ClearAll(void) +{ + if (__pDirectoryFullPathList != null) + { + delete __pDirectoryFullPathList; + __pDirectoryFullPathList = null; + } + + if (__pContentIdList != null) + { + delete __pContentIdList; + __pContentIdList = null; + } +} + +int +AlbumInfo::GetContentIdCount(void) const +{ + if (__pContentIdList == null) + { + return 0; + } + else + { + return __pContentIdList->GetCount(); + } +} + +result +AlbumInfo::RemoveContentIdAt(const int index) +{ + result r = E_SUCCESS; + + if (__pContentIdList != null) + { + r = __pContentIdList->RemoveAt(index, true); + } + + return r; +} + +void +AlbumInfo::SetFolderThumnailBitmap(Bitmap* pFolderThumnailBitmap) +{ + __pFolderThumnailBitmap = pFolderThumnailBitmap; +} + +Bitmap* +AlbumInfo::GetFolderThumnailBitmap(void) const +{ + return __pFolderThumnailBitmap; +} + +AlbumInfoType +AlbumInfo::GetAlbumInfoType(void) const +{ + return ALBUM_INFO_TYPE_FOLDER; +} diff --git a/src/GlAlbumListEditorForm.cpp b/src/GlAlbumListEditorForm.cpp new file mode 100644 index 0000000..5b90aac --- /dev/null +++ b/src/GlAlbumListEditorForm.cpp @@ -0,0 +1,1143 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListEditorForm.cpp + * @brief This is the implementation file for AlbumListEditorForm class. + */ + +#include "GlAlbumInfo.h" +#include "GlAlbumListEditorForm.h" +#include "GlAlbumListPresentationModel.h" +#include "GlProgressAnimation.h" +#include "GlResourceManager.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const unsigned int COLOR_DELETE_BUTTON_NORMAL = Color32<208, 82, 82>::Value; +static const unsigned int COLOR_DELETE_BUTTON_PRESSED = Color32<194, 71, 71>::Value; +static const unsigned int COLOR_DELETE_BUTTON_TEXT = Color32<248, 246, 239>::Value; +static const String RESERVED_CAMERA_PATH = Environment::GetMediaPath() + L"Camera" + DIRECTORY_SEPARATOR; +static const String RESERVED_CAMERA_PATH_EXT = Environment::GetExternalStoragePath() + L"Camera" + DIRECTORY_SEPARATOR; +static const String RESERVED_MEDIA_PATH = Environment::GetMediaPath(); +static const String RESERVED_EXTERNAL_MEDIA_PATH = Environment::GetExternalStoragePath(); + +static const int GAP_W_POPUP_ITEM = 10; +static const int W_DELETE_POPUP = 688; +static const int H_DELETE_POPUP = 230; +static const int H_DELETE_LABEL = 80; +static const int Y_DELETE_BUTTON = 132; +static const int H_DELETE_BUTTON = 74; +static const int W_DELETE_BUTTON = 318; +static const int Y_DELETE_LABEL = 32; + +static const int FORMAT_BUFFER_SIZE = 256; + +static const Color COLOR_FOLDER_BITMAP_DIM(Color::GetColor(COLOR_ID_BLACK)); +static const int ALPHA_FOLDER_BITMAP_DIM = 70; + +static const int IDA_ALBUM_EDIT = 503; + +AlbumListEditorForm::AlbumListEditorForm(void) + : __checkedCount(0) + , __pSelectCountLabel(null) + , __pEditorFolderIconList(null) + , __pShareContextMenu(null) + , __pDeletePopup(null) + , __pFileUpdateTimer(null) + , __pPresentationModel(null) + , __isScanProgress(false) +{ + AppLogDebug("ENTER"); + _pProgressAnim = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AlbumListEditorForm::~AlbumListEditorForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumListEditorForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(IDL_FORM_ALBUM_LIST_EDITOR); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListEditorForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + SetOrientation(ORIENTATION_AUTOMATIC); + AddOrientationEventListener(*this); + + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + r = __pPresentationModel->AddPresentationModelListener(this); + + SetFormBackEventListener(this); + GetHeader()->AddActionEventListener(*this); + GetFooter()->AddActionEventListener(*this); + + r = InitializeControl(); + if (r != E_SUCCESS) + { + AppLogDebug("[%s] Unable to set InitializeControl.", GetErrorMessage(r)); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListEditorForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + r = __pPresentationModel->RemovePresentationModelListener(*this); + __pPresentationModel->RemoveContentEventListener(*this); + + if (__pDeletePopup != null) + { + delete __pDeletePopup; + __pDeletePopup = null; + } + if (__pFileUpdateTimer != null) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AlbumListEditorForm::ShowAnimation(void) +{ + Rectangle clientRect= GetClientAreaBounds(); + Rectangle rect(0, 0, clientRect.width, clientRect.height); + _pProgressAnim = new (std::nothrow) ProgressAnimation; + _pProgressAnim->Construct(rect); + AddControl(_pProgressAnim); + SetControlAlwaysOnTop(*_pProgressAnim,true); + _pProgressAnim->SetShowState(true); + GetFooter()->SetEnabled(false); + _pProgressAnim->AnimationStart(); + _pProgressAnim->Draw(); +} +void +AlbumListEditorForm::StopAnimation(void) +{ + if (_pProgressAnim) + { + _pProgressAnim->AnimationStop(); + _pProgressAnim->SetShowState(false); + RemoveControl(_pProgressAnim); + GetFooter()->SetEnabled(true); + _pProgressAnim = null; + } +} + +void +AlbumListEditorForm::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + int maxCount = __pPresentationModel->GetFolderCount(); + if (__pDeletePopup != null) + { + if (__pDeletePopup->IsVisible() == true) + { + __pDeletePopup->Destroy(); + __pDeletePopup = null; + InitializePopup(); + } + } + + for (int i = 0; i < maxCount; ++i) + { + __pEditorFolderIconList->SetItemChecked(i, false); + } + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumListEditorForm::InitializeControl(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + String tempString; + + __pSelectCountLabel = static_cast(GetControl(L"IDC_LABEL_ALBUM_LIST_EDITOR_SELECTED")); + AppAssert(__pSelectCountLabel); + + CreateIconListView(); + __checkedCount = GetCheckedFolderCount(); + + + r = InitializePopup(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListEditorForm::InitializePopup(void) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup == null) + { + __pDeletePopup = new (std::nothrow) Popup(); + __pDeletePopup->Construct(false, Dimension(W_DELETE_POPUP, H_DELETE_POPUP)); + __pDeletePopup->SetPropagatedKeyEventListener(this); + + Rectangle popupClientBounds = __pDeletePopup->GetClientAreaBounds(); + + Label* pLabel = new (std::nothrow) Label(); + pLabel->Construct(Rectangle(0, Y_DELETE_LABEL, popupClientBounds.width, H_DELETE_LABEL), + ResourceManager::GetString(L"IDS_COM_POP_DELETE_Q")); + pLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pLabel->SetTextConfig(34,LABEL_TEXT_STYLE_BOLD); + + Button* pDeleteButton = new (std::nothrow) Button(); + pDeleteButton->Construct(Rectangle(popupClientBounds.width / 2 + GAP_W_POPUP_ITEM, Y_DELETE_BUTTON, W_DELETE_BUTTON, H_DELETE_BUTTON), + ResourceManager::GetString(L"IDS_COM_BODY_DELETE")); + pDeleteButton->SetColor(BUTTON_STATUS_NORMAL, COLOR_DELETE_BUTTON_NORMAL); + pDeleteButton->SetColor(BUTTON_STATUS_PRESSED, COLOR_DELETE_BUTTON_PRESSED); + pDeleteButton->SetTextColor(COLOR_DELETE_BUTTON_TEXT); + pDeleteButton->SetActionId(IDA_DELETE_POPUP_DEL); + pDeleteButton->AddActionEventListener(*this); + + Button* pCancelButton = new (std::nothrow) Button(); + pCancelButton->Construct(Rectangle(16, Y_DELETE_BUTTON, W_DELETE_BUTTON, H_DELETE_BUTTON), + ResourceManager::GetString(L"IDS_COM_POP_CANCEL")); + pCancelButton->SetActionId(IDA_DELETE_POPUP_CANCEL); + pCancelButton->AddActionEventListener(*this); + + __pDeletePopup->AddControl(pLabel); + __pDeletePopup->AddControl(pDeleteButton); + __pDeletePopup->AddControl(pCancelButton); + } + else + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +AlbumListEditorForm::CreateIconListView(void) +{ + AppLogDebug("ENTER"); + + + __pEditorFolderIconList = new IconListView(); + __pEditorFolderIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height - __pSelectCountLabel->GetHeight()), + Dimension(348, 348), ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + __pEditorFolderIconList->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_LEFT); + __pEditorFolderIconList->SetTouchAnimationEnabled(false); + __pEditorFolderIconList->SetItemProvider(*this); + __pEditorFolderIconList->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pEditorFolderIconList->AddIconListViewItemEventListener(*this); + + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + + if (pBitmap != null) + { + __pEditorFolderIconList->SetBitmapOfEmptyList(pBitmap); + delete pBitmap; + } + + __pEditorFolderIconList->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + + AddControl(__pEditorFolderIconList); + + __pEditorFolderIconList->SetShowState(true); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AlbumListEditorForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pPresentationModel->GetFolderCount(); +} + +IconListViewItem* +AlbumListEditorForm::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + Bitmap* pBitmap = null; + Canvas* pEditAlbumCanvas = null; + Bitmap* pEditAlbumBitmap = null; + Bitmap* pBitmapRenameBg = null; + Bitmap* pBitmapRename = null; + String albumName; + int canvasWidth = 75; + int canvasHeight = 75; + + IconListViewItem* pIconListviewItem = new (std::nothrow) IconListViewItem(); + + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(index)); + + Bitmap* pAlbumBitmap = pAlbumInfo->GetFolderThumnailBitmap(); + if (pAlbumBitmap == null) + { + __pPresentationModel->RequestThumbnail(index, 0); + } + + pBitmap = __pPresentationModel->CreateMergeBitmapN(index); + + if (__pEditorFolderIconList->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + Color dimColor(COLOR_FOLDER_BITMAP_DIM); + dimColor.SetAlpha(ALPHA_FOLDER_BITMAP_DIM); + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pIconListviewItem->Construct(*pBitmap, null, pSelectedBitmap); + delete pSelectedBitmap; + } + } + else + { + pIconListviewItem->Construct(*pBitmap); + } + + if (pBitmap != null) + { + delete pBitmap; + } + + pBitmapRenameBg = ResourceManager::GetBitmapN(IDB_ALBUM_EDIT_RENAME_BG); + pBitmapRename = ResourceManager::GetBitmapN(IDB_ALBUM_EDIT_RENAME); + + if (pBitmapRenameBg != null && pBitmapRename != null) + { + + pEditAlbumCanvas = new (std::nothrow) Canvas(); + pEditAlbumCanvas->Construct(Rectangle(0, 0, canvasWidth, canvasHeight)); + pEditAlbumCanvas->DrawBitmap(Point(0, 6), *pBitmapRenameBg); + pEditAlbumCanvas->DrawBitmap(Point(0, 6), *pBitmapRename); + + + pEditAlbumBitmap = new (std::nothrow) Bitmap(); + + if (pEditAlbumBitmap != NULL) + { + pEditAlbumBitmap->Construct(*pEditAlbumCanvas, Rectangle(0, 0, canvasWidth, canvasHeight)); + + } + delete pEditAlbumCanvas; + + albumName = pAlbumInfo->GetAlbumName(); + + if (albumName == ALL_ALBUMS_REAL_NAME) + { + albumName = ResourceManager::GetString(L"IDS_MEDIABR_BODY_ALL_ALBUMS"); + } + + String reservedCameraName = ResourceManager::GetString(L"IDS_MEDIABR_BODY_CAMERA_ROLL_ABB"); + String albumPath = pAlbumInfo->GetDirectory(0); + albumPath.Append(DIRECTORY_SEPARATOR); + + if (index == 0 || (reservedCameraName.Equals(albumName, true) && + (RESERVED_CAMERA_PATH.Equals(albumPath, true) || RESERVED_CAMERA_PATH_EXT.Equals(albumPath, true))) + || RESERVED_MEDIA_PATH.Equals(albumPath, true) || RESERVED_EXTERNAL_MEDIA_PATH.Equals(albumPath, true)) + { + // rename disabled + } + else + { + pIconListviewItem->SetOverlayBitmap(IDA_ALBUM_EDIT, pEditAlbumBitmap, ALIGNMENT_RIGHT, ALIGNMENT_TOP); + } + + if (pEditAlbumBitmap != null) + { + delete pEditAlbumBitmap; + } + } + + if (pBitmapRenameBg) + { + delete pBitmapRenameBg; + } + if (pBitmapRename) + { + delete pBitmapRename; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +void +AlbumListEditorForm::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + + if (status == ICON_LIST_VIEW_ITEM_CHECKED || status == ICON_LIST_VIEW_ITEM_UNCHECKED) + { + if (status == ICON_LIST_VIEW_ITEM_CHECKED) + { + ++__checkedCount; + } + else if (status == ICON_LIST_VIEW_ITEM_UNCHECKED) + { + --__checkedCount; + } + + String tempString; + if (__checkedCount == 0) + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (__checkedCount == 1) + { + tempString = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + tempString.Format(FORMAT_BUFFER_SIZE, ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), __checkedCount); + } + + __pSelectCountLabel->SetText(tempString); + __pSelectCountLabel->RequestRedraw(); + __pEditorFolderIconList->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnIconListViewOverlayBitmapSelected (IconListView &iconListView, int index, + int overlayBitmapId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + ArrayList* pSelectedIndex = new (std::nothrow) ArrayList(SingleObjectDeleter); + pSelectedIndex->Construct(); + //Adding the Action Type + pSelectedIndex->Add(new (std::nothrow) Integer(ALBUM_RENAME)); + pSelectedIndex->Add(new (std::nothrow) Integer(FILE_ACTION_MOVE)); + pSelectedIndex->Add(new (std::nothrow) Integer(index)); + + if (__pEditorFolderIconList->IsItemChecked(index) == false) + { + __pEditorFolderIconList->SetItemChecked(index,true); + } + else + { + __pEditorFolderIconList->SetItemChecked(index,false); + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_NAME_EDITOR), pSelectedIndex); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +AlbumListEditorForm::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +result +AlbumListEditorForm::DeleteFolder(void) +{ + + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + + if (__pFileUpdateTimer != null) + { + delete __pFileUpdateTimer; + } + __pFileUpdateTimer = new (std::nothrow) FileUpdateTimer(pIndexList, __pPresentationModel, this, FILE_ACTION_DELETE); + result r = __pFileUpdateTimer->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + return E_FAILURE; + } + else + { + __pPresentationModel->SetUpdateProgressStatus(true); + } + return E_SUCCESS; +} + +IList* +AlbumListEditorForm::GetItemCheckedIndexListN(void) const +{ + AppLogDebug("ENTER"); + IList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + Integer* pIndex = null; + + if (__pEditorFolderIconList!=null) + { + int loopCount = __pPresentationModel->GetFolderCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pEditorFolderIconList->IsItemChecked(i) == true) + { + pIndex = new (std::nothrow) Integer(i); + pList->Add(pIndex); + AppLogDebug("checked index(%d)", i); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pList; +} + +void +AlbumListEditorForm::SetAllCheckState(const bool state) +{ + AppLogDebug("ENTER"); + + int maxCount = __pPresentationModel->GetFolderCount(); + String tempString; + + if (state == true) + { + if (maxCount == 1) + { + tempString = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED;"); + } + else + { + tempString.Format(FORMAT_BUFFER_SIZE, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), maxCount); + } + } + else + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + + for (int i = 0; i < maxCount; ++i) + { + __pEditorFolderIconList->SetItemChecked(i, state); + __pEditorFolderIconList->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + + __pEditorFolderIconList->Draw(); + __pSelectCountLabel->SetText(tempString); + __pSelectCountLabel->RequestRedraw(); + __checkedCount = GetCheckedFolderCount(); + + SetButtonState(); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AlbumListEditorForm::GetCheckedFolderCount(void) const +{ + AppLogDebug("ENTER"); + int maxCount = __pPresentationModel->GetFolderCount(); + int count = 0; + + for (int i = 0; i < maxCount; ++i) + { + if (__pEditorFolderIconList->IsItemChecked (i)) + { + ++count; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return count; +} + +void +AlbumListEditorForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + switch (actionId) + { + case IDA_ALBUM_LIST_SELECT_ALL: + { + if (__pPresentationModel->GetFolderCount() == GetCheckedFolderCount()) + { + SetAllCheckState(false); + } + else + { + SetAllCheckState(true); + } + } + break; + + case IDA_FOOTER_DELETE: + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + } + break; + + case IDA_FOOTER_SHARE: + { + + if (__pShareContextMenu != NULL) + { + delete __pShareContextMenu; + __pShareContextMenu = null; + } + + + Bitmap* pBitmapEmailContextItem = null; + Bitmap* pBitmapMessageContextItem = null; + pBitmapEmailContextItem = ResourceManager::GetBitmapN(IDB_IMAGE_CONTEXT_EMAIL_ICON); + pBitmapMessageContextItem = ResourceManager::GetBitmapN(IDB_IMAGE_CONTEXT_MESSAGE_ICON); + + __pShareContextMenu = new (std::nothrow) ContextMenu(); + __pShareContextMenu->Construct(Point(GetClientAreaBounds().width/3 + 15, GetClientAreaBounds().height + __pSelectCountLabel->GetHeight() + 5), + CONTEXT_MENU_STYLE_LIST, CONTEXT_MENU_ANCHOR_DIRECTION_UPWARD); + + if ( pBitmapMessageContextItem != null) + { + __pShareContextMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_MESSAGE"), + IDA_CONTEXT_MENU_MESSAGE , *pBitmapMessageContextItem, null, null); + + delete pBitmapMessageContextItem; + } + + if ( pBitmapEmailContextItem != null) + { + __pShareContextMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EMAIL"), IDA_CONTEXT_MENU_EMAIL, + *pBitmapEmailContextItem, null, null); + + delete pBitmapEmailContextItem; + } + + __pShareContextMenu->SetFocusable(true); + __pShareContextMenu->AddActionEventListener(*this); + __pShareContextMenu->SetShowState(true); + __pShareContextMenu->Show(); + } + break; + + case IDA_CONTEXT_MENU_MESSAGE: + { + OnRequestMessage(); + } + break; + + case IDA_CONTEXT_MENU_EMAIL: + { + OnRequestEmail(); + } + break; + + case IDA_DELETE_POPUP_DEL: + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + DeleteFolder(); + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + } + break; + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnFormMenuRequested (Tizen::Ui::Controls::Form &source) +{ + if(__isScanProgress) + { + return; + } +} + +void +AlbumListEditorForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + if(__isScanProgress) + { + return; + } + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER OnSceneActivatedN"); + String tempString; + + + int count = __pPresentationModel->GetFolderCount(); + + __pPresentationModel->AddContentEventListener(this); + + __checkedCount = GetCheckedFolderCount(); + + if (previousSceneId == IDSCN_ALBUM_NAME_EDITOR) + { + + if (__checkedCount == 0) + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else + { + tempString.Format(FORMAT_BUFFER_SIZE, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), __checkedCount); + } + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_ALL); + + for (int index = 0; index < count; ++index) + { + __pEditorFolderIconList->SetItemChecked(index,false); + } + + __pEditorFolderIconList->UpdateList(); + __checkedCount = 0; + + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + + __pSelectCountLabel->SetText(tempString); + __pSelectCountLabel->Invalidate(true); + + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(*this); + + if (nextSceneId != IDSCN_ALBUM_NAME_EDITOR) + { + int loopCount = __pPresentationModel->GetFolderCount(); + + for (int count = 0; count < loopCount; ++count) + { + __pEditorFolderIconList->SetItemChecked(count,false); + } + __pEditorFolderIconList->UpdateList(); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + Update(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + __pEditorFolderIconList->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnFileOpInvalidate(enum FileActionMode actionId) +{ + Invalidate(true); +} + +void +AlbumListEditorForm::OnScanDirStart() +{ + AppLogDebug("SANTHOSH ENTER"); + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, false); + Invalidate(true); + __isScanProgress = true; + AppLogDebug("SANTHOSH EXIT"); +} +void +AlbumListEditorForm::OnScanDirComplete() +{ + AppLogDebug("SANTHOSH ENTER"); + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, true); + Invalidate(true); + __isScanProgress = false; + AppLogDebug("SANTHOSH EXIT"); +} + +void +AlbumListEditorForm::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ + AppLogDebug("ENTER"); + __pPresentationModel->SetUpdateProgressStatus(false); + SetAllCheckState(false); + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_ALL); + __pEditorFolderIconList->UpdateList(); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +AlbumListEditorForm::OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return false; +} + +result +AlbumListEditorForm::Update(void) +{ + AppLogDebug("ENTER"); + result r = __pEditorFolderIconList->UpdateList(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AlbumListEditorForm::OnRequestMessage(void) +{ + AppLogDebug("ENTER"); + + int checkCount = GetCheckedFolderCount(); + + if (checkCount <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + + int maxCount = __pPresentationModel->GetFolderCount(); + ContentManager contentManager; + result r = contentManager.Construct(); + if (r == E_SUCCESS) + { + if (maxCount <= 0) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return; + } + + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + for (int i = 0; i < maxCount; ++i) + { + if (__pEditorFolderIconList->IsItemChecked (i)) + { + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(i)); + IList* pContentIdList = pAlbumInfo->GetContentIdListN(); + int loopCount = pContentIdList->GetCount(); + for (int k = 0; k < loopCount; ++k) + { + ContentId* pContentId = static_cast(pContentIdList->GetAt(k)); + ContentInfo* pContentInfo = contentManager.GetContentInfoN(*pContentId); + + if (pContentInfo == null) + { + break; + } + + pArrayList->Add(new (std::nothrow) String(pContentInfo->GetContentPath())); + } + + if (i == 0) + { + break; + } + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_MESSAGE_TYPE), new (std::nothrow) String(APPCONTROL_DATA_MMS)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_MESSAGE, APPCONTROL_OPERATION_ID_COMPOSE, + null, null, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::OnRequestEmail(void) +{ + AppLogDebug("ENTER"); + + int checkCount = GetCheckedFolderCount(); + + if (checkCount <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + + int maxCount = __pPresentationModel->GetFolderCount(); + ContentManager contentManager; + result r = contentManager.Construct(); + if (r == E_SUCCESS) + { + if (maxCount <= 0) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return; + } + + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + for (int i = 0; i < maxCount; ++i) + { + if (__pEditorFolderIconList->IsItemChecked(i)) + { + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(i)); + IList* pContentIdList = pAlbumInfo->GetContentIdListN(); + int loopCount = pContentIdList->GetCount(); + for (int k = 0; k < loopCount; ++k) + { + ContentId* pContentId = static_cast(pContentIdList->GetAt(k)); + ContentInfo* pContentInfo = contentManager.GetContentInfoN(*pContentId); + + if (pContentInfo == null) + { + break; + } + + pArrayList->Add(new (std::nothrow) String(pContentInfo->GetContentPath())); + } + + if (i == 0) + { + break; + } + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_EMAIL, APPCONTROL_OPERATION_ID_COMPOSE, + new (std::nothrow) String(APPCONTROL_URI_MAIL_TO), null, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::SetFooterButtonsState(const bool enableState) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + AppAssert(pFooter); + + if (enableState == true) + { + pFooter->SetItemEnabled(0, true); + pFooter->SetItemEnabled(1, true); + } + else + { + pFooter->SetItemEnabled(0, false); + pFooter->SetItemEnabled(1, false); + } + + pFooter->RequestRedraw(true); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListEditorForm::SetButtonState(void) +{ + AppLogDebug("ENTER"); + if (GetCheckedFolderCount() > 0) + { + AppLogDebug("BUTTONSTATE : Request Enable"); + SetFooterButtonsState(true); + } + else + { + AppLogDebug("BUTTONSTATE : Request disable"); + SetFooterButtonsState(false); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + + +void +AlbumListEditorForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + + IList* pIndexList = GetItemCheckedIndexListN(); + + if (__pEditorFolderIconList != null) + { + RemoveControl(__pEditorFolderIconList); + } + + __pEditorFolderIconList = new IconListView(); + + if (orientationStatus == ORIENTATION_STATUS_PORTRAIT) + { + __pEditorFolderIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height- __pSelectCountLabel->GetHeight()), + Dimension(348, 348), ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + } + else if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE || orientationStatus == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + int horizontalSpacing = 8; + int verticalSpacing = 60; + int height = 424; + int width = 410; + + __pEditorFolderIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height - __pSelectCountLabel->GetHeight()), + Dimension(width, height), ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + + __pEditorFolderIconList->SetItemSpacing(horizontalSpacing, verticalSpacing); + __pEditorFolderIconList->SetMargin(MARGIN_TYPE_TOP,40); + } + + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + + if (pBitmap != null) + { + __pEditorFolderIconList->SetBitmapOfEmptyList(pBitmap); + delete pBitmap; + } + + __pEditorFolderIconList->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_LEFT); + __pEditorFolderIconList->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pEditorFolderIconList->SetTouchAnimationEnabled(false); + __pEditorFolderIconList->SetItemProvider(*this); + __pEditorFolderIconList->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pEditorFolderIconList->AddIconListViewItemEventListener(*this); + + AddControl(__pEditorFolderIconList); + + int loopCount = pIndexList->GetCount(); + int index = -1; + for (int count = 0; count < loopCount; ++count) + { + Integer* pRealIndex = static_cast(pIndexList->GetAt(count)); + index = pRealIndex->ToInt(); + __pEditorFolderIconList->SetItemChecked(index, true); + __pEditorFolderIconList->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + + if (_pProgressAnim != null) + { + _pProgressAnim->ChangeOrientation(Form::GetBounds()); + _pProgressAnim->Invalidate(true); + } +} diff --git a/src/GlAlbumListForm.cpp b/src/GlAlbumListForm.cpp new file mode 100644 index 0000000..6c1a022 --- /dev/null +++ b/src/GlAlbumListForm.cpp @@ -0,0 +1,568 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListForm.cpp + * @brief This is the implementation file for AlbumListForm class. + */ + +#include "GlAlbumInfo.h" +#include "GlAlbumListForm.h" +#include "GlAlbumListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlResourceManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int W_FOLDER_SIZE = 348; +static const int H_FOLDER_SIZE = 348; + +AlbumListForm::AlbumListForm(void) + : __itemCount(0) + , __pAlbumViewIconList(null) + , __pOptionMenu(null) + , __pPresentationModel(null) + +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AlbumListForm::~AlbumListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(IDL_FORM_ALBUM_LIST); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + SetOrientation(ORIENTATION_AUTOMATIC); + AddOrientationEventListener(*this); + + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_IMAGE) + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_IMAGE); + } + else if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_VIDEO) + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_ALL); + } + + AppLogDebug("ENTER __pPresentationModel(%x)", __pPresentationModel); + + r = InitializeHeader(); + if (r != E_SUCCESS) + { + AppLogDebug("[%s] Unable to set header.", GetErrorMessage(r)); + } + + r = InitializeFooter(); + if (r != E_SUCCESS) + { + AppLogDebug("[%s] Unable to set footer.", GetErrorMessage(r)); + } + + __itemCount = __pPresentationModel->GetFolderCount(); + CreateIconListView(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListForm::InitializeHeader(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + if (pHeader == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_SYSTEM; + } + + result r = pHeader->SetStyle(HEADER_STYLE_TITLE); + if (r != E_SUCCESS) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return r; + } + + pHeader->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_GALLERY")); + pHeader->AddActionEventListener(*this); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return E_SUCCESS; +} + +result +AlbumListForm::InitializeFooter(void) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT 1"); + return E_SYSTEM; + } + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + SetFormBackEventListener(this); + pFooter->SetShowState(false); + } + else + { + pFooter->SetShowState(true); + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON); + pFooter->RemoveAllItems(); + + FooterItem itemCamera; + itemCamera.Construct(IDA_FOOTER_CAMERA); + itemCamera.SetText(ResourceManager::GetString(L"EMPTY_SPACE")); + Bitmap* pBitmap1 = ResourceManager::GetBitmapN(IDB_CONTROLBAR_CAMERA); + if (pBitmap1 != null) + { + itemCamera.SetIcon(FOOTER_ITEM_STATUS_NORMAL, pBitmap1); + } + pFooter->AddItem(itemCamera); + delete pBitmap1; + + __pOptionMenu = new (std::nothrow) OptionMenu(); + __pOptionMenu->Construct(); + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_COM_HEADER_EDIT"),IDA_FOOTER_EDIT); + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_COM_HEADER_EDIT"), IDA_FOOTER_EDIT); + __pOptionMenu->SetShowState(false); + __pOptionMenu->AddActionEventListener(*this); + SetFormMenuEventListener(this); + SetFormBackEventListener(this); + } + + pFooter->AddActionEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +AlbumListForm::CreateIconListView(void) +{ + AppLogDebug("ENTER"); + Dimension itemSize(W_FOLDER_SIZE, H_FOLDER_SIZE); + + __pAlbumViewIconList = new IconListView(); + __pAlbumViewIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), + Dimension(W_FOLDER_SIZE, H_FOLDER_SIZE), ICON_LIST_VIEW_STYLE_NORMAL, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + __pAlbumViewIconList->SetItemProvider(*this); + __pAlbumViewIconList->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pAlbumViewIconList->AddIconListViewItemEventListener(*this); + + + + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + + if (pBitmap != null) + { + __pAlbumViewIconList->SetBitmapOfEmptyList(pBitmap); + delete pBitmap; + } + __pAlbumViewIconList->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + + AddControl(__pAlbumViewIconList); + + __pAlbumViewIconList->SetShowState(true); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AlbumListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +AlbumListForm::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + + Bitmap* pBitmap = null; + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + if (pAlbumInfoList != null) + { + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(index)); + if (pAlbumInfo != null) + { + Bitmap* pAlbumBitmap = pAlbumInfo->GetFolderThumnailBitmap(); + + if (pAlbumBitmap == null) + { + __pPresentationModel->RequestThumbnail(index, 0); + } + + pBitmap = __pPresentationModel->CreateMergeBitmapN(index); + + if (pBitmap != null) + { + IconListViewItem* pIconListview = new (std::nothrow) IconListViewItem(); + pIconListview->Construct(*pBitmap); + delete pBitmap; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return pIconListview; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return null; +} + +void +AlbumListForm::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == ICON_LIST_VIEW_ITEM_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(index)); + AlbumInfo* pSendAlbumInfo = new (std::nothrow) AlbumInfo(); + pSendAlbumInfo->Construct(*pAlbumInfo); + + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + pArrayList->Add(pSendAlbumInfo); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_IMAGE) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_IMAGE_LIST_EDITOR), pArrayList); + } + else if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_VIDEO) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_VIDEO_LIST_EDITOR), pArrayList); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_IMAGE_LIST_EDITOR), pArrayList); + } + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST), pArrayList); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +AlbumListForm::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +result +AlbumListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + __pPresentationModel->RemoveContentEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +AlbumListForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + switch (actionId) + { + case IDA_FOOTER_CAMERA: + { + const String mimeType = APPCONTROL_MIME_IMAGE_JPG; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_CAMERA_ALLOW_SWITCH), + new (std::nothrow) String(APPCONTROL_DATA_TRUE)); + __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_CAMERA, + APPCONTROL_OPERATION_ID_CREATE_CONTENT, null, &mimeType, pDataList, this); + + } + break; + + case IDA_FOOTER_EDIT: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST_EDITOR)); + } + break; + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null && pApp->GetFrameActivated() == true) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_CANCELED, null); + pApp->Terminate(); + } + } + else + { + AppLogDebug("APP_CONTROL_MODE_MAIN"); + UiApp* pApp = UiApp::GetInstance(); + pApp->Terminate(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + __pPresentationModel->AddContentEventListener(this); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_IMAGE) + { + __pPresentationModel->ClearThumbnailRequests(false); + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_IMAGE); + } + else if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_VIDEO) + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_ALL); + } + __itemCount = __pPresentationModel->GetFolderCount(); + + if (__pAlbumViewIconList != null) + { + __pAlbumViewIconList->UpdateList(); + } + + Invalidate(true); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + + if (__pOptionMenu != null && __pOptionMenu ->GetShowState() == true) + { + __pOptionMenu->SetShowState(false); + __pOptionMenu->Show(); + } + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_IMAGE) + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_IMAGE); + } + else if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_VIDEO) + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_VIDEO); + } + } + else + { + __pPresentationModel->InitializeAlbumInfoList(CONTENT_TYPE_ALL); + } + + __itemCount = __pPresentationModel->GetFolderCount(); + __pAlbumViewIconList->UpdateList(); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + Update(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + __pAlbumViewIconList->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListForm::OnAppControlCompleteResponseReceived(const AppId& appId, const Tizen::Base::String& operationId, + AppCtrlResult appControlResult, const Tizen::Base::Collection::IMap* pExtraData) +{ + AppLogDebug("OnAppControlCompleteResponseReceived : %d", appControlResult); + + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + TryReturnVoid(pGalleryApp != null, "pGalleryApp is null"); + pGalleryApp->SetFrameEnabled(true); +} + +result +AlbumListForm::Update(void) +{ + AppLogDebug("ENTER"); + result r = __pAlbumViewIconList->UpdateList(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AlbumListForm::OnFormMenuRequested (Tizen::Ui::Controls::Form &source) +{ + + if (__pOptionMenu == null || GetItemCount() == 0) + { + return; + } + + __pOptionMenu->SetShowState(true); + __pOptionMenu->Show(); +} + +void +AlbumListForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + if (__pAlbumViewIconList != null) + { + RemoveControl(__pAlbumViewIconList); + } + + __pAlbumViewIconList = new IconListView(); + + if (orientationStatus == ORIENTATION_STATUS_PORTRAIT) + { + __pAlbumViewIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), + Dimension(W_FOLDER_SIZE, H_FOLDER_SIZE), ICON_LIST_VIEW_STYLE_NORMAL, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + } + else if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE || orientationStatus == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + int horizontalSpacing = 8; + int verticalSpacing = 60; + int height = 424; + int width = 410; + + __pAlbumViewIconList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), + Dimension(width, height), ICON_LIST_VIEW_STYLE_NORMAL, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + + __pAlbumViewIconList->SetItemSpacing(horizontalSpacing, verticalSpacing); + __pAlbumViewIconList->SetMargin(MARGIN_TYPE_TOP,60); + } + + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + + if (pBitmap != null) + { + __pAlbumViewIconList->SetBitmapOfEmptyList(pBitmap); + delete pBitmap; + } + + __pAlbumViewIconList->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + + __pAlbumViewIconList->SetItemProvider(*this); + __pAlbumViewIconList->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pAlbumViewIconList->AddIconListViewItemEventListener(*this); + + AddControl(__pAlbumViewIconList); + +} diff --git a/src/GlAlbumListPresentationModel.cpp b/src/GlAlbumListPresentationModel.cpp new file mode 100644 index 0000000..477d0a3 --- /dev/null +++ b/src/GlAlbumListPresentationModel.cpp @@ -0,0 +1,1251 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumListPresentationModel.cpp + * @brief This is the implementation file for AlbumListPresentationModel class. + */ + +#include +#include +#include + +#include "GlAlbumInfo.h" +#include "GlAlbumListPresentationModel.h" +#include "GlAlbumRenameEventListener.h" +#include "GlContentUpdateEventListener.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlThumbnailEvent.h" +#include "GlThumbnailEventArg.h" +#include "GlThumbnailProvider.h" +#include "GlTimerScanDirListener.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::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui::Controls; + +static const int ICON_CAP = 3; +static const int FOLDER_CAP = 8; +static const int ICON_SIZE = 107; +static const int FOLDER_SIZE_WIDTH = 348; +static const int FOLDER_SIZE_HEIGHT = 348; + +static const int CANVAS_HEIGHT = 71; +static const int CANVAS_WIDTH = 326; + +static const int FONT_SIZE_FOLDER_NAME = 32; +static const int FONT_SIZE_FOLDER_DATE = 25; +static const int FONT_SIZE_FOLDER_COUNT = 45; +static const int FONT_SIZE_FOLDER_COUNT_SMALL = 35; + +static const int CANVAS_IMAGE_FOLDER_HEIGHT = 48; +static const int CANVAS_IMAGE_FOLDER_WIDTH = 48; +static const int IMAGE_COUNT_WIDTH = 100; +static const int IMAGE_COUNT_HEIGHT = 60; +static const int CANVAS_MARGIN_LEFT = 10; +static const int GAP = 10; +static const int HEIGHT_OFFSET = 5; +static const int Y_POS_CANVAS = 260; +static const int FOLDER_NAME_WIDTH = 165; +static const int FOLDER_NAME_HEIGHT = 38; + + +static const int ALPHA_BG = 110; + +static const Color COLOR_CANVAS_BG (Color::GetColor(COLOR_ID_BLACK)); + +static const String RESERVED_MEDIA_PATH = Environment::GetMediaPath(); +static const String RESERVED_CAMERA_PATH = Environment::GetMediaPath() + L"Camera"; +static const String RESERVED_CAMERA_PATH_EXT = Environment::GetExternalStoragePath() + L"Camera"; +static const String RESERVED_DOWNLOAD_PATH = Environment::GetMediaPath() + L"Downloads"; +static const String DATE_TIME = L"DateTime"; + +static const int FORMAT_BUFFER_SIZE = 256; + +static const int DOUBLE_NUMBER = 2; +static const int TRIPLE_NUMBER = 3; + +AlbumListPresentationModel* AlbumListPresentationModel::__pPresentationModelInstance = null; +ArrayList* AlbumListPresentationModel::__pPresentationModelListener = null; +ArrayList* AlbumListPresentationModel::__pContentEventListener = null; +ThumbnailProvider* AlbumListPresentationModel::__pThumbnailProvider = null; +ThumbnailEvent* AlbumListPresentationModel::__pThumbnailEvent = null; +IList* AlbumListPresentationModel::__pAlbumInfoList = null; + +AlbumListPresentationModel::AlbumListPresentationModel(void) + : __pFolderBackgroundBitmap(null) + , __pAlbumListener(null) + , __appControlMode(APPCONTROL_MODE_MAIN) + , __appControlMediaType(APPCONTROL_MEDIA_TYPE_IMAGE) + , __appControlSelectionMode(APPCONTROL_SELECTION_MODE_SINGLE) + , __updateProgressStatus(false) + , __pTimerScanListener(null) + , __scanCount(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AlbumListPresentationModel::~AlbumListPresentationModel(void) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + delete __pFolderBackgroundBitmap; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AlbumListPresentationModel* +AlbumListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModelInstance == null) + { + CreateInstance(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pPresentationModelInstance; +} + +result +AlbumListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + __pPresentationModelListener = new (std::nothrow) ArrayList(); + __pPresentationModelListener->Construct(); + + ContentUpdateEventListener::GetInstance(); + __pContentEventListener = new (std::nothrow) ArrayList(); + __pContentEventListener->Construct(); + + IThumbnailEventListener* pThumbnailEventListener = static_cast(this); + __pThumbnailEvent = new (std::nothrow) ThumbnailEvent(); + __pThumbnailEvent->AddListener(*pThumbnailEventListener, true); + + DeviceManager::AddDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + + __pThumbnailProvider = ThumbnailProvider::GetInstance(); + AppLogDebug("ENTER1"); + GalleryApp* pApp = static_cast(GalleryApp::GetInstance()); + const IMap* pArguments = pApp->GetAppControlArguments(); + String operationId = pApp->GetAppControlOperationId(); + + if (operationId.CompareTo(APPCONTROL_OPERATION_ID_MAIN) == 0) + { + __appControlMode = APPCONTROL_MODE_MAIN; + } + else if (operationId.CompareTo(APPCONTROL_OPERATION_ID_PICK) == 0) + { + __appControlMode = APPCONTROL_MODE_PICK; + + String mimeType = pApp->GetMimeType(); + if (mimeType.IsEmpty() != true) + { + if (mimeType.StartsWith(APPCONTROL_DATA_VIDEO, 0) == true) + { + __appControlMediaType = APPCONTROL_MEDIA_TYPE_VIDEO; + } + } + if (pArguments != null) + { + const String* selectionMode = + static_cast(pArguments->GetValue(String(APPCONTROL_KEY_SELECTION_MODE))); + if (selectionMode != null && selectionMode->CompareTo(APPCONTROL_DATA_MULTIPLE) == 0) + { + __appControlSelectionMode = APPCONTROL_SELECTION_MODE_MULTIPLE; + } + } + } + else if (operationId.CompareTo(APPCONTROL_OPERATION_ID_CONFIGURE) == 0) + { + __appControlMode = APPCONTROL_MODE_SETTING; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +AlbumListPresentationModel::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pPresentationModelInstance = new (std::nothrow) AlbumListPresentationModel; + result r = __pPresentationModelInstance->Construct(); + + if (IsFailed(r) == true) + { + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + AppLogDebug("EXIT false"); + return; + } + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListPresentationModel::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + + delete __pThumbnailEvent; + __pThumbnailEvent = null; + + if (__pAlbumInfoList != null) + { + delete __pAlbumInfoList; + __pAlbumInfoList = null; + } + + if (__pPresentationModelListener != null) + { + delete __pPresentationModelListener; + __pPresentationModelListener = null; + } + + if (__pContentEventListener != null) + { + delete __pContentEventListener; + __pContentEventListener = null; + } + + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumListPresentationModel::AddPresentationModelListener(IAlbumEventListener* listener) +{ + AppLogDebug("ENTER"); + result r = __pPresentationModelListener->Add(listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumListPresentationModel::RemovePresentationModelListener(IAlbumEventListener& listner) +{ + AppLogDebug("ENTER"); + result r = __pPresentationModelListener->Remove(listner); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AlbumListPresentationModel::AddContentEventListener(const IFormContentUpdateEventListener* listener) +{ + AppLogDebug("ENTER"); + if (__pContentEventListener != null) + { + __pContentEventListener->RemoveAll(); + __pContentEventListener->Add((Object*)listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + } +} + +void +AlbumListPresentationModel::RemoveContentEventListener(const IFormContentUpdateEventListener& listener) +{ + AppLogDebug("ENTER"); + __pContentEventListener->Remove(listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListPresentationModel::CallAlbumChangedEvent(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModelListener->GetCount() > 0) + { + IEnumerator* pEnum = __pPresentationModelListener->GetEnumeratorN(); + + while (pEnum->MoveNext() == E_SUCCESS) + { + IAlbumEventListener* pListener = null; + pListener = static_cast(pEnum->GetCurrent()); + pListener->OnFileInfoChanged(CONTENT_TYPE_ALL); + } + + delete pEnum; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumListPresentationModel::RenameAlbum(const String& orgPath, const String& newPath, + IAlbumRenameEventListener* pAlbumListener) +{ + AppLogDebug("ENTER"); + result r = Directory::Rename(orgPath, newPath); + if (IsFailed(r)) + { + AppLogDebug("Album Rename failed(%s)", GetErrorMessage(r)); + } + else + { + __pAlbumListener = pAlbumListener; + __renameNewPath = newPath; + r = ContentManager::ScanDirectory(newPath, true, NULL, __reqId); + AppLogDebug("Content scan failed (%s)", GetErrorMessage(r)); + r = ContentManager::ScanDirectory(orgPath, true, NULL, __reqId); + AppLogDebug("Content scan failed (%s)", GetErrorMessage(r)); + } + AppLogDebug("EXIT"); + return r; +} + +void +AlbumListPresentationModel::ShowAnimation(void) +{ + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->ShowAnimation(); + } + delete pEventEnum; +} + +void +AlbumListPresentationModel::StopAnimation(void) +{ + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->StopAnimation(); + } + delete pEventEnum; +} + +void +AlbumListPresentationModel::AddTimerScanListener(ITimerScanDirListener* pListener, int scanCount) +{ + __pTimerScanListener = pListener; + __scanCount = scanCount; +} + +void +AlbumListPresentationModel::RemoveTimerScanListener(void) +{ + __pTimerScanListener = null; + __scanCount = 0; +} + +bool +AlbumListPresentationModel::OnContentScanCompleted (const Tizen::Base::String &scanPath) +{ + AppLogDebug("ENTER"); + if (__pTimerScanListener) + { + __scanCount--; + if ( __scanCount == 0 ) + { + __pTimerScanListener->OnTimerScanDirComplete(); + } + return false; + } + if (__pAlbumListener && ( scanPath == __renameNewPath)) + { + InitializeAlbumInfoList(CONTENT_TYPE_ALL); + __pAlbumListener->OnAlbumRenameComplete(); + __renameNewPath = L""; + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +void +AlbumListPresentationModel::DrawPartialImage(Canvas& canvas, AlbumInfo* pAlbumInfo, const Rectangle& rectNew) +{ + AppLogDebug("ENTER"); + if (&canvas == null || __pFolderBackgroundBitmap == null || pAlbumInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + canvas.DrawBitmap(rectNew, *__pFolderBackgroundBitmap); + + Bitmap* pBitmap = pAlbumInfo->GetFolderThumnailBitmap(); + + if (pBitmap != null) + { + Rectangle rectFirst(ICON_CAP+FOLDER_CAP, ICON_CAP, + ICON_CAP * DOUBLE_NUMBER + ICON_SIZE * TRIPLE_NUMBER, + ICON_CAP * DOUBLE_NUMBER + ICON_SIZE * TRIPLE_NUMBER); + canvas.DrawBitmap(rectFirst, *pBitmap); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListPresentationModel::DrawFontImage(Canvas& canvas, AlbumInfo* pAlbumInfo, int index) +{ + AppLogDebug("ENTER"); + + if (&canvas == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + Point pointText; + String strCnt; + Bitmap* pBitmap = null; + Font ftFolderName, ftDate, ftCnt,ftCntSmall; + EnrichedText enText; + EnrichedText enTextCount; + TextElement textElement; + TextElement textElementCount; + + int allContentCount = pAlbumInfo->GetContentIdCount(); + strCnt.Format(FORMAT_BUFFER_SIZE, L"%d", allContentCount); + + String strFolderName = pAlbumInfo->GetAlbumName(); + + if (strFolderName == ALL_ALBUMS_REAL_NAME) + { + strFolderName = ResourceManager::GetString(L"IDS_MEDIABR_BODY_ALL_ALBUMS"); + } + + String strDirectory = pAlbumInfo->GetDirectory(0); + AppLog("The directory path is %ls" , strDirectory.GetPointer()); + + Rectangle rectCanvas(ICON_CAP + FOLDER_CAP, Y_POS_CANVAS, CANVAS_WIDTH, CANVAS_HEIGHT); + Color bgColor(COLOR_CANVAS_BG); + bgColor.SetAlpha(ALPHA_BG); + canvas.FillRectangle(bgColor, rectCanvas); + + + if (strDirectory == RESERVED_DOWNLOAD_PATH) + { + pBitmap = ResourceManager::GetBitmapN(IDB_ALBUM_ICON_DOWNLOAD); + } + else if (strDirectory == RESERVED_CAMERA_PATH || strDirectory == RESERVED_CAMERA_PATH_EXT) + { + pBitmap = ResourceManager::GetBitmapN(IDB_ALBUM_ICON_CAMERA); + } + else + { + pBitmap = ResourceManager::GetBitmapN(IDB_ALBUM_ICON_FOLDER); + } + + if (pBitmap != null) + { + canvas.DrawBitmap(Rectangle(ICON_CAP + FOLDER_CAP, rectCanvas.y + HEIGHT_OFFSET, CANVAS_IMAGE_FOLDER_WIDTH, + CANVAS_IMAGE_FOLDER_HEIGHT), *pBitmap); + delete pBitmap; + } + + ftFolderName.Construct(FONT_STYLE_PLAIN, FONT_SIZE_FOLDER_NAME); + ftDate.Construct(FONT_STYLE_PLAIN, FONT_SIZE_FOLDER_DATE); + ftCnt.Construct(FONT_STYLE_PLAIN, FONT_SIZE_FOLDER_COUNT); + ftCntSmall.Construct(FONT_STYLE_PLAIN, FONT_SIZE_FOLDER_COUNT_SMALL); + + enText.Construct(Dimension(FOLDER_NAME_WIDTH, FOLDER_NAME_HEIGHT)); + enText.SetHorizontalAlignment(TEXT_ALIGNMENT_LEFT); + + textElement.Construct(strFolderName); + textElement.SetFont(ftFolderName); + textElement.SetTextColor(Color::GetColor(COLOR_ID_WHITE)); + enText.SetTextAbbreviationEnabled(true); + enText.Add(textElement); + + enTextCount.Construct(Dimension(IMAGE_COUNT_WIDTH, IMAGE_COUNT_HEIGHT)); + enTextCount.SetHorizontalAlignment(TEXT_ALIGNMENT_RIGHT); + + textElementCount.Construct(strCnt); + + if (strCnt.GetLength() > 3) + { + textElementCount.SetFont(ftCntSmall); + } + else + { + textElementCount.SetFont(ftCnt); + } + textElementCount.SetTextColor(Color::GetColor(COLOR_ID_WHITE)); + enTextCount.SetTextAbbreviationEnabled(true); + enTextCount.Add(textElementCount); + + pointText = Point(CANVAS_MARGIN_LEFT + CANVAS_IMAGE_FOLDER_WIDTH + GAP + FOLDER_NAME_WIDTH, + rectCanvas.y + HEIGHT_OFFSET); + canvas.SetFont(ftCnt); + canvas.SetForegroundColor(Color::GetColor(COLOR_ID_WHITE)); + canvas.DrawText(pointText, enTextCount); + + pointText = Point(CANVAS_MARGIN_LEFT + CANVAS_IMAGE_FOLDER_WIDTH + GAP, + rectCanvas.y + GAP + HEIGHT_OFFSET); + canvas.SetForegroundColor(Color::GetColor(COLOR_ID_WHITE)); + canvas.DrawText(pointText, enText); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +Bitmap* +AlbumListPresentationModel::CreateMergeBitmapN(const int index) +{ + AppLogDebug("ENTER index(%d)", index); + + if (__pAlbumInfoList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + AlbumInfo* pAlbumInfo = static_cast(__pAlbumInfoList->GetAt(index)); + + Bitmap* pBitmapNew = new (std::nothrow) Bitmap(); + BufferInfo bufferinfo; + Canvas canvas; + Rectangle rectNew(0, 0, FOLDER_SIZE_WIDTH, FOLDER_SIZE_HEIGHT); + Dimension size(FOLDER_SIZE_WIDTH, FOLDER_SIZE_HEIGHT); + + result r = pBitmapNew->Construct(size, BITMAP_PIXEL_FORMAT_ARGB8888); + if (r != E_SUCCESS) + { + delete pBitmapNew; + AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + pBitmapNew->Lock(bufferinfo); + r = canvas.Construct(bufferinfo); + if (r != E_SUCCESS) + { + delete pBitmapNew; + AppLogDebug("EXIT 4(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + DrawPartialImage(canvas, pAlbumInfo, rectNew); + DrawFontImage(canvas, pAlbumInfo, index); + + pBitmapNew->Unlock(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pBitmapNew; +} + +result +AlbumListPresentationModel::StartAppControl(const String& providerId, const String& operationId, + const String* pUriData, const String* pMimeType, const HashMap* pDataList, + IAppControlResponseListener* pListener) +{ + AppLogDebug("ENTER"); + FileListPresentationModel::GetInstance()->ClearProviderId(); + AppControl* pAc = AppManager::FindAppControlN(providerId, operationId); + if (pAc == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + result r = pAc->Start(pUriData, pMimeType, pDataList, pListener); + + if (r == E_SUCCESS) + { + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + pGalleryApp->SetFrameEnabled(false); + } + + delete pAc; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +String +AlbumListPresentationModel::GetDirectoryName(String& directoryPath) const +{ + AppLogDebug("ENTER"); + String directoryName; + int lastIndex = -1; + + directoryPath.LastIndexOf(DIRECTORY_SEPARATOR, directoryPath.GetLength() - 1, lastIndex); + directoryPath.SubString(lastIndex + 1, directoryName); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return directoryName; +} + +int +AlbumListPresentationModel::GetFolderCount(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pAlbumInfoList->GetCount(); +} + +void +AlbumListPresentationModel::InitializeAlbumInfoList(const ContentType& contentType) +{ + AppLogDebug("ENTER"); + + if (__pFolderBackgroundBitmap == null) + { + __pFolderBackgroundBitmap = ResourceManager::GetBitmapN(IDB_MAIN_FOLDER_BACKGROUND); + } + + if (__pAlbumInfoList != null) + { + delete __pAlbumInfoList; + } + __pAlbumInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + ContentDirectory directory; + + if (contentType == CONTENT_TYPE_ALL) + { + IListT* pListT = new (std::nothrow) ArrayListT(); + TryReturnVoid(pListT != null, "Unable to Create ArrayListT"); + pListT->Add(CONTENT_TYPE_IMAGE); + pListT->Add(CONTENT_TYPE_VIDEO); + + result r = directory.Construct(*pListT); + delete pListT; + + if (r != E_SUCCESS) + { + delete __pAlbumInfoList; + __pAlbumInfoList = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(r)); + return; + } + } + else + { + result r = directory.Construct(contentType); + if (r != E_SUCCESS) + { + delete __pAlbumInfoList; + __pAlbumInfoList = null; + AppLogDebug("EXIT 2(%s)", GetErrorMessage(r)); + return; + } + } + + IList* pContentDirectoryPathList = directory.GetContentDirectoryPathListN(SORT_ORDER_ASCENDING); + String* pDirPath = null; + AlbumInfo* pAlbumInfo = null; + + AlbumInfo* pAllAlbumInfo = new (std::nothrow) AlbumInfo(); + AlbumInfo* pCameraAlbumInfo = new (std::nothrow) AlbumInfo(); + AlbumInfo* pDownloadAlbumInfo = new (std::nothrow) AlbumInfo(); + AlbumInfo* pNoNameAlbumInfo = new (std::nothrow) AlbumInfo(); + + result r = pAllAlbumInfo->Construct(); + TryCatch(IsFailed(r) == E_SUCCESS,,"new pNoNameAlbumInfo is %s",GetErrorMessage(r)); + pAllAlbumInfo->SetAlbumName(ALL_ALBUMS_REAL_NAME); + + r = pCameraAlbumInfo->Construct(); + TryCatch(IsFailed(r) == E_SUCCESS,,"new pNoNameAlbumInfo is %s",GetErrorMessage(r)); + pCameraAlbumInfo->SetAlbumName(ResourceManager::GetString(L"IDS_MEDIABR_BODY_CAMERA_ROLL_ABB")); + + r = pDownloadAlbumInfo->Construct(); + TryCatch(IsFailed(r) == E_SUCCESS,,"new pNoNameAlbumInfo is %s",GetErrorMessage(r)); + pDownloadAlbumInfo->SetAlbumName(ResourceManager::GetString(L"IDS_COM_BODY_DOWNLOADS")); + + r = pNoNameAlbumInfo->Construct(); + TryCatch(IsFailed(r) == E_SUCCESS,,"new pNoNameAlbumInfo is %s",GetErrorMessage(r)); + pNoNameAlbumInfo->SetAlbumName(ResourceManager::GetString(L"IDS_MEDIABR_POP_NO_NAME")); + + if ((pContentDirectoryPathList != null) && (pContentDirectoryPathList->GetCount() > 0)) + { + IEnumerator* pEnum = pContentDirectoryPathList->GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pDirPath = static_cast(pEnum->GetCurrent()); + String mediaPath = RESERVED_MEDIA_PATH; + int length = mediaPath.GetLength(); + mediaPath.Remove(length-1,1); + + if (pDirPath == null) + { + continue; + } + if ((*pDirPath == RESERVED_CAMERA_PATH) ||(*pDirPath == RESERVED_CAMERA_PATH_EXT)) + { + IList* pContentIdList = GetContentIdListInDirectoryN(*pDirPath, contentType); + + if (pContentIdList != null) + { + pCameraAlbumInfo->AppendDirectory(*pDirPath); + pCameraAlbumInfo->AppendContentIdList(*pContentIdList); + + pAllAlbumInfo->AppendDirectory(*pDirPath); + pAllAlbumInfo->AppendContentIdList(*pContentIdList); + delete pContentIdList; + } + } + else if (*pDirPath == RESERVED_DOWNLOAD_PATH) + { + IList* pContentIdList = GetContentIdListInDirectoryN(*pDirPath, contentType); + + if (pContentIdList != null) + { + pDownloadAlbumInfo->AppendDirectory(*pDirPath); + pDownloadAlbumInfo->AppendContentIdList(*pContentIdList); + + pAllAlbumInfo->AppendDirectory(*pDirPath); + pAllAlbumInfo->AppendContentIdList(*pContentIdList); + + pContentIdList->RemoveAll(true); + delete pContentIdList; + } + } + else if (*pDirPath == mediaPath) + { + IList* pContentIdList = GetContentIdListInDirectoryN(*pDirPath, contentType); + + if (pContentIdList != null) + { + pNoNameAlbumInfo->AppendDirectory(*pDirPath); + pNoNameAlbumInfo->AppendContentIdList(*pContentIdList); + + pAllAlbumInfo->AppendDirectory(*pDirPath); + pAllAlbumInfo->AppendContentIdList(*pContentIdList); + + pContentIdList->RemoveAll(true); + delete pContentIdList; + } + } + else + { + IList* pContentIdList = GetContentIdListInDirectoryN(*pDirPath, contentType); + + if (pContentIdList != null) + { + if (pContentIdList->GetCount() > 0) + { + pAlbumInfo = new (std::nothrow) AlbumInfo(); + IList* pSubDirList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + pSubDirList->Add(new (std::nothrow) String(*pDirPath)); + + pAlbumInfo->Construct(GetDirectoryNameFromFullPath(*pDirPath), contentType, *pSubDirList, + *pContentIdList); + + pAllAlbumInfo->AppendDirectory(*pDirPath); + pAllAlbumInfo->AppendContentIdList(*pContentIdList); + + pSubDirList->RemoveAll(true); + delete pSubDirList; + } + + if (pContentIdList != NULL) + { + pContentIdList->RemoveAll(true); + delete pContentIdList; + } + } + if (pAlbumInfo != null && pAlbumInfo->GetContentIdCount() > 0) + { + __pAlbumInfoList->Add(pAlbumInfo); + AppLog("Adding album"); + } + else + { + delete pAlbumInfo; + } + pAlbumInfo = null; + } + } + + int insertIndex = 0; + if (pAllAlbumInfo->GetContentIdCount() > 0) + { + __pAlbumInfoList->InsertAt((Object&)*pAllAlbumInfo, insertIndex++); + } + else + { + delete pAllAlbumInfo; + } + + if (pCameraAlbumInfo->GetContentIdCount() > 0) + { + __pAlbumInfoList->InsertAt((Object&)*pCameraAlbumInfo, insertIndex++); + } + else + { + delete pCameraAlbumInfo; + } + + if (pDownloadAlbumInfo->GetContentIdCount() > 0) + { + __pAlbumInfoList->InsertAt((Object&)*pDownloadAlbumInfo, insertIndex++); + } + else + { + delete pDownloadAlbumInfo; + } + + if (pNoNameAlbumInfo->GetContentIdCount() > 0) + { + __pAlbumInfoList->InsertAt((Object&)*pNoNameAlbumInfo, insertIndex++); + } + else + { + delete pNoNameAlbumInfo; + } + + delete pEnum; + } + else + { + delete pAllAlbumInfo; + delete pCameraAlbumInfo; + delete pDownloadAlbumInfo; + delete pNoNameAlbumInfo; + } + + if (pContentDirectoryPathList != null) + { + pContentDirectoryPathList->RemoveAll(true); + delete pContentDirectoryPathList; + } + ClearThumbnailRequests(false); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return; + +CATCH: +if (pContentDirectoryPathList != null) +{ + pContentDirectoryPathList->RemoveAll(true); + delete pContentDirectoryPathList; +} + delete pAllAlbumInfo; + delete pCameraAlbumInfo; + delete pDownloadAlbumInfo; + delete pNoNameAlbumInfo; +} + +String +AlbumListPresentationModel::GetDirectoryNameFromFullPath(const String& fullPath)const +{ + AppLogDebug("ENTER"); + if (fullPath == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + while (st.HasMoreTokens()) + { + st.GetNextToken(token); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return token; +} + +IList* +AlbumListPresentationModel::GetContentIdListInDirectoryN(const String& directoryPath, ContentType contentType)const +{ + AppLogDebug("ENTER"); + + if (&directoryPath == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + ContentDirectory directory; + const String contentDirectoryPath = directoryPath; + if (contentType == CONTENT_TYPE_ALL) + { + IListT* pListT = new (std::nothrow) ArrayListT(); + pListT->Add(CONTENT_TYPE_IMAGE); + pListT->Add(CONTENT_TYPE_VIDEO); + result r = directory.Construct(*pListT); + delete pListT; + if (r != E_SUCCESS) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else + { + result r = directory.Construct(contentType); + if (r != E_SUCCESS) + { + AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + + int pageNo = 1; + int countPerPage = directory.GetContentDirectoryItemCount(contentDirectoryPath); + + IList* pContentInfoList = directory.GetContentDirectoryItemListN(contentDirectoryPath, pageNo, countPerPage, + DATE_TIME, SORT_ORDER_DESCENDING); + + IList* pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + if ((pContentInfoList != null) && (pContentInfoList->GetCount() > 0)) + { + IEnumerator* pEnum = pContentInfoList->GetEnumeratorN(); + ContentId* pItem; + while (pEnum->MoveNext() == E_SUCCESS) + { + ContentInfo* pContentInfo = static_cast(pEnum->GetCurrent()); + pItem = new (std::nothrow) ContentId(pContentInfo->GetContentId()); + pContentIdList->Add(pItem); + } + delete pEnum; + } + + if (pContentInfoList != NULL) + { + pContentInfoList->RemoveAll(true); + delete pContentInfoList; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pContentIdList; +} + +result +AlbumListPresentationModel::DeleteContentFile(const String& filePath) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + r = File::Remove(filePath); + AppLogDebug("Exit"); + return r; +} + +AppControlMode +AlbumListPresentationModel::GetAppControlMode(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + return __appControlMode; +} + +AppControlMediaType +AlbumListPresentationModel::GetAppControlMediaType(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + return __appControlMediaType; +} + +AppControlSelectionMode +AlbumListPresentationModel::GetAppControlSelectionMode(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + return __appControlSelectionMode; +} + +IList* +AlbumListPresentationModel::GetAlbumInfoList(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pAlbumInfoList; +} + +IList* AlbumListPresentationModel::GetContentIdListAtIndexN(const IList& indexList) const +{ + AppLogDebug("ENTER"); + ContentDirectory directory; + IList* pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + IListT* pListT = new (std::nothrow) ArrayListT(); + TryReturn(pListT != null,null, "Unable to Create ArrayListT"); + pListT->Add(CONTENT_TYPE_IMAGE); + pListT->Add(CONTENT_TYPE_VIDEO); + + result r = directory.Construct(*pListT); + delete pListT; + + if (r != E_SUCCESS) + { + AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult())); + delete pContentIdList; + return null; + } + + if (static_cast(indexList.GetAt(0))->ToInt() == 0) //if all-album is selected, get all files for delete + { + IList* pContentDirectoryPathList = directory.GetContentDirectoryPathListN(SORT_ORDER_ASCENDING); + String* pDirPath = null; + if ((pContentDirectoryPathList != null) && (pContentDirectoryPathList->GetCount() > 0)) + { + int loopCount = pContentDirectoryPathList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pDirPath = static_cast(pContentDirectoryPathList->GetAt(i)); + pContentIdList->AddItems(*(GetContentIdListInDirectoryN(*pDirPath, CONTENT_TYPE_ALL))); + } + } + } + else + { + if(__pAlbumInfoList != null) + { + int loopCount = indexList.GetCount(); + AlbumInfo* pInfo = null; + for (int i = 0; i < loopCount; ++i) + { + int index = static_cast(indexList.GetAt(i))->ToInt(); + pInfo = static_cast(__pAlbumInfoList->GetAt(index)); + + if(pInfo != null) + { + IList* pList = pInfo->GetContentIdListN(); + if(pList != null) + { + pContentIdList->AddItems(*pList); + } + } + } + } + } + return pContentIdList; +} + +void +AlbumListPresentationModel::OnThumbnailReceivedN(IEventArg& eventArg) +{ + AppLogDebug("ENTER"); + if (&eventArg != null) + { + ThumbnailEventArg* pThumbnailEventArg = static_cast(&eventArg); + if (pThumbnailEventArg == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + ThumbnailInfo* pThumbnailInfo = pThumbnailEventArg->GetThumbnailInfoN(); + if (pThumbnailInfo == null) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + ContentId contentId = pThumbnailInfo->GetContentId(); + ArrayList* pUpdateFolderIndex = new (std::nothrow) ArrayList(SingleObjectDeleter); + + if (__pAlbumInfoList != null) + { + int outterLoopCount = __pAlbumInfoList->GetCount(); + for (int x = 0; x < outterLoopCount; ++x) + { + AlbumInfo* pAlbumInfo = static_cast(__pAlbumInfoList->GetAt(x)); + int innerLoopCount = pAlbumInfo->GetContentIdCount(); + for (int i = 0; i < innerLoopCount; ++i) + { + if (i >= FOLDER_BITMAP_MAX) + { + break; + } + + if (contentId == pAlbumInfo->GetContentId(i)) + { + if (pAlbumInfo->GetFolderThumnailBitmap() == null) + { + pAlbumInfo->SetFolderThumnailBitmap(pThumbnailInfo->GetBitmapN()); + pUpdateFolderIndex->Add(new (std::nothrow) Integer(x)); + } + } + } + } + } + + delete pThumbnailInfo; + + if (__pPresentationModelListener->GetCount() > 0) + { + IEnumerator* pEnum = __pPresentationModelListener->GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + IAlbumEventListener* pListener = null; + pListener = static_cast(pEnum->GetCurrent()); + + int loopCount = pUpdateFolderIndex->GetCount(); + for (int k = 0; k < loopCount; ++k) + { + Integer *pIndex = (Integer*)pUpdateFolderIndex->GetAt(k); + int folderIndex = pIndex->ToInt(); + pListener->OnThumbnailDecoded(folderIndex); + } + } + delete pEnum; + } + + delete pUpdateFolderIndex; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListPresentationModel::OnContentCreated(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + if (pInterface != null) + { + pInterface->OnContentUpdated(); + } + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +AlbumListPresentationModel::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +AlbumListPresentationModel::OnContentDeleted(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +AlbumListPresentationModel::OnDeviceStateChanged(DeviceType deviceType, const Tizen::Base::String& state) +{ + AppLogDebug("ENTER"); + if (deviceType == DEVICE_TYPE_STORAGE_CARD && state == DEVICE_STORAGE_CARD_UNMOUNTED) + { + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumListPresentationModel::SetUpdateProgressStatus(const bool status) +{ + AppLogDebug("ENTER status = %d",status); + __updateProgressStatus = status; + AppLogDebug("EXIT"); +} + +result +AlbumListPresentationModel::RotateImage(const ContentId&, RotateMode rotateMode) +{ + return E_SUCCESS; +} + +void +AlbumListPresentationModel::RequestThumbnail(const int folderIndex, const int pathIndex) +{ + AppLogDebug("ENTER : folderIndex(%d), pathIndex(%d)", folderIndex, pathIndex); + + ContentId contentId; + if (__pAlbumInfoList != null) + { + AlbumInfo* pAlbumInfo = static_cast(__pAlbumInfoList->GetAt(folderIndex)); + contentId = pAlbumInfo->GetContentId(pathIndex); + } + + __pThumbnailProvider->RequestThumbnail(contentId, __pThumbnailEvent); + AppLogDebug("EXIT"); +} + +void +AlbumListPresentationModel::ClearThumbnailRequests(const bool appTerminating) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProvider != null) + { + __pThumbnailProvider->ClearThumbnailRequests(appTerminating); + } + AppLogDebug("EXIT"); +} diff --git a/src/GlAlbumNameEditorForm.cpp b/src/GlAlbumNameEditorForm.cpp new file mode 100644 index 0000000..f706bbc --- /dev/null +++ b/src/GlAlbumNameEditorForm.cpp @@ -0,0 +1,801 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAlbumNameEditorForm.cpp + * @brief This is the implementation file for AlbumNameEditorForm class. + */ + +#include +#include + +#include "GlAlbumInfo.h" +#include "GlAlbumListPresentationModel.h" +#include "GlAlbumNameEditorForm.h" +#include "GlFileListPresentationModel.h" +#include "GlFileMoveTimer.h" +#include "GlProgressAnimation.h" +#include "GlResourceManager.h" +#include "GlTypes.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::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Text; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const unsigned int COLOR_NAME_EDIT_FIELD = Color32<255, 255, 255>::Value; + +AlbumNameEditorForm::AlbumNameEditorForm(void) + : __pNameEditField(null) + , __folderIndex(0) + , __modalMsgBoxResult(0) + , __textLength(0) + , __mountState(false) + , __isCreateAlbum(false) + , __isKeyPadOpen(false) + , __albumNameEditorMode(ALBUM_NAME_EDITOR_MODE_RENAME) + , __pMessageBox(null) + , __pMoveIndexList(null) + , __fileActionMode(FILE_ACTION_MOVE) + , __pFileMove(null) + , __pPresentationModel(null) + , __pFilePresentationModel(null) +{ + AppLogDebug("ENTER"); + _overlayMsg = false; + _pProgressAnim = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AlbumNameEditorForm::~AlbumNameEditorForm(void) +{ + AppLogDebug("ENTER"); + delete __pFileMove; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumNameEditorForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(L"IDL_FORM_ALBUM_NAME_EDITOR"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AlbumNameEditorForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + __pFilePresentationModel = FileListPresentationModel::GetInstance(); + + SetOrientation(ORIENTATION_AUTOMATIC); + AddOrientationEventListener(*this); + + Header* pHeader = GetHeader(); + + pHeader->SetStyle(HEADER_STYLE_TITLE); + + FooterItem itemSave; + itemSave.Construct(IDA_BUTTON_CREATE_NAME_SAVE); + itemSave.SetText(ResourceManager::GetString(L"IDS_COM_OPT_SAVE")); + + GetFooter()->AddItem(itemSave); + GetFooter()->AddActionEventListener(*this); + GetFooter()->Invalidate(true); + + SetFormBackEventListener(this); + SetActionBarsVisible(FORM_ACTION_BAR_FOOTER, true); + + __pNameEditField = static_cast(GetControl(L"IDC_EDITFIELD_NAME")); + __pNameEditField->AddTextEventListener(*this); + __pNameEditField->SetColor(EDIT_STATUS_NORMAL, COLOR_NAME_EDIT_FIELD); + __pNameEditField->SetOverlayKeypadCommandButtonVisible(false); + __pNameEditField->AddKeypadEventListener(*this); + __pNameEditField->AddActionEventListener(*this); + + return E_SUCCESS; +} + +void +AlbumNameEditorForm::OnTextValueChanged(const Control& source) +{ + String currentInput; + String currentText; + String specialCharacters(L"/"); + String byteCountForInput; + int byteCount = 0; + int inputLength = 0; + int tempLength = 255; + int textToCheck = 0; + MessageBox messageBox; + Utf8Encoding utf8; + + FooterItemStatus currentStatus = FOOTER_ITEM_STATUS_NORMAL; + + result r = E_SUCCESS; + + if (__pNameEditField != null) + { + byteCountForInput = __pNameEditField->GetText(); + r = utf8.GetByteCount(byteCountForInput, byteCount); + AppLogDebug("result is %s",GetErrorMessage(r)); + AppLogDebug("Byte count is %d",byteCount); + } + + if (__pNameEditField != null) + { + currentText = __pNameEditField->GetText(); + textToCheck = currentText.GetLength() - __textLength; + if (currentText.IsEmpty()) + { + if (GetFooter() != null) + { + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + } + } + else + { + if (GetFooter() != null) + { + GetFooter()->GetItemStatus(0, currentStatus); + + if (currentStatus == FOOTER_ITEM_STATUS_DISABLED) + { + GetFooter()->SetItemEnabled(0,true); + GetFooter()->Invalidate(true); + } + } + } + + if (currentText.StartsWith(".", 0)) + { + String invalidCharacterString; + String validString; + String msg = ResourceManager::GetString(L"IDS_COM_POP_INVALID_CHARACTERS"); + CreateMessage(msg); + validString = __pNameEditField->GetText(); + + if (validString.GetLength() > 1) + { + validString.Remove(0,1); + __pNameEditField->SetText(validString); + } + else + { + __pNameEditField->SetText(""); + + if (GetFooter() != null) + { + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + } + } + __pNameEditField->ShowKeypad(); + } + + currentInput = __pNameEditField->GetText(); + + if (currentInput.Contains(specialCharacters[0])) + { + String msg = ResourceManager::GetString(L"IDS_COM_POP_INVALID_CHARACTERS"); + CreateMessage(msg); + currentInput.Replace("/", ""); + __pNameEditField->SetText(currentInput); + + if (currentInput == L"") + { + if (GetFooter() != null) + { + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + } + } + } + + byteCountForInput = __pNameEditField->GetText(); + r = utf8.GetByteCount(byteCountForInput, inputLength); + + if ( inputLength == tempLength ) + { + String msg = ResourceManager::GetString(L"IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED"); + CreateMessage(msg); + __pNameEditField->ShowKeypad(); + return; + } + else if (inputLength > tempLength) + { + String maxCharacterString; + String currentInputCharacter; + int checkByteCount = 0; + int lengthOfFinalString = 0; + int currentCharacter = 0; + + String msg = ResourceManager::GetString(L"IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED"); + CreateMessage(msg); + currentText = __pNameEditField->GetText(); + + for (currentCharacter=0; checkByteCount < tempLength; ++currentCharacter) + { + currentInputCharacter.Clear(); + currentInputCharacter = currentText[currentCharacter]; + r = utf8.GetByteCount(currentInputCharacter, byteCount); + if (r != E_SUCCESS) + { + break; + } + AppLogDebug("result of byte count is %s",GetErrorMessage(r)); + checkByteCount = checkByteCount + byteCount; + + if (checkByteCount < tempLength) + { + ++lengthOfFinalString; + } + } + + r = __pNameEditField->GetText().SubString(0, lengthOfFinalString, currentInput); + AppLogDebug("current input is %S", currentInput.GetPointer()); + r = __pNameEditField->SetText(currentInput); + __pNameEditField->ShowKeypad(); + return; + } + + r = utf8.GetByteCount(__pNameEditField->GetText(), byteCount); + __textLength = byteCount; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnTextValueChangeCanceled(const Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AlbumNameEditorForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void AlbumNameEditorForm::OnFileOpInvalidate(enum FileActionMode actionId) +{ + Invalidate(true); +} + +void AlbumNameEditorForm::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ + _overlayMsg = false; + if (res != COMPLETE_SUCCESS) + { + __pNameEditField->SetText(__nameEditFieldPreText); + __pNameEditField->HideKeypad(); + __pNameEditField->Draw(); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward(BackwardSceneTransition(__callerSceneId)); + } +} + +void +AlbumNameEditorForm::OnRenameAlbum(String& strOri) +{ + AppLogDebug("Rename Album"); + String path; + int index = 0; + strOri.Reverse(); + strOri.IndexOf(DIRECTORY_SEPARATOR, 0, index); + strOri.Reverse(); + strOri.SubString(0, (strOri.GetLength() - index), path); + path.Append(__nameEditFieldText); + + //Rename + result r = __pPresentationModel->RenameAlbum(strOri, path, this); + + if (IsFailed(r)) + { + AppLogDebug("Unable to rename Album %s", GetErrorMessage(r)); + if (__pMessageBox == null) + { + __pMessageBox = new (std::nothrow) MessageBox(); + if (r == E_FILE_ALREADY_EXIST) + { + __pMessageBox->Construct(L"", ResourceManager::GetString(L"IDS_MEDIABR_BODY_UNABLE_TO_RENAME_ALBUM_NAME_ALREADY_IN_USE_ABB"), + MSGBOX_STYLE_NONE, 3000); + + } + else + { + __pMessageBox->Construct(L"", ResourceManager::GetString(L"IDS_MEDIABR_POP_UNABLE_TO_RENAME"), + MSGBOX_STYLE_NONE, 3000); + } + int modalResult = 0; + _overlayMsg = true; + __pMessageBox->ShowAndWait(modalResult); + _overlayMsg = false; + delete __pMessageBox; + __pMessageBox = null; + __pNameEditField->SetEnabled(true); + __pNameEditField->ShowKeypad(); + } + } + else + { + //Add a popup here + Rectangle clientRect = Form::GetBounds(); + Rectangle rect(0, 0, clientRect.width, clientRect.height); + _pProgressAnim = new (std::nothrow) ProgressAnimation; + _pProgressAnim->Construct(rect); + AddControl(_pProgressAnim); + _pProgressAnim->SetShowState(true); + GetFooter()->SetEnabled(false); + _pProgressAnim->AnimationStart(); + _pProgressAnim->Draw(); + _overlayMsg = true; + } +} + +void +AlbumNameEditorForm::ShowAnimation() +{ + Rectangle clientRect= GetClientAreaBounds(); + Rectangle rect(0, 0, clientRect.width, clientRect.height); + _pProgressAnim = new (std::nothrow) ProgressAnimation; + _pProgressAnim->Construct(rect); + AddControl(_pProgressAnim); + _pProgressAnim->SetShowState(true); + GetFooter()->SetEnabled(false); + _pProgressAnim->AnimationStart(); + _pProgressAnim->Draw(); + _overlayMsg = true; +} + +void +AlbumNameEditorForm::StopAnimation(void) +{ + if (_pProgressAnim) + { + _pProgressAnim->AnimationStop(); + _pProgressAnim->SetShowState(false); + RemoveControl(_pProgressAnim); + GetFooter()->SetEnabled(true); + _pProgressAnim = null; + _overlayMsg = false; + } +} + +void +AlbumNameEditorForm::OnCreateAlbum(void) +{ + String path; + path.Append(Tizen::System::Environment::GetMediaPath()); + path.Append(__nameEditFieldText); + + if (__previousSceneId != IDSCN_ALL_LIST_EDITOR && __previousSceneId != IDSCN_ALL_LIST_SELECTION) + { + Directory::Create(path, true); + } + + __nameEditFieldPreText = __nameEditFieldText; + + if (path.IsEmpty()) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete __pMoveIndexList; + __pMoveIndexList = null; + return; + } + + if (__pMoveIndexList == null || __pMoveIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + delete __pMoveIndexList; + __pMoveIndexList = null; + return; + } + + delete __pFileMove; + __pFileMove = new (std::nothrow) FileMoveTimer(path, __pMoveIndexList, __pFilePresentationModel, this); + if (__fileActionMode == FILE_ACTION_COPY) + { + AppLogDebug("Rash: Setting to Copy in AlbumNameEditor"); + __pFileMove->SetCopy(); + } + else + { + __pFileMove->ClearCopy(); + } + result r = __pFileMove->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileMove; + __pFileMove = null; + __pNameEditField->SetText(__nameEditFieldPreText); + __pNameEditField->HideKeypad(); + __pNameEditField->Draw(); + + String msg = ResourceManager::GetString(L"IDS_COM_BODY_OPERATION_FAILED"); + CreateMessage(msg); + AppLogDebug("MoveToContentFileList content failed (%s)", GetErrorMessage(r)); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward(BackwardSceneTransition(__callerSceneId)); + } + else + { + AppLogDebug("MoveToContentFileList content in progress"); + _overlayMsg = true; + __fileActionMode = FILE_ACTION_MOVE; + } +} + +void +AlbumNameEditorForm::OnAlbumRenameComplete(void) +{ + //Hide popup here.. + _pProgressAnim->AnimationStop(); + _pProgressAnim->SetShowState(false); + RemoveControl(_pProgressAnim); + _overlayMsg = false; + GetFooter()->SetEnabled(true); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward((BackwardSceneTransition(IDSCN_ALBUM_LIST))); +} + +void +AlbumNameEditorForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + String path; + __nameEditFieldText = __pNameEditField->GetText(); + + if (__albumNameEditorMode == ALBUM_NAME_EDITOR_MODE_RENAME) + { + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(__folderIndex)); + path = pAlbumInfo->GetDirectory(0); + } + + switch (actionId) + { + case IDA_BUTTON_CREATE_NAME_SAVE: + { + __pNameEditField->SetEnabled(false); + __isCreateAlbum = false; + GetFooter()->SetItemEnabled(0, false); + + if (__albumNameEditorMode == ALBUM_NAME_EDITOR_MODE_CREATE) + { + if (__isKeyPadOpen == true ) + { + __pNameEditField->HideKeypad(); + __isCreateAlbum = true; + } + else + { + OnCreateAlbum(); + } + + } + else if (__albumNameEditorMode == ALBUM_NAME_EDITOR_MODE_RENAME) + { + String albumName = __pNameEditField->GetText(); + if (__originalText.Equals(albumName, true)) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + else + { + OnRenameAlbum(path); + } + } + break; + } + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + if (_pProgressAnim != null) + { + if (_pProgressAnim->GetShowState()) + { + return; + } + } + + if (__albumNameEditorMode == ALBUM_NAME_EDITOR_MODE_CREATE) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(__callerSceneId)); + } + else + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST_EDITOR)); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + __previousSceneId = previousSceneId; + + DeviceManager::AddDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + __pPresentationModel->AddContentEventListener(this); + + if (pArgs != null) + { + Integer* pAlbumTypePtr = static_cast(pArgs->GetAt(ALBUM_FIRST_ELEMENT)); + if (pAlbumTypePtr->ToInt() == ALBUM_CREATE) + { + AppLogDebug("ALBUM_NAME_EDITOR_MODE_CREATE"); + __albumNameEditorMode = ALBUM_NAME_EDITOR_MODE_CREATE; + } + else if (pAlbumTypePtr->ToInt() == ALBUM_RENAME) + { + AppLogDebug("ALBUM_NAME_EDITOR_MODE_RENAME"); + __albumNameEditorMode = ALBUM_NAME_EDITOR_MODE_RENAME; + } + pArgs->RemoveAt(ALBUM_FIRST_ELEMENT, true); + } + + if (pArgs != null) + { + Integer* operationTypePtr = static_cast(pArgs->GetAt(ALBUM_FIRST_ELEMENT)); + if (operationTypePtr->ToInt() == FILE_ACTION_MOVE) + { + AppLogDebug("Rash: FILE_MOVE_ACTION"); + __fileActionMode = FILE_ACTION_MOVE; + } + else if (operationTypePtr->ToInt() == FILE_ACTION_COPY) + { + AppLogDebug("Rash: FILE_COPY_ACTION"); + __fileActionMode = FILE_ACTION_COPY; + } + pArgs->RemoveAt(ALBUM_FIRST_ELEMENT, true); + } + + if (previousSceneId == IDSCN_ALBUM_LIST_EDITOR) + { + if (pArgs != null) + { + IEnumerator* pEnum = pArgs->GetEnumeratorN(); + if (pEnum->MoveNext() == E_SUCCESS) + { + Integer *index = static_cast(pEnum->GetCurrent()); + if (index != null) + { + __folderIndex = index->ToInt(); + } + } + delete pEnum; + delete pArgs; + pArgs = NULL; + } + } + + if (previousSceneId == IDSCN_ALL_LIST_EDITOR + || previousSceneId == IDSCN_IMAGE_LIST_EDITOR + || previousSceneId == IDSCN_VIDEO_LIST_EDITOR + || previousSceneId == IDSCN_ALL_LIST_SELECTION) + { + if (previousSceneId == IDSCN_ALL_LIST_EDITOR) + { + AppLogDebug("[MOVE] previousSceneId = IDSCN_ALL_LIST_EDITOR"); + } + else if (previousSceneId == IDSCN_ALL_LIST_SELECTION) + { + AppLogDebug("[MOVE] previousSceneId = IDSCN_ALL_LIST_SELECTION"); + } + + __callerSceneId = previousSceneId; + } + else + { + __callerSceneId = EMPTY_SPACE; + } + + if (__albumNameEditorMode == ALBUM_NAME_EDITOR_MODE_CREATE) + { + __nameEditFieldText = EMPTY_SPACE; + __nameEditFieldPreText = EMPTY_SPACE; + __pNameEditField->SetText(__nameEditFieldText); + __nameEditFieldTempText = __nameEditFieldText; + __pNameEditField->ShowKeypad(); + __pNameEditField->SetFocus(); + + GetHeader()->SetTitleText(ResourceManager::GetString(L"IDS_MEDIABR_OPT_CREATE_ALBUM")); + GetFooter()->SetItemEnabled(0, false); + GetFooter()->Invalidate(true); + } + else + { + int byteCount = 0; + Utf8Encoding utf8; + IList* pAlbumInfoList = __pPresentationModel->GetAlbumInfoList(); + AlbumInfo* pAlbumInfo = static_cast(pAlbumInfoList->GetAt(__folderIndex)); + + String strName = pAlbumInfo->GetAlbumName(); + __nameEditFieldText = strName; + __nameEditFieldPreText = strName; + __pNameEditField->SetText(__nameEditFieldText); + __nameEditFieldTempText = __nameEditFieldText; + GetHeader()->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_RENAME")); + __pNameEditField->SetOverlayKeypadCommandButtonVisible(false); + __pNameEditField->ShowKeypad(); + __pNameEditField->SetFocus(); + __originalText = __pNameEditField->GetText(); + utf8.GetByteCount(__nameEditFieldText, byteCount); + __textLength = byteCount; + GetFooter()->SetItemEnabled(0, true); + GetFooter()->Invalidate(true); + } + + if (pArgs != NULL) + { + __pMoveIndexList = pArgs; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + + if(__pNameEditField->IsEnabled() == false) + { + __pNameEditField->SetEnabled(true); + } + + __isKeyPadOpen = false; + + __pPresentationModel->RemoveContentEventListener(*this); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + + if (__mountState == false) + { + if (__pFileMove && __pFileMove->IsStarted()) + { + __pFileMove->Cancel(); + delete __pFileMove; + __pFileMove = null; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + } + else + { + __mountState = false; + } +} + +void +AlbumNameEditorForm::OnDeviceStateChanged(DeviceType deviceType, const Tizen::Base::String& state) +{ + AppLogDebug("ENTER"); + + if (deviceType == DEVICE_TYPE_STORAGE_CARD && state == DEVICE_STORAGE_CARD_UNMOUNTED) + { + if (__pFileMove && __pFileMove->IsStarted()) + { + __pFileMove->Cancel(); + delete __pFileMove; + __pFileMove = null; + } + __mountState = false; + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + } + else + { + __mountState = true; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::CreateMessage(String& str) +{ + if (__pMessageBox == null) + { + __pMessageBox = new(std::nothrow) MessageBox; + + if (__pMessageBox != null) + { + __pMessageBox->Construct(L"", str, MSGBOX_STYLE_OK, 3000); + __pMessageBox->ShowAndWait(__modalMsgBoxResult); + + delete __pMessageBox; + __pMessageBox = null; + __modalMsgBoxResult = 0; + } + } +} + +void +AlbumNameEditorForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + if (_pProgressAnim != null) + { + _pProgressAnim->ChangeOrientation(Form::GetBounds()); + _pProgressAnim->Invalidate(true); + } +} + +void +AlbumNameEditorForm::OnKeypadClosed(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + + if ( __isCreateAlbum == true) + { + OnCreateAlbum(); + __isCreateAlbum = false; + } + __isKeyPadOpen = false; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AlbumNameEditorForm::OnKeypadOpened(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + __isKeyPadOpen = true; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlAllListEditorPanel.cpp b/src/GlAllListEditorPanel.cpp new file mode 100644 index 0000000..d019e21 --- /dev/null +++ b/src/GlAllListEditorPanel.cpp @@ -0,0 +1,951 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListEditorPanel.cpp + * @brief This is the implementation file for AllListEditorPanel class. + */ + +#include +#include "GlAllListEditorPanel.h" +#include "GlCommonUtil.h" +#include "GlFileUpdateTimer.h" +#include "GlFileListEditorForm.h" +#include "GlFileListPresentationModel.h" +#include "GlResourceManager.h" +#include "GlTypes.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::Media; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const float H_COUNT_LABEL = 48.0f; +static const float H_COUNT_LABEL_BUTTON = 42.0f; +static const float W_COUNT_LABEL_BUTTON = 42.0f; +static const int COUNT_LABEL_FONT_SIZE = 33; +static const int H_CONTENT_MARGIN = 9; +static const int W_CONTENT_MARGIN = 6; +static const int W_CONTENT_SPACE = 6; +static const int H_CONTENT_SPACE = 6; +static const int LENGTH_COUNT_LABEL = 256; +static const unsigned int COLOR_COUNT_LABEL = Color32<68, 68, 68>::Value; +static const unsigned int COLOR_SELECT_COUNT_FONT = Color32<255, 255, 255>::Value; +static const unsigned int COLOR_COUNT_LABEL_BUTTON = Color32<120, 120, 120>::Value; +static const Color COLOR_THUMBNAIL_DIM (Color::GetColor(COLOR_ID_BLACK)); +static const int ALPHA_THUMBNAIL_DIM = 70; + +static const Rectangle RECT_INITIAL (0, 0, 10, 10); + +AllListEditorPanel::AllListEditorPanel(void) + : __itemCount(0) + , __pContentIconListView(null) + , __pLabelSelectCnt(null) + , __pButtonSelectRegion(null) + , __pFileUpdateTimer(null) + , __pFileListEditorForm(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AllListEditorPanel::~AllListEditorPanel(void) +{ + AppLogDebug("ENTER"); + delete __pFileUpdateTimer; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AllListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + FloatRectangle clientAreaBounds = pForm->GetClientAreaBoundsF(); + SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height); + + + __pContentIconListView = new (std::nothrow) IconListView(); + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, clientAreaBounds.height - H_COUNT_LABEL), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetMargin(MARGIN_TYPE_LEFT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_RIGHT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_TOP, H_CONTENT_MARGIN); + __pContentIconListView->SetItemSpacing(W_CONTENT_SPACE, H_CONTENT_SPACE); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_LEFT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __pLabelSelectCnt = new (std::nothrow) Label(); + String strTmp; + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED").GetPointer(); + __pLabelSelectCnt->Construct( + FloatRectangle(0, clientAreaBounds.height - H_COUNT_LABEL, clientAreaBounds.width, H_COUNT_LABEL), strTmp); + __pLabelSelectCnt->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pLabelSelectCnt->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + __pLabelSelectCnt->SetBackgroundColor(COLOR_COUNT_LABEL); + __pLabelSelectCnt->SetTextColor(Color(COLOR_SELECT_COUNT_FONT)); + __pLabelSelectCnt->SetTextConfig(COUNT_LABEL_FONT_SIZE, LABEL_TEXT_STYLE_BOLD); + AddControl(__pLabelSelectCnt); + __pLabelSelectCnt->Invalidate(true); + + __pButtonSelectRegion = new (std::nothrow) Button(); + __pButtonSelectRegion->Construct(FloatRectangle(clientAreaBounds.width - W_COUNT_LABEL_BUTTON - 10, + clientAreaBounds.height - H_COUNT_LABEL_BUTTON - 4, W_COUNT_LABEL_BUTTON, H_COUNT_LABEL_BUTTON), + EMPTY_SPACE); + __pButtonSelectRegion->SetActionId(IDA_BUTTON_MOVE_TO_SELECTION); + __pButtonSelectRegion->SetColor(BUTTON_STATUS_NORMAL, COLOR_COUNT_LABEL_BUTTON); + Bitmap* pSelectionBitmap = ResourceManager::GetBitmapN(IDB_BUTTON_MOVE_SELECTION); + if (pSelectionBitmap != null) + { + Rectangle buttonRegionRect = __pButtonSelectRegion->GetBounds(); + pSelectionBitmap->Scale(Dimension(buttonRegionRect.width, buttonRegionRect.height)); + __pButtonSelectRegion->SetNormalBitmap(Point(buttonRegionRect.width, buttonRegionRect.height), + *pSelectionBitmap); + } + AddControl(__pButtonSelectRegion); + + if (pSelectionBitmap != null) + { + delete pSelectionBitmap; + } + __pButtonSelectRegion->AddActionEventListener(*this); + + __itemCount = 0; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +AllListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + __pPresentationModel->RemoveContentEventListener(__pFileListEditorForm); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +AllListEditorPanel::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + switch (actionId) + { + case IDA_BUTTON_CHECKED: + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i=0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == false) + { + __pContentIconListView->SetItemChecked(i, true); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + int checkedCount = GetItemCheckedCount(); + String strTmp; + + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + SetButtonState(); + } + break; + + case IDA_BUTTON_UNCHECKED: + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + __pContentIconListView->SetItemChecked(i,false); + } + } + int checkedCount = GetItemCheckedCount(); + String strTmp; + + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + __pContentIconListView->UpdateList(); + SetButtonState(); + } + break; + + case IDA_BUTTON_MOVE_TO_SELECTION: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + IList* pList = GetItemCheckedIndexListN(); + if (pList == null) + { + pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_SELECTION), pList); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_SELECTION)); + } + } + break; + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AllListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +AllListEditorPanel::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + IconListViewItem* pIconListviewItem; + Bitmap* pBitmap = null; + String* pItemText = null; + result r = __pPresentationModel->GetThumbnailInSyncCacheN(index, pItemText, pBitmap); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + else if ((*pItemText) != ResourceManager::GetString(L"EMPTY_SPACE")) + { + delete pItemText; + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + if (__pContentIconListView->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + Color dimColor(COLOR_THUMBNAIL_DIM); + dimColor.SetAlpha(ALPHA_THUMBNAIL_DIM); + + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pIconListviewItem = new (std::nothrow) IconListViewItem(); + pIconListviewItem->Construct(*pBitmap, pItemText, pSelectedBitmap); + delete pSelectedBitmap; + } + else + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete pItemText; + return null; + } + } + else + { + pIconListviewItem = new (std::nothrow) IconListViewItem(); + pIconListviewItem->Construct(*pBitmap, pItemText); + } + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +bool +AllListEditorPanel::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +AllListEditorPanel::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == ICON_LIST_VIEW_ITEM_CHECKED || status == ICON_LIST_VIEW_ITEM_UNCHECKED) + { + int checkedCount = GetItemCheckedCount(); + String strTmp; + + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_ALL + || contentType == CONTENT_TYPE_IMAGE + || contentType == CONTENT_TYPE_VIDEO) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + + ChangeOrientation(); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + __pFileListEditorForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturnVoid(__pFileListEditorForm != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + __pPresentationModel->AddContentEventListener(__pFileListEditorForm); + + if (previousSceneId == IDSCN_ALL_LIST_SELECTION) + { + if (pArgs != null) + { + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + __pContentIconListView->SetItemChecked(i, false); + } + __pContentIconListView->UpdateList(); + } + + if (pArgs->GetCount() > 0) //SomeItems are Still Selected. + { + IList* pSeletedIndexList = pArgs; + int loopCount = pSeletedIndexList->GetCount(); + if (__pContentIconListView != null) + { + for (int i = 0; i < loopCount; ++i) + { + int index = static_cast(pSeletedIndexList->GetAt(i))->ToInt(); + __pContentIconListView->SetItemChecked(index, true); + } + __pContentIconListView->UpdateList(); + } + } + } + + int checkedCount = GetItemCheckedCount(); + String strTmp; + + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + } + else if (previousSceneId == IDSCN_ALL_LIST) + { + ResetSelection(); + } + + SetButtonState(); + + __pFileListEditorForm->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + + if (pArgs != null && pArgs->GetCount() > 0 && previousSceneId != IDSCN_ALL_LIST_SELECTION) + { + String* pDirectory = static_cast(pArgs->GetAt(0)); + if (pDirectory != null && pDirectory->GetLength() > 0) + { + __pFileListEditorForm->MoveToAlbum(*pDirectory); + } + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(__pFileListEditorForm); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AllListEditorPanel::GetItemCheckedCount(void) const +{ + AppLogDebug("ENTER"); + int count = 0; + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + ++count; + } + else + { + AppLog("Index i = %d is Not Checked", i); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return count; +} + +IList* +AllListEditorPanel::GetItemCheckedIndexListN(void) const +{ + AppLogDebug("ENTER"); + IList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + Integer* pIndex = null; + + if (__pContentIconListView!=null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + pIndex = new (std::nothrow) Integer(i); + pList->Add(pIndex); + AppLogDebug("checked index(%d)", i); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pList; +} + +result +AllListEditorPanel::OnRequestDelete(void) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + delete __pFileUpdateTimer; + __pFileUpdateTimer = new (std::nothrow) FileUpdateTimer(pIndexList, __pPresentationModel, this, FILE_ACTION_DELETE); + result r = __pFileUpdateTimer->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + return E_FAILURE; + } + else + { + __pPresentationModel->SetUpdateProgressStatus(true); + } + return E_SUCCESS; +} + +void AllListEditorPanel::OnFileOpInvalidate(enum FileActionMode actionId) +{ + __pFileListEditorForm->Invalidate(true); +} + +void AllListEditorPanel::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ + __pPresentationModel->SetUpdateProgressStatus(false); + + __pLabelSelectCnt->SetText(ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED")); + __pLabelSelectCnt->RequestRedraw(true); + + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (GetItemCount() > 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST,SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_ADD_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST,SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_ADD_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::ChangeOrientation(void) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + const Form* pForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturn(pForm != null,, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + FloatRectangle clientAreaBounds = pForm->GetClientAreaBoundsF(); + SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height); + __pContentIconListView->SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height - H_COUNT_LABEL); + __pLabelSelectCnt->SetBounds(0.0f, clientAreaBounds.height - H_COUNT_LABEL, clientAreaBounds.width, H_COUNT_LABEL); + __pButtonSelectRegion->SetBounds(clientAreaBounds.width - W_COUNT_LABEL_BUTTON - 10.0f, + clientAreaBounds.height - H_COUNT_LABEL_BUTTON - 4.0f, W_COUNT_LABEL_BUTTON, H_COUNT_LABEL_BUTTON); +} + +result +AllListEditorPanel::OnRequestMessage(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null || pIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + Integer* pIndex = null; + int checkedIndex; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pIndex = static_cast(pIndexList->GetAt(i)); + if (pIndex != null) + { + checkedIndex = pIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(checkedIndex))); + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_MESSAGE_TYPE), new (std::nothrow) String(APPCONTROL_DATA_MMS)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_MESSAGE, APPCONTROL_OPERATION_ID_COMPOSE, null, + null, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListEditorPanel::OnRequestEmail(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null || pIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + Integer* pIndex = null; + int checkedIndex; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pIndex = static_cast(pIndexList->GetAt(i)); + if (pIndex != null) + { + checkedIndex = pIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(checkedIndex))); + } + } + + const String uriData = APPCONTROL_URI_MAIL_TO; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_EMAIL, APPCONTROL_OPERATION_ID_COMPOSE, + &uriData, null, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListEditorPanel::OnRequestSlideShow(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + + Integer* pRealIndex = null; + int realIndex = -1; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pRealIndex = static_cast(pIndexList->GetAt(i)); + if (pRealIndex != null) + { + realIndex = pRealIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(realIndex))); + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_SLIDE_SHOW)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + delete pIndexList; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AllListEditorPanel::ResetSelection(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + + for (int index = 0; index < __itemCount; ++index) + { + __pContentIconListView->SetItemChecked(index, false); + __pContentIconListView->RefreshList(index,LIST_REFRESH_TYPE_ITEM_MODIFY); + } + + String strTmp; + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::SetButtonState(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + if (GetItemCheckedCount() > 0) + { + AppLogDebug("BUTTONSTATE : Request Enable"); + __pFileListEditorForm->SetFooterButtonsState(true); + __pButtonSelectRegion->SetShowState(true); + } + else + { + AppLogDebug("BUTTONSTATE : Request disable"); + __pFileListEditorForm->SetFooterButtonsState(false); + __pButtonSelectRegion->SetShowState(false); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListEditorPanel::OnSelectAllPressed(void) +{ + bool needToSelectAll = true; + int checkedCount = GetItemCheckedCount(); + int totalFileCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + if (checkedCount == totalFileCount) + { + needToSelectAll = false; + } + + if (needToSelectAll == true) + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == false) + { + __pContentIconListView->SetItemChecked(i,true); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + else + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + __pContentIconListView->SetItemChecked(i, false); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + + String tempString; + if (needToSelectAll == true) + { + tempString.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), totalFileCount); + } + else + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + + __pLabelSelectCnt->SetText(tempString); + __pLabelSelectCnt->RequestRedraw(true); + SetButtonState(); +} + +result +AllListEditorPanel::OnRequestRotate(RotateMode rotateMode) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + else if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + delete __pFileUpdateTimer; + __pFileUpdateTimer = new (std::nothrow) FileUpdateTimer(pIndexList, __pPresentationModel, this, FILE_ACTION_ROTATE, rotateMode); + result r = __pFileUpdateTimer->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + return E_FAILURE; + } + else + { + __pPresentationModel->SetUpdateProgressStatus(true); + } + return E_SUCCESS; +} + +void AllListEditorPanel::CancelUpdateProgress(void) +{ + if (__pFileUpdateTimer!= null && __pFileUpdateTimer->IsStarted()) + { + __pFileUpdateTimer->Cancel(); + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + } +} + +void +AllListEditorPanel::OnScanDirStart() +{ + AppLogDebug("ENTER"); + __pFileListEditorForm->SetProgressState(true); + AppLogDebug("EXIT"); +} +void +AllListEditorPanel::OnScanDirComplete() +{ + AppLogDebug("ENTER"); + __pFileListEditorForm->SetProgressState(false); + AppLogDebug("EXIT"); +} diff --git a/src/GlAllListPanel.cpp b/src/GlAllListPanel.cpp new file mode 100644 index 0000000..21a7cdb --- /dev/null +++ b/src/GlAllListPanel.cpp @@ -0,0 +1,415 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListPanel.cpp + * @brief This is the implementation file for AllListPanel class. + */ + +#include "GlAlbumInfo.h" +#include "GlAllListPanel.h" +#include "GlCommonUtil.h" +#include "GlFileListForm.h" +#include "GlFileListPresentationModel.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const Rectangle RECT_INITIAL (0, 0, 10, 10); +static const int W_CLIENT = 720; +static const int H_CONTENT_MARGIN = 9; +static const int W_CONTENT_MARGIN = 6; +static const int W_CONTENT_SPACE = 6; +static const int H_CONTENT_SPACE = 6; + +AllListPanel::AllListPanel(void) + : __itemCount(0) + , __pContentIconListView(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AllListPanel::~AllListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListPanel::Refresh(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_IMAGE) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_IMAGE); + } + else if (__pPresentationModel->GetAppControlMediaType() == APPCONTROL_MEDIA_TYPE_VIDEO) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_VIDEO); + } + else + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_VIDEO); + } + } + else + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + } + + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + if (__itemCount == 0) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALBUM_LIST,SCENE_TRANSITION_ANIMATION_TYPE_NONE,SCENE_DESTROY_OPTION_KEEP)); + } + else + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + if (pFileListForm != null) + { + pFileListForm->SetMenuState(true); + } + } + + __pContentIconListView->UpdateList(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AllListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + clientAreaBounds.x = clientAreaBounds.y = 0; + SetBounds(clientAreaBounds); + + __pContentIconListView = new (std::nothrow) IconListView(); + __pContentIconListView->Construct(Rectangle(0, 0, W_CLIENT, clientAreaBounds.height), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_NORMAL, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetMargin(MARGIN_TYPE_LEFT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_RIGHT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_TOP, H_CONTENT_MARGIN); + __pContentIconListView->SetItemSpacing(W_CONTENT_SPACE, H_CONTENT_SPACE); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_RIGHT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + result r = AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __itemCount = 0; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST) + { + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + __pPresentationModel->RemoveContentEventListener(pFileListForm); + } + __pPresentationModel->RemovePresentationModelListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +int +AllListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +AllListPanel::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + Bitmap* pBitmap=null; + String* pItemText=null; + result r = __pPresentationModel->GetThumbnailInSyncCacheN(index, pItemText, pBitmap); + if (r != E_SUCCESS) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + IconListViewItem* pIconListviewItem = new (std::nothrow) IconListViewItem(); + + if (pBitmap == null) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + else if ((*pItemText) != ResourceManager::GetString(L"EMPTY_SPACE")) + { + delete pItemText; + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + if (pItemText != null) + { + pIconListviewItem->Construct(*pBitmap, pItemText); + } + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +bool +AllListPanel::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER : index(%d)", index); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +AllListPanel::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (status == ICON_LIST_VIEW_ITEM_SELECTED) + { + if (__pPresentationModel->GetCurrentAlbumContentInfoCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + ArrayList* pArrayList = new (std::nothrow) ArrayList(); + pArrayList->Construct(); + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + + for (int i = 0; i < loopCount; ++i) + { + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(i))); + } + + String listIndex; + listIndex.Format(10, L"%d", index); + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_IMAGE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), pArrayList); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_INDEX), new (std::nothrow) String(listIndex)); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + String* pTemp = null; + loopCount = pArrayList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pTemp = static_cast(pArrayList->GetAt(i)); + AppLog("print temp(%ls)", pTemp->GetPointer()); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_ALL || contentType == CONTENT_TYPE_IMAGE + || contentType == CONTENT_TYPE_VIDEO) + { + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListPanel::ChangeOrientation(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + const Form* pForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturn(pForm != null,, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); + __pContentIconListView->SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); +} + +void +AllListPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + ChangeOrientation(); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + if (currentSceneId == IDSCN_ALL_LIST) + { + if (previousSceneId == IDSCN_ALBUM_LIST && pArgs != null) + { + AlbumInfo* pAlbumInfo = static_cast(pArgs->GetAt(0)); + if (pAlbumInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + IList* pDirectoryList = pAlbumInfo->GetDirectoryListN(); + __pPresentationModel->SetCurrentAlbumInfo(pAlbumInfo->GetAlbumName(), *pDirectoryList); + if (pDirectoryList != null) + { + delete pDirectoryList; + } + + delete pArgs; + + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + else + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + } + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST) + { + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + if (pFileListForm != null) + { + pFileListForm->SetTitleText(__pPresentationModel->GetCurrentAlbumName()); + + if (__itemCount == 0) + { + pFileListForm->SetMenuState(false); + } + else + { + pFileListForm->SetMenuState(true); + } + + } + __pPresentationModel->AddContentEventListener(pFileListForm); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListPanel::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST) + { + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + __pPresentationModel->RemoveContentEventListener(pFileListForm); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlAllListSelectionPanel.cpp b/src/GlAllListSelectionPanel.cpp new file mode 100644 index 0000000..51c2f45 --- /dev/null +++ b/src/GlAllListSelectionPanel.cpp @@ -0,0 +1,808 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlAllListSelectionPanel.cpp + * @brief This is the implementation file for AllListSelectionPanel class. + */ + +#include "GlAllListSelectionPanel.h" +#include "GlCommonUtil.h" +#include "GlFileListEditorForm.h" +#include "GlFileListPresentationModel.h" +#include "GlResourceManager.h" +#include "GlTypes.h" +#include "GlFileUpdateTimer.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::Media; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int LENGTH_COUNT_LABEL = 256; +static const int H_CONTENT_MARGIN = 9; +static const int W_CONTENT_MARGIN = 6; +static const int W_CONTENT_SPACE = 6; +static const int H_CONTENT_SPACE = 6; +static const Color COLOR_THUMBNAIL_DIM (Color::GetColor(COLOR_ID_BLACK)); +static const int ALPHA_THUMBNAIL_DIM = 70; + +static const Rectangle RECT_INITIAL (0, 0, 10, 10); + +AllListSelectionPanel::AllListSelectionPanel(void) + : __itemCount(0) + , __pContentIconListView(null) + , __pSeletedIndexList(null) + , __pFileListEditorForm(null) + , __pFileUpdateTimer(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +AllListSelectionPanel::~AllListSelectionPanel(void) +{ + AppLogDebug("ENTER"); + delete __pFileUpdateTimer; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +AllListSelectionPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return Construct(RECT_INITIAL); // Should be set proper area at OnInitializing() +} + +result +AllListSelectionPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + clientAreaBounds.x = clientAreaBounds.y = 0; + result r = SetBounds(clientAreaBounds); + + __pContentIconListView = new (std::nothrow) IconListView(); + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, clientAreaBounds.height), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetMargin(MARGIN_TYPE_LEFT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_RIGHT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_TOP, H_CONTENT_MARGIN); + __pContentIconListView->SetItemSpacing(W_CONTENT_SPACE, H_CONTENT_SPACE); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_LEFT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __itemCount = 0; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListSelectionPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + __pPresentationModel->RemovePresentationModelListener(*this); + if (__pSeletedIndexList != null) + { + delete __pSeletedIndexList; + __pSeletedIndexList = null; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +int +AllListSelectionPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +AllListSelectionPanel::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + IconListViewItem* pIconListviewItem; + Bitmap* pBitmap = null; + String* pItemText = null; + + int realIndex = GetRealindexFromVirtualIndex(index); + result r = __pPresentationModel->GetThumbnailInSyncCacheN(realIndex, pItemText, pBitmap); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(realIndex); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + else if ((*pItemText) != ResourceManager::GetString(L"EMPTY_SPACE")) + { + delete pItemText; + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + if (__pContentIconListView->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + + Color dimColor(COLOR_THUMBNAIL_DIM); + dimColor.SetAlpha(ALPHA_THUMBNAIL_DIM); + + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pIconListviewItem = new (std::nothrow) IconListViewItem(); + pIconListviewItem->Construct(*pBitmap, pItemText, pSelectedBitmap); + delete pSelectedBitmap; + } + else + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete pItemText; + return null; + } + + } + else + { + pIconListviewItem = new (std::nothrow) IconListViewItem(); + pIconListviewItem->Construct(*pBitmap, pItemText); + } + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +bool +AllListSelectionPanel::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +AllListSelectionPanel::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == ICON_LIST_VIEW_ITEM_CHECKED || status == ICON_LIST_VIEW_ITEM_UNCHECKED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + String strTmp; + strTmp.Format(LENGTH_COUNT_LABEL, L"%ls (%d)", + ResourceManager::GetString(L"IDS_COM_BODY_SELECTED").GetPointer(), GetItemCheckedCount()); + __pFileListEditorForm->SetTitleText(strTmp); + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + int virtualIndex = -1; + int loopCount = __pSeletedIndexList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + virtualIndex = GetVirtualIndexFromRealIndex(index); + if (virtualIndex >= 0) + { + __pContentIconListView->RefreshList(virtualIndex, LIST_REFRESH_TYPE_ITEM_MODIFY); + break; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + + ChangeOrientation(); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + __pFileListEditorForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturnVoid(__pFileListEditorForm != null, "[%s] fail to get FileListEditorForm.", GetErrorMessage(GetLastResult())); + __pPresentationModel->AddContentEventListener(__pFileListEditorForm); + + if (previousSceneId == IDSCN_ALL_LIST_EDITOR) + { + if (pArgs != null) + { + __pSeletedIndexList = pArgs; + } + ResetSelection(); + int loopCount = __pSeletedIndexList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + __pContentIconListView->SetItemChecked(i, true); + __pContentIconListView->RequestRedraw(true); + } + } + SetButtonState(); + + if (pArgs != null && pArgs->GetCount() > 0) + { + String* pDirectory = static_cast(pArgs->GetAt(0)); + if (pDirectory != null && pDirectory->GetLength() > 0) + { + __pFileListEditorForm->MoveToAlbum(*pDirectory); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(__pFileListEditorForm); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +AllListSelectionPanel::GetItemCheckedCount(void) const +{ + AppLogDebug("ENTER"); + int count = 0; + if (__pContentIconListView != null && __pSeletedIndexList != null) + { + int loopCount = __pSeletedIndexList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + ++count; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return count; +} + +IList* +AllListSelectionPanel::GetItemCheckedIndexListN(void) const +{ + AppLogDebug("ENTER"); + IList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + Integer* pIndex = null; + + if (__pContentIconListView!=null) + { + int realIndex = -1; + int loopCount = __pSeletedIndexList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + realIndex = GetRealindexFromVirtualIndex(i); + pIndex = new (std::nothrow) Integer(realIndex); + pList->Add(pIndex); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pList; +} + +int +AllListSelectionPanel::GetRealindexFromVirtualIndex(const int virtualIndex) const +{ + if (__pSeletedIndexList == null || __pSeletedIndexList->GetCount() == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return -1; + } + + Integer* pRealIndex = static_cast(__pSeletedIndexList->GetAt(virtualIndex)); + int realIndex = -1; + if (pRealIndex != null) + { + realIndex = pRealIndex->ToInt(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return realIndex; +} + +int +AllListSelectionPanel::GetVirtualIndexFromRealIndex(const int realIndex) const +{ + int returnValue = -1; + int loopCount = __pSeletedIndexList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + Integer* pRealIndex = static_cast(__pSeletedIndexList->GetAt(i)); + int index = -1; + if (pRealIndex != null) + { + index = pRealIndex->ToInt(); + } + + if (index == realIndex) + { + returnValue = i; + break; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return returnValue; +} + +result +AllListSelectionPanel::OnRequestDelete(void) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + delete __pFileUpdateTimer; + __pFileUpdateTimer = new (std::nothrow) FileUpdateTimer(pIndexList, __pPresentationModel, this, FILE_ACTION_DELETE); + result r = __pFileUpdateTimer->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + return E_FAILURE; + } + else + { + __pPresentationModel->SetUpdateProgressStatus(true); + } + + return E_SUCCESS; +} + +void AllListSelectionPanel::OnFileOpInvalidate(enum FileActionMode actionId) +{ + __pFileListEditorForm->Invalidate(true); +} + +void AllListSelectionPanel::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ + __pPresentationModel->SetUpdateProgressStatus(false); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", + GetErrorMessage(GetLastResult())); + + String strTmp; + String selectString = ResourceManager::GetString(L"IDS_COM_BODY_SELECTED"); + strTmp.Format(LENGTH_COUNT_LABEL, L"%ls (%d)", selectString.GetPointer(), 0); + __pFileListEditorForm->SetTitleText(strTmp); + + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + + if (GetItemCount() > 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::ChangeOrientation() +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + const Form* pForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturn(pForm != null,, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); + __pContentIconListView->SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); +} + +result +AllListSelectionPanel::OnRequestMessage(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null || pIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + Integer* pIndex = null; + int checkedIndex; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pIndex = static_cast(pIndexList->GetAt(i)); + if (pIndex != null) + { + checkedIndex = pIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(checkedIndex))); + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_MESSAGE_TYPE), new (std::nothrow) String(APPCONTROL_DATA_MMS)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_MESSAGE, APPCONTROL_OPERATION_ID_COMPOSE, null, + null, pDataList, null); + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListSelectionPanel::OnRequestEmail(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null || pIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + Integer* pIndex = null; + int checkedIndex; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pIndex = static_cast(pIndexList->GetAt(i)); + if (pIndex != null) + { + checkedIndex = pIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(checkedIndex))); + } + } + + const String uriData = APPCONTROL_URI_MAIL_TO; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_EMAIL, APPCONTROL_OPERATION_ID_COMPOSE, + &uriData, null, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +AllListSelectionPanel::OnRequestSlideShow(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + + Integer* pRealIndex = null; + int realIndex = -1; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pRealIndex = static_cast(pIndexList->GetAt(i)); + if (pRealIndex != null) + { + realIndex = pRealIndex->ToInt(); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(realIndex))); + } + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_SLIDE_SHOW)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +AllListSelectionPanel::ResetSelection(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_ALL); + if (__pSeletedIndexList == null) + { + __itemCount = 0; + } + else + { + __itemCount = __pSeletedIndexList->GetCount(); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + String strTmp; + String bodyText = ResourceManager::GetString(L"IDS_COM_BODY_SELECTED"); + strTmp.Format(LENGTH_COUNT_LABEL, L"%ls (%d)", bodyText.GetPointer(), __itemCount); + __pFileListEditorForm->SetTitleText(strTmp); + + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::SetButtonState(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + if (GetItemCheckedCount() > 0) + { + AppLogDebug("BUTTONSTATE : Request Enable"); + __pFileListEditorForm->SetFooterButtonsState(true); + } + else + { + AppLogDebug("BUTTONSTATE : Request disable"); + __pFileListEditorForm->SetFooterButtonsState(false); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +AllListSelectionPanel::OnSelectAllPressed(void) +{ + bool needToSelectAll = true; + int checkedCount = GetItemCheckedCount(); + if (checkedCount == __itemCount) + { + needToSelectAll = false; + } + + if (needToSelectAll == true) + { + for (int i = 0; i < __itemCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == false) + { + __pContentIconListView->SetItemChecked(i, true); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + else + { + for (int i = 0; i < __itemCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + __pContentIconListView->SetItemChecked(i, false); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + String tempString; + if (needToSelectAll == true) + { + tempString.Format(LENGTH_COUNT_LABEL, L"%ls (%d)", + ResourceManager::GetString(L"IDS_COM_BODY_SELECTED").GetPointer(), __itemCount); + } + else + { + tempString.Format(LENGTH_COUNT_LABEL, L"%ls (%d)", + ResourceManager::GetString(L"IDS_COM_BODY_SELECTED").GetPointer(), 0); + } + __pFileListEditorForm->SetTitleText(tempString); + + SetButtonState(); +} + +result +AllListSelectionPanel::OnRotateRequested(RotateMode rotateMode) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + if (pIndexList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + else if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + delete __pFileUpdateTimer; + __pFileUpdateTimer = new (std::nothrow) FileUpdateTimer(pIndexList, __pPresentationModel, this, FILE_ACTION_ROTATE, rotateMode); + result r = __pFileUpdateTimer->StartTimer(); + + if (IsFailed(r)) + { + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + return E_FAILURE; + } + else + { + __pPresentationModel->SetUpdateProgressStatus(true); + } + return E_SUCCESS; +} + +void AllListSelectionPanel::CancelUpdateProgress(void) +{ + if (__pFileUpdateTimer!= null && __pFileUpdateTimer->IsStarted()) + { + __pFileUpdateTimer->Cancel(); + delete __pFileUpdateTimer; + __pFileUpdateTimer = null; + } +} + +void +AllListSelectionPanel::OnScanDirStart() +{ + AppLogDebug("ENTER"); + __pFileListEditorForm->SetProgressState(true); + AppLogDebug("EXIT"); +} +void +AllListSelectionPanel::OnScanDirComplete() +{ + AppLogDebug("ENTER"); + __pFileListEditorForm->SetProgressState(false); + AppLogDebug("EXIT"); +} diff --git a/src/GlBaseForm.cpp b/src/GlBaseForm.cpp new file mode 100644 index 0000000..cfe5ba4 --- /dev/null +++ b/src/GlBaseForm.cpp @@ -0,0 +1,115 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlBaseForm.cpp + * @brief This is the implementation file for GlBaseForm class. + */ + +#include "GlFileListPresentationModel.h" +#include "GlBaseForm.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Base::Utility; + +IList* +BaseForm::GetMoveFileIndexList(String& moveDir, IList* pMoveIndexList, FileListPresentationModel* pPresentationModel, bool isCopyOp) +{ + if (&moveDir == null || moveDir.IsEmpty()) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + if (pMoveIndexList == null || pMoveIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + IList* pCollisionList = pPresentationModel->GetCollisionIndexListN(*pMoveIndexList, moveDir); + + if (pCollisionList != null) + { + int loopCount = pCollisionList->GetCount(); + int collisionCount = 0; + for (int i = 0; i < loopCount; ++i) + { + String* pCollisionString = const_cast(static_cast(pCollisionList->GetAt(i))); + String tmpString; + + if (pCollisionString != null) + { + tmpString = (*pCollisionString); + } + + String delim(MULTI_ITEM_SEPARATOR); + StringTokenizer st(tmpString, delim); + String token; + + int collisionIndex; + String fileName; + + if (st.HasMoreTokens() == true) + { + st.GetNextToken(token); + Integer::Parse(token, collisionIndex); + + if (st.HasMoreTokens() == true) + { + st.GetNextToken(fileName); + } + + int innerLoopCount = pMoveIndexList->GetCount(); + for (int j = 0; j < innerLoopCount; ++j) + { + if (collisionIndex == (const_cast(static_cast + (pMoveIndexList->GetAt(j))))->ToInt()) + { + pMoveIndexList->RemoveAt(j, true); + --j; + --innerLoopCount; + ++collisionCount; + } + } + } + } + + pCollisionList->RemoveAll(true); + delete pCollisionList; + + if (collisionCount > 0) + { + MessageBox messageBox; + + if ( isCopyOp) + { + messageBox.Construct(L"", L"Unable to copy some files. Same files exists", + MSGBOX_STYLE_NONE, 3000); + } + else + { + messageBox.Construct(L"", L"Unable to move some files. Same files exists", + MSGBOX_STYLE_NONE, 3000); + } + int modalResult; + messageBox.ShowAndWait(modalResult); + } + } + return pMoveIndexList; +} diff --git a/src/GlCommonUtil.cpp b/src/GlCommonUtil.cpp new file mode 100644 index 0000000..c148472 --- /dev/null +++ b/src/GlCommonUtil.cpp @@ -0,0 +1,66 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlCommonUtil.cpp + * @brief This is the implementation file for CommonUtil class. + */ + +#include + +#include "GlCommonUtil.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; + +static const int W_DEFAULT_THUMBNAIL = 171; +static const int H_DEFAULT_THUMBNAIL = 127; +static const int BASE_STANDARD = 1000; +static const int FORMAT_TIME = 10; +static const String DATETIME_FORMAT = L"%02d:%02d:%02d"; + +Bitmap* +CommonUtil::GetEmptyThumbnailN(void) +{ + Rectangle mainRect(0, 0, W_DEFAULT_THUMBNAIL, H_DEFAULT_THUMBNAIL); + Bitmap* pBitmap = new (std::nothrow) Bitmap(); + result r = pBitmap->Construct(mainRect); + if (r != E_SUCCESS) + { + delete pBitmap; + return null; + } + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + Canvas mainCanvas; + mainCanvas.Construct(bufferInfo); + mainCanvas.FillRectangle(Color::GetColor(COLOR_ID_WHITE), mainCanvas.GetBounds()); + mainCanvas.DrawBitmap(mainRect, *pBitmap); + return pBitmap; +} + +String +CommonUtil::DurationToTimeString(const long duration) +{ + String strTime; + DateTime dateTime; + dateTime.AddSeconds(duration / BASE_STANDARD); + strTime.Format(FORMAT_TIME, DATETIME_FORMAT.GetPointer(), dateTime.GetHour(), dateTime.GetMinute(), dateTime.GetSecond()); + return strTime; +} diff --git a/src/GlContentUpdateEventListener.cpp b/src/GlContentUpdateEventListener.cpp new file mode 100644 index 0000000..6025d6f --- /dev/null +++ b/src/GlContentUpdateEventListener.cpp @@ -0,0 +1,284 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlContentUpdateEventListener.cpp + * @brief This is the implementation file for ContentUpdateEventListener class. + */ + +#include +#include +#include "GlContentUpdateEventListener.h" +#include "GlFileListPresentationModel.h" +#include "GlAlbumListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; + +ContentUpdateEventListener* ContentUpdateEventListener::__pContentUpdateEventListener = null; + +ContentUpdateEventListener::ContentUpdateEventListener(void) + : __pContentManager(null) + , __isTimerActive(false) + , __changeNotificationReceived(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentUpdateEventListener::~ContentUpdateEventListener(void) +{ + AppLogDebug("ENTER"); + + if(__pContentManager != null) + { + __pContentManager->RemoveContentUpdateEventListener(*this); + delete __pContentManager; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ContentUpdateEventListener* +ContentUpdateEventListener::GetInstance(void) +{ + AppLogDebug("ENTER"); + + if (__pContentUpdateEventListener == null) + { + CreateInstance(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pContentUpdateEventListener; +} + +void ContentUpdateEventListener::AddContentListener(void) +{ + if(__pContentManager != null) + { + __pContentManager->AddContentUpdateEventListener(*this); + } +} + +void ContentUpdateEventListener::RemoveContentListener(void) +{ + if(__pContentManager != null) + { + __pContentManager->RemoveContentUpdateEventListener(*this); + } +} + +result +ContentUpdateEventListener::Construct(void) +{ + AppLogDebug("ENTER"); + + __pContentManager = new (std::nothrow) ContentManager(); + + if (__pContentManager != null) + { + __pContentManager->Construct(); + __pContentManager->AddContentUpdateEventListener(*this); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return E_SUCCESS; +} + +void +ContentUpdateEventListener::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pContentUpdateEventListener = new (std::nothrow) ContentUpdateEventListener(); + + if (__pContentUpdateEventListener != null) + { + result r = __pContentUpdateEventListener->Construct(); + + if (IsFailed(r) == true) + { + delete __pContentUpdateEventListener; + __pContentUpdateEventListener = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + } + + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ContentUpdateEventListener::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + + if (__pContentUpdateEventListener != null) + { + delete __pContentUpdateEventListener; + __pContentUpdateEventListener = null; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +ContentUpdateEventListener::GetChangeNotificationStatus() +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __changeNotificationReceived; +} + +void +ContentUpdateEventListener::ResumeOperation() +{ + AppLogDebug("ENTER"); + AlbumListPresentationModel::GetInstance()->OnContentDeleted(); + FileListPresentationModel::GetInstance()->OnContentDeleted(); + __changeNotificationReceived = false; + AppLogDebug("EXIT"); +} + +String +ContentUpdateEventListener::GetDirecotyNameFromFullPath(const String& fullPath)const +{ + AppLogDebug("ENTER"); + if (fullPath == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + String tokenPrev; + while (st.HasMoreTokens()) + { + tokenPrev = token; + st.GetNextToken(token); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return tokenPrev; +} + +void +ContentUpdateEventListener::OnContentFileCreated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + if ( !__isTimerActive && ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO) ) + { + Tizen::Content::ContentInfo* cntInfo = __pContentManager->GetContentInfoN(contentId); + + if ( cntInfo != NULL) + { + String path = cntInfo->GetContentPath(); + String dirName = GetDirecotyNameFromFullPath(path); + + FileListPresentationModel* pFileListPM = FileListPresentationModel::GetInstance(); + pFileListPM->AddDirectoryIfNew(dirName); + AlbumListPresentationModel::GetInstance()->OnContentCreated(); + pFileListPM->OnContentCreated(); + } + } + + AppLogDebug("EXIT"); +} + +void +ContentUpdateEventListener::OnContentFileUpdated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + + if ( !__isTimerActive && ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO) ) + { + AlbumListPresentationModel::GetInstance()->OnContentUpdated(); + FileListPresentationModel::GetInstance()->OnContentUpdated(); + } + else + { + FileListPresentationModel::GetInstance()->OnContentUpdated(contentId); + } + AppLogDebug("EXIT"); +} + +void +ContentUpdateEventListener::OnContentFileDeleted(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + + if ( !__isTimerActive && ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO) ) + { + Tizen::App::UiApp* appPtr = Tizen::App::UiApp::GetInstance(); + if (appPtr->GetAppUiState() == Tizen::App::APP_UI_STATE_FOREGROUND) + { + AlbumListPresentationModel::GetInstance()->OnContentDeleted(); + FileListPresentationModel::GetInstance()->OnContentDeleted(); + } + else + { + __changeNotificationReceived = true; + } + + } + AppLogDebug("EXIT"); +} + +void +ContentUpdateEventListener::OnContentDirectoryScanCompleted(const Tizen::Base::String& directoryPath, result r) +{ + AppLogDebug("ENTER"); + + if ( __isTimerActive ) + { + AlbumListPresentationModel::GetInstance()->OnContentScanCompleted( directoryPath ); + return; + } + Tizen::App::UiApp* appPtr = Tizen::App::UiApp::GetInstance(); + if (appPtr->GetAppUiState() == Tizen::App::APP_UI_STATE_FOREGROUND) + { + AlbumListPresentationModel::GetInstance()->OnContentDeleted(); + FileListPresentationModel::GetInstance()->OnContentDeleted(); + AlbumListPresentationModel::GetInstance()->OnContentScanCompleted(directoryPath); + } + else + { + bool renameHandled = AlbumListPresentationModel::GetInstance()->OnContentScanCompleted(directoryPath); + if (!renameHandled) + { + __changeNotificationReceived = true; + } + } + + AppLogDebug("EXIT"); +} +void +ContentUpdateEventListener::SetTimerActive(void) +{ + __isTimerActive = true; +} + +void +ContentUpdateEventListener::ReSetTimerActive(void) +{ + __isTimerActive = false; +} diff --git a/src/GlDropDownCustomItem.cpp b/src/GlDropDownCustomItem.cpp new file mode 100644 index 0000000..37e143d --- /dev/null +++ b/src/GlDropDownCustomItem.cpp @@ -0,0 +1,131 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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: DropDownCustomItem + *@brief: To create Drop Down custom item + * + */ + +#include +#include "GlDropDownCustomItem.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +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) + : __currentState(DROP_DOWN_ITEM_STATE_CLOSED) + , __height(0) + , __width(0) +{ +} + +DropDownCustomItem::~DropDownCustomItem(void) +{ +} + +result +DropDownCustomItem::Construct(int width, int height) +{ + __width = width; + __height = height + 28; + Dimension dim(__width, __height); + result r = CustomItem::Construct(dim, LIST_ANNEX_STYLE_NORMAL); + return r; +} + +void +DropDownCustomItem::SetMainText(const Tizen::Base::String& text) +{ + __mainText = text; +} + +String +DropDownCustomItem::GetMainText(void) const +{ + return __mainText; +} + +void +DropDownCustomItem::SetSubText(const Tizen::Base::String& text) +{ + __subText = text; +} + +String +DropDownCustomItem::GetSubText(void) const +{ + return __subText; +} + +result +DropDownCustomItem::Make(int fontsize, int itemHeight) +{ + AppLogDebug("DropDownCustomItem::Make entered"); + + int xMargin = 26; + int yMargin = 22; + int subTextHeight = 42; + int mainTextHeight = itemHeight - yMargin - subTextHeight + 15; + + Tizen::Graphics::Bitmap* pDropperBitmapNormal = null; + Tizen::Graphics::Bitmap* pDropperBitmapPressed = null; + + AddElement(Rectangle(xMargin, yMargin, __width - 126, mainTextHeight), IDA_FORMAT_MAIN_STRING,__mainText, fontsize, + CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT, CUSTOM_COLOR_TRANSPARENT); + AddElement(Rectangle(xMargin, yMargin + mainTextHeight, __width - 126, subTextHeight), IDA_FORMAT_SUB_STRING,__subText, 34, CUSTOM_COLOR_GREY , CUSTOM_COLOR_LISTVIEW_TEXT, CUSTOM_COLOR_LISTVIEW_TEXT); + + 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 - 85, (__height - 64) / 2, 64, 64), IDA_FORMAT_DROPPER, *pDropperBitmapNormal, pDropperBitmapPressed, pDropperBitmapNormal); + delete pDropperBitmapNormal; + delete pDropperBitmapPressed; + } + + return E_SUCCESS; +} + +DropDownItemState +DropDownCustomItem::GetCurState(void) const +{ + return __currentState; +} + +void +DropDownCustomItem::SetCurState(const DropDownItemState state) +{ + __currentState = state; +} diff --git a/src/GlFileListEditorForm.cpp b/src/GlFileListEditorForm.cpp new file mode 100644 index 0000000..30f36f9 --- /dev/null +++ b/src/GlFileListEditorForm.cpp @@ -0,0 +1,1430 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListEditorForm.cpp + * @brief This is the implementation file for FileListEditorForm class. + */ + +#include "GlAllListEditorPanel.h" +#include "GlAllListSelectionPanel.h" +#include "GlFileListEditorForm.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlImageListEditorPanel.h" +#include "GlProgressAnimation.h" +#include "GlResourceManager.h" +#include "GlSlideSettingListener.h" +#include "GlSlideShowPopUp.h" +#include "GlTypes.h" +#include "GlVideoListEditorPanel.h" +#include "GlFileMoveTimer.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::Base::Utility; + +static const int GAP_W_POPUP_ITEM = 10; +static const int W_DELETE_POPUP = 688; +static const int H_DELETE_POPUP = 230; +static const int H_DELETE_LABEL = 80; +static const int Y_DELETE_BUTTON = 132; +static const int H_DELETE_BUTTON = 74; +static const int W_DELETE_BUTTON = 318; +static const int H_TOAST_LABEL = 48; +static const int Y_DELETE_LABEL = 32; + +static const unsigned int COLOR_DELETE_BUTTON_NORMAL = Color32<208, 82, 82>::Value; +static const unsigned int COLOR_DELETE_BUTTON_PRESSED = Color32<194, 71, 71>::Value; +static const unsigned int COLOR_DELETE_BUTTON_TEXT = Color32<248, 246, 239>::Value; + +static const String RESERVED_MEDIA_PATH = Environment::GetMediaPath(); + +FileListEditorForm::FileListEditorForm(void) + : __pShareContextMenu(null) + , __pOptionMenu(null) + , __pDeletePopup(null) + , __morePosition(Point(0, 0)) + , __pContentDirectoryList(null) + , __pContentDirectoryNameList(null) + , __pPopUp(null) + , __pFileMove(null) + , __isCopyOperation(false) + , __pPresentationModel(null) + , __isScanProgress(false) +{ + AppLogDebug("ENTER"); + _overlayMsg = false; + _pProgressAnim = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +FileListEditorForm::~FileListEditorForm(void) +{ + AppLogDebug("ENTER"); + if (__pContentDirectoryList != null) + { + __pContentDirectoryList->RemoveAll(true); + delete __pContentDirectoryList; + __pContentDirectoryList = null; + } + + if (__pPopUp != null) + { + delete __pPopUp; + __pPopUp = null; + } + + if (__pContentDirectoryNameList != null) + { + __pContentDirectoryNameList->RemoveAll(true); + delete __pContentDirectoryNameList; + __pContentDirectoryNameList = null; + } + delete __pFileMove; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +FileListEditorForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_FOOTER | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_PORTRAIT_INDICATOR_AUTO_HIDE); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListEditorForm::ShowAnimation() +{ + AppLogDebug("ENTER"); + Rectangle clientRect= GetClientAreaBounds(); + Rectangle rect(0, 0, clientRect.width, clientRect.height); + _pProgressAnim = new (std::nothrow) ProgressAnimation; + _pProgressAnim->Construct(rect); + AddControl(_pProgressAnim); + _pProgressAnim->SetShowState(true); + GetFooter()->SetEnabled(false); + _pProgressAnim->AnimationStart(); + _pProgressAnim->Draw(); + _overlayMsg = true; + AppLogDebug("EXIT"); +} + +void +FileListEditorForm::StopAnimation(void) +{ + AppLogDebug("ENTER"); + if (_pProgressAnim) + { + _pProgressAnim->AnimationStop(); + _pProgressAnim->SetShowState(false); + RemoveControl(_pProgressAnim); + GetFooter()->SetEnabled(true); + _pProgressAnim = null; + _overlayMsg = false; + } + AppLogDebug("EXIT"); +} + +result +FileListEditorForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + TryReturn(pHeader != null, E_FAILURE, "[%s] fail to get the header.", GetErrorMessage(GetLastResult())); + + SetOrientation(ORIENTATION_AUTOMATIC); + AddOrientationEventListener(*this); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + + pHeader->SetStyle(HEADER_STYLE_TITLE); + pHeader->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + + if ((__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK + && __pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_SINGLE) == false) + { + Bitmap* pNormalBitmap = ResourceManager::GetBitmapN(IDB_ICON_SELECT_ALL); + Bitmap* pPressBitmap = ResourceManager::GetBitmapN(IDB_ICON_SELECT_ALL_PRESS); + ButtonItem selectAll; + selectAll.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FILE_LIST_SELECT_ALL); + selectAll.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pNormalBitmap); + selectAll.SetIcon(BUTTON_ITEM_STATUS_PRESSED, pPressBitmap); + pHeader->SetButton(BUTTON_POSITION_LEFT, selectAll); + delete pNormalBitmap; + delete pPressBitmap; + } + + pHeader->AddActionEventListener(*this); + + InitializeFooter(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +FileListEditorForm::InitializeFooter(void) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + TryReturn(pFooter != null, E_FAILURE, "[%s] fail to get the footer.", GetErrorMessage(GetLastResult())); + pFooter->RemoveAllItems(); + + result r = E_SUCCESS; + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + + FooterItem footerConfirm; + footerConfirm.Construct(IDA_FOOTER_CONFIRM); + footerConfirm.SetText(ResourceManager::GetString(L"IDS_COM_SK_DONE")); + pFooter->AddItem(footerConfirm); + pFooter->SetItemEnabled(0, false); + pFooter->SetShowState(true); + pFooter->Invalidate(true); + } + else + { + pFooter->SetStyle(FOOTER_STYLE_SEGMENTED_TEXT); + pFooter->SetShowState(false); + pFooter->Invalidate(true); + } + + SetFormBackEventListener(this); + + } + else + { + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + SetFormMenuEventListener(this); + + FooterItem footerShare; + r = footerShare.Construct(IDA_FOOTER_SHARE); + TryReturn(r == E_SUCCESS, r, "[%s] Unable to construct footer item", GetErrorMessage(r)); + Bitmap* pBitmapShare = ResourceManager::GetBitmapN(IDB_CONTROLBAR_SHARE); + Bitmap* pBitmapShareDim = ResourceManager::GetBitmapN(IDB_CONTROLBAR_SHARE_DIM); + + if (pBitmapShare != null && pBitmapShareDim != null) + { + footerShare.SetIcon(FOOTER_ITEM_STATUS_NORMAL, pBitmapShare); + footerShare.SetIcon(FOOTER_ITEM_STATUS_DISABLED, pBitmapShareDim); + } + + r = pFooter->AddItem(footerShare); + delete pBitmapShare; + delete pBitmapShareDim; + TryReturn(r == E_SUCCESS, r, "[%s] Unable to add item", GetErrorMessage(r)); + + FooterItem footerDelete; + r = footerDelete.Construct(IDA_FOOTER_DELETE); + TryReturn(r == E_SUCCESS, r, "[%s] Unable to construct footer item", GetErrorMessage(r)); + Bitmap* pBitmapDelete = ResourceManager::GetBitmapN(IDB_CONTROLBAR_DELETE); + Bitmap* pBitmapDeleteDim = ResourceManager::GetBitmapN(IDB_CONTROLBAR_DELETE_DIM); + + if (pBitmapDelete != null && pBitmapDeleteDim != null) + { + footerDelete.SetIcon(FOOTER_ITEM_STATUS_NORMAL, pBitmapDelete); + footerDelete.SetIcon(FOOTER_ITEM_STATUS_DISABLED, pBitmapDeleteDim); + } + + r = pFooter->AddItem(footerDelete); + delete pBitmapDelete; + delete pBitmapDeleteDim; + TryReturn(r == E_SUCCESS, r, "[%s] Unable to add item", GetErrorMessage(r)); + + SetFormBackEventListener(this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + int checkedCount = 0; + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + checkedCount = pEditorPanel->GetItemCheckedCount(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + checkedCount = pSelectionPanel->GetItemCheckedCount(); + } + } + + AppLogDebug("GetItemCheckedCount(%d)", checkedCount); + + if (__pOptionMenu != null) + { + delete __pOptionMenu; + __pOptionMenu = null; + } + + __pOptionMenu = new (std::nothrow) OptionMenu(); + __pOptionMenu->Construct(); + __pOptionMenu->AddActionEventListener(*this); + + if (__pContentDirectoryNameList != null) + { + __pContentDirectoryNameList->RemoveAll(true); + delete __pContentDirectoryNameList; + __pContentDirectoryNameList = null; + } + + SetUpPopup(); + } + + pFooter->AddActionEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +String +FileListEditorForm::GetDirecotyNameFromFullPath(const String& fullPath)const +{ + AppLogDebug("ENTER"); + if (fullPath == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + while (st.HasMoreTokens()) + { + st.GetNextToken(token); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return token; +} + +result +FileListEditorForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(this); + + if (__pOptionMenu != null) + { + __pOptionMenu->RemoveActionEventListener(*this); + delete __pOptionMenu; + __pOptionMenu = null; + } + + if (__pShareContextMenu != null) + { + __pShareContextMenu->RemoveActionEventListener(*this); + delete __pShareContextMenu; + __pShareContextMenu = null; + } + + if (__pDeletePopup != null) + { + delete __pDeletePopup; + __pDeletePopup = null; + } + _overlayMsg = false; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +FileListEditorForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER(actionId=%d)", actionId); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + switch (actionId) + { + case IDA_FILE_LIST_SELECT_ALL: + SelectAllPressed(); + break; + + case IDA_FOOTER_SHARE: + { + if (__pShareContextMenu != NULL) + { + delete __pShareContextMenu; + __pShareContextMenu = null; + } + + Bitmap* pBitmapEmailContextItem = null; + Bitmap* pBitmapMessageContextItem = null; + pBitmapEmailContextItem = ResourceManager::GetBitmapN(IDB_IMAGE_CONTEXT_EMAIL_ICON); + pBitmapMessageContextItem = ResourceManager::GetBitmapN(IDB_IMAGE_CONTEXT_MESSAGE_ICON); + + __pShareContextMenu = new (std::nothrow) ContextMenu(); + __pShareContextMenu->Construct(Point(GetClientAreaBounds().width/3 + 15, GetClientAreaBounds().height), + CONTEXT_MENU_STYLE_LIST, CONTEXT_MENU_ANCHOR_DIRECTION_UPWARD); + + if ( pBitmapMessageContextItem != null) + { + __pShareContextMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_MESSAGE"), + IDA_CONTEXT_MENU_SHARE_MESSAGE, *pBitmapMessageContextItem, null, null); + delete pBitmapMessageContextItem; + } + + if ( pBitmapEmailContextItem != null) + { + __pShareContextMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EMAIL"), + IDA_CONTEXT_MENU_SHARE_EMAIL, *pBitmapEmailContextItem, null, null); + delete pBitmapEmailContextItem; + } + __pShareContextMenu->SetFocusable(true); + __pShareContextMenu->AddActionEventListener(*this); + + + Rectangle rect = source.GetBounds(); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + __pShareContextMenu->SetAnchorPosition(Point(rect.width / 8 * 3, rect.y)); + } + else + { + __pShareContextMenu->SetAnchorPosition(Point(rect.width / 8 * 3, rect.y - H_TOAST_LABEL)); + } + + __pShareContextMenu->SetShowState(true); + __pShareContextMenu->Show(); + + } + break; + + case IDA_FOOTER_DELETE: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null && pEditorPanel->GetItemCheckedCount() > 0) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + _overlayMsg = true; + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + ImageListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null && pEditorPanel->GetItemCheckedCount() > 0) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + _overlayMsg = true; + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + VideoListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null && pEditorPanel->GetItemCheckedCount() > 0) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + _overlayMsg = true; + } + } + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null && pSelectionPanel->GetItemCheckedCount() > 0) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + _overlayMsg = true; + } + } + } + break; + + case IDA_CONTEXT_MENU_MORE_EDIT: + { + break; + } + + case IDA_CONTEXT_MENU_MORE_ADD_TAG: + { + break; + } + + case IDA_CONTEXT_MENU_MORE_COPY: + + case IDA_CONTEXT_MENU_MORE_MOVE: + { + if (actionId == IDA_CONTEXT_MENU_MORE_MOVE) + { + __isCopyOperation = false; + } + else if (actionId == IDA_CONTEXT_MENU_MORE_COPY) + { + __isCopyOperation = true; + } + + RefreshFolderList(); + + __pOptionMenu->SetShowState(true); + __pOptionMenu->Show(); + + + } + break; + + case IDA_CONTEXT_MENU_MORE_SLIDE_SHOW: + { + if (__pPopUp != NULL) + { + delete __pPopUp; + __pPopUp = NULL; + } + __pPopUp = new (std::nothrow) SlideShowPopUp(); + + if (__pPopUp != null) + { + __pPopUp->Initialize(); + __pPopUp->SetEventListner(this); + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + } + break; + + case IDA_CONTEXT_MENU_SHARE_MESSAGE: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnRequestMessage(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + pSelectionPanel->OnRequestMessage(); + } + } + } + break; + + case IDA_CONTEXT_MENU_SHARE_EMAIL: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnRequestEmail(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + pSelectionPanel->OnRequestEmail(); + } + } + } + break; + + case IDA_CONTEXTMENU_EDITOR_MOVE_CREATE_ALBUM: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pListEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pListEditorPanel) + { + IList* pList = pListEditorPanel->GetItemCheckedIndexListN(); + pList->InsertAt(new (std::nothrow) Integer(ALBUM_CREATE), ALBUM_FIRST_ELEMENT); + if (__isCopyOperation) + { + pList->InsertAt(new (std::nothrow) Integer(FILE_ACTION_COPY), ALBUM_SECOND_ELEMENT); + } + else + { + pList->InsertAt(new (std::nothrow) Integer(FILE_ACTION_MOVE), ALBUM_SECOND_ELEMENT); + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_NAME_EDITOR), pList); + } + + } + else + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + IList* pList = pSelectionPanel->GetItemCheckedIndexListN(); + pList->InsertAt(new (std::nothrow) Integer(ALBUM_CREATE), ALBUM_FIRST_ELEMENT); + if (__isCopyOperation) + { + pList->InsertAt(new (std::nothrow) Integer(FILE_ACTION_COPY), ALBUM_SECOND_ELEMENT); + } + else + { + pList->InsertAt(new (std::nothrow) Integer(FILE_ACTION_MOVE), ALBUM_SECOND_ELEMENT); + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_NAME_EDITOR), pList); + } + } + } + } + break; + + case IDA_DELETE_POPUP_DEL: + { + _overlayMsg = false; + __pDeletePopup->SetShowState(false); + __pDeletePopup->Invalidate(true); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + result r = pEditorPanel->OnRequestDelete(); + if (IsFailed(r)) + { + AppLogDebug("OnRequestDelete failed with %s", GetErrorMessage(r)); + } + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + result r = pSelectionPanel->OnRequestDelete(); + if (IsFailed(r)) + { + AppLogDebug("OnRequestDelete failed with %s", GetErrorMessage(r)); + } + } + } + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + _overlayMsg = false; + __pDeletePopup->SetShowState(false); + __pDeletePopup->Invalidate(true); + } + break; + + case IDA_CONTEXT_MENU_ROTATE_LEFT: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + RotateMode rotateMode = ROTATE_MODE_LEFT; + pEditorPanel->OnRequestRotate(rotateMode); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + RotateMode rotateMode = ROTATE_MODE_LEFT; + pSelectionPanel->OnRotateRequested(rotateMode); + } + } + } + break; + + case IDA_CONTEXT_MENU_ROTATE_RIGHT: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + RotateMode rotateMode = ROTATE_MODE_RIGHT; + pEditorPanel->OnRequestRotate(rotateMode); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + RotateMode rotateMode = ROTATE_MODE_RIGHT; + pSelectionPanel->OnRotateRequested(rotateMode); + } + } + } + break; + + case IDA_FOOTER_CONFIRM: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + ImageListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnRequestAppExitWithMultipleSelectionAppControlResult(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + VideoListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnRequestAppExitWithMultipleSelectionAppControlResult(); + } + } + } + break; + + default: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + if ((IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START <= actionId) && + (actionId <= IDA_CONTEXTMENU_EDITOR_MOVE_CREATE_ALBUM + 1000)) + { + if (__pContentDirectoryList == null) + { + return; + } + if (__pContentDirectoryList->GetCount() > actionId - IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START) + { + String* pDirectory = static_cast + (__pContentDirectoryList->GetAt(actionId - IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START)); + + AllListEditorPanel* pEditorPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pEditorPanel != null) + { + delete __pFileMove; + IList* pItemIndexList = pEditorPanel->GetItemCheckedIndexListN(); + __pFileMove = new (std::nothrow) FileMoveTimer(*pDirectory, pItemIndexList, __pPresentationModel, this); + if (__isCopyOperation) + { + __pFileMove->SetCopy(); + } + + result r = __pFileMove->StartTimer(); + if (IsFailed(r)) + { + delete __pFileMove; + __pFileMove = null; + __isCopyOperation = false; + } + else + { + _overlayMsg = true; + } + } + } + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + if ((IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START <= actionId) && + (actionId <= IDA_CONTEXTMENU_EDITOR_MOVE_CREATE_ALBUM + 1000)) + { + if (__pContentDirectoryList == null) + { + + return; + } + if (__pContentDirectoryList->GetCount() > actionId - IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START) + { + String* pDirectory = static_cast + (__pContentDirectoryList->GetAt(actionId - IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START)); + + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + delete __pFileMove; + IList* pItemIndexList = pSelectionPanel->GetItemCheckedIndexListN(); + __pFileMove = new (std::nothrow) FileMoveTimer(*pDirectory, pItemIndexList, __pPresentationModel, this); + if (__isCopyOperation) + { + __pFileMove->SetCopy(); + } + result r = __pFileMove->StartTimer(); + if (IsFailed(r)) + { + delete __pFileMove; + __pFileMove = null; + __isCopyOperation = false; + } + else + { + _overlayMsg = true; + } + } + } + } + } + break; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::OnFileOpInvalidate(enum FileActionMode actionId) +{ + Invalidate(true); +} + + +void +FileListEditorForm::OnScanDirStart() +{ + AppLogDebug("ENTER"); + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, false); + __isScanProgress = true; + Invalidate(true); + AppLogDebug("EXIT"); +} +void +FileListEditorForm::OnScanDirComplete() +{ + AppLogDebug("ENTER"); + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, true); + __isScanProgress = false; + Invalidate(true); + AppLogDebug("EXIT"); +} + + +bool +FileListEditorForm::GetOverlayStatus(void) const +{ + return _overlayMsg; +} + +void +FileListEditorForm::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ + AppLogDebug("ENTER"); + _overlayMsg = false; + __pPresentationModel->SetUpdateProgressStatus(false); + if (res != COMPLETE_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_OPERATION_FAILED"), MSGBOX_STYLE_OK, 3000); + int modalResult = 0; + _overlayMsg = true; + messageBox.ShowAndWait(modalResult); + _overlayMsg = false; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST)); + } + AppLogDebug("EXIT"); +} + +void +FileListEditorForm::OnContentUpdated() +{ + AppLogDebug("ENTER"); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if(__pDeletePopup != null) + { + if(__pDeletePopup->IsVisible() == true) + { + __pDeletePopup->Destroy(); + __pDeletePopup = null; + _overlayMsg = false; + SetUpPopup(); + } + } + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->CancelUpdateProgress(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + pSelectionPanel->CancelUpdateProgress(); + } + } + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK + && pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + + } + else if (_overlayMsg == false) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +FileListEditorForm::SetUpPopup(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pDeletePopup != null) + { + delete __pDeletePopup; + __pDeletePopup = null; + } + + __pDeletePopup = new (std::nothrow) Popup(); + __pDeletePopup->Construct(false, Dimension(W_DELETE_POPUP, H_DELETE_POPUP)); + __pDeletePopup->SetPropagatedKeyEventListener(this); + + Rectangle popupClientBounds = __pDeletePopup->GetClientAreaBounds(); + + Label* pLabelText = new (std::nothrow) Label(); + pLabelText->Construct(Rectangle(0, Y_DELETE_LABEL, popupClientBounds.width, H_DELETE_LABEL), + ResourceManager::GetString(L"IDS_COM_POP_DELETE_Q")); + pLabelText->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pLabelText->SetTextConfig(34,LABEL_TEXT_STYLE_BOLD); + __pDeletePopup->AddControl(pLabelText); + + Button* pDeleteButton = new (std::nothrow) Button(); + pDeleteButton->Construct(Rectangle(popupClientBounds.width / 2 + GAP_W_POPUP_ITEM, Y_DELETE_BUTTON, W_DELETE_BUTTON, H_DELETE_BUTTON), + ResourceManager::GetString(L"IDS_COM_BODY_DELETE")); + pDeleteButton->SetColor(BUTTON_STATUS_NORMAL, COLOR_DELETE_BUTTON_NORMAL); + pDeleteButton->SetColor(BUTTON_STATUS_PRESSED, COLOR_DELETE_BUTTON_PRESSED); + pDeleteButton->SetTextColor(COLOR_DELETE_BUTTON_TEXT); + pDeleteButton->SetActionId(IDA_DELETE_POPUP_DEL); + pDeleteButton->AddActionEventListener(*this); + __pDeletePopup->AddControl(pDeleteButton); + + Button* pButtonCancel = new (std::nothrow) Button(); + pButtonCancel->Construct(Rectangle(16, Y_DELETE_BUTTON, W_DELETE_BUTTON, H_DELETE_BUTTON), + ResourceManager::GetString(L"IDS_COM_POP_CANCEL")); + pButtonCancel->SetActionId(IDA_DELETE_POPUP_CANCEL); + pButtonCancel->AddActionEventListener(*this); + __pDeletePopup->AddControl(pButtonCancel); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListEditorForm::SetTitleText(const String& titleText) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + TryReturnVoid(pHeader != null, "[%s] fail to get the header.", GetErrorMessage(GetLastResult())); + pHeader->SetTitleText(titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::RefreshFolderList(void) +{ + AppLogDebug("ENTER"); + ContentDirectory contentDirectory; + IListT* pContentTypeList = new (std::nothrow) ArrayListT(); + pContentTypeList->Add(CONTENT_TYPE_IMAGE); + pContentTypeList->Add(CONTENT_TYPE_VIDEO); + result r = contentDirectory.Construct(*pContentTypeList); + if (r != E_SUCCESS) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return; + } + delete pContentTypeList; + + if (__pContentDirectoryList != null) + { + __pContentDirectoryList->RemoveAll(true); + delete __pContentDirectoryList; + __pContentDirectoryList = null; + } + __pContentDirectoryList = contentDirectory.GetContentDirectoryPathListN(SORT_ORDER_NONE); + + if (__pContentDirectoryNameList != NULL) + { + __pContentDirectoryNameList->RemoveAll(true); + delete __pContentDirectoryNameList; + __pContentDirectoryNameList = null; + } + + __pContentDirectoryNameList = new (std::nothrow) ArrayList(SingleObjectDeleter); + String* pDirPath = null; + String* pDirName = null; + String mediaPath = RESERVED_MEDIA_PATH; + int length = mediaPath.GetLength(); + mediaPath.Remove(length-1,1); + + int loopCount = __pContentDirectoryList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pDirPath = static_cast(__pContentDirectoryList->GetAt(i)); + pDirName = new (std::nothrow) String(GetDirecotyNameFromFullPath(*pDirPath)); + + if (*pDirPath == mediaPath) + { + *pDirName = ResourceManager::GetString(L"IDS_MEDIABR_POP_NO_NAME"); + __pContentDirectoryNameList->Add(pDirName); + } + else + { + __pContentDirectoryNameList->Add(pDirName); + } + } + + __pOptionMenu->RemoveAllItems(); + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_MEDIABR_OPT_CREATE_ALBUM"), + IDA_CONTEXTMENU_EDITOR_MOVE_CREATE_ALBUM); + + loopCount = __pContentDirectoryNameList->GetCount(); + + String dirAllAlbums = L"All albums"; + + for (int i = 0; i < loopCount; ++i) + { + pDirName = static_cast(__pContentDirectoryNameList->GetAt(i)); + + if (*pDirName != __pPresentationModel->GetCurrentAlbumName() || *pDirName == dirAllAlbums) + { + __pOptionMenu->AddItem(*(new (std::nothrow) String(*pDirName)), + IDA_CONTEXTMENU_EDITOR_MOVE_ALBUM_ARRAY_START + i); + } + } + + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + + if(__isScanProgress) + { + AppLog (" Skip the call"); + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALBUM_LIST)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALBUM_LIST)); + } + } + else + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALL_LIST)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_IMAGE_LIST)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_VIDEO_LIST)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + if (__pShareContextMenu != null && __pShareContextMenu->GetShowState() == true) + { + __pShareContextMenu->SetShowState(false); + } + else + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + IList* pList = pSelectionPanel->GetItemCheckedIndexListN(); + if (pList == null) + { + pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + } + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_EDITOR, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_ADD_HISTORY, SCENE_DESTROY_OPTION_DESTROY), pList); + } + } + } + else + { + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALL_LIST)); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::SetFooterButtonsState(const bool enableState) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + TryReturnVoid(pFooter != null, "[%s] fail to get the footer.", GetErrorMessage(GetLastResult())); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (enableState == true) + { + pFooter->SetButtonEnabled(BUTTON_POSITION_LEFT, true); + pFooter->SetItemEnabled(0, true); + } + else + { + pFooter->SetButtonEnabled(BUTTON_POSITION_LEFT, false); + pFooter->SetItemEnabled(0, false); + } + } + else + { + if (enableState == true) + { + pFooter->SetItemEnabled(0, true); + pFooter->SetItemEnabled(1, true); + } + else + { + pFooter->SetItemEnabled(0, false); + pFooter->SetItemEnabled(1, false); + } + } + pFooter->RequestRedraw(true); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GetCurrentScene(); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->ChangeOrientation(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + ImageListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->ChangeOrientation(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + VideoListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->ChangeOrientation(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->ChangeOrientation(); + } + } + + if (_pProgressAnim != null) + { + _pProgressAnim->ChangeOrientation(Form::GetBounds()); + _pProgressAnim->Invalidate(true); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +FileListEditorForm::OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if(keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + _overlayMsg = false; + __pDeletePopup->SetShowState(false); + __pDeletePopup->Invalidate(true); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return false; +} + +result +FileListEditorForm::MoveToAlbum(const String& destDirectory) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + String albumName = __pPresentationModel->ConvertToAlbumName(destDirectory); + if (albumName != EMPTY_SPACE) + { + IList* pDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pDirectoryList->Add(new (std::nothrow) String(destDirectory)); + __pPresentationModel->SetCurrentAlbumInfo(albumName, *pDirectoryList); + __pPresentationModel->SetCurrentAlbumContentType(CONTENT_TYPE_ALL); + delete pDirectoryList; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST)); + r = E_SUCCESS; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListEditorForm::SelectAllPressed(void) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GetCurrentScene(); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnSelectAllPressed(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST_EDITOR) + { + ImageListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnSelectAllPressed(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST_EDITOR) + { + VideoListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnSelectAllPressed(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnSelectAllPressed(); + } + } +} + +void +FileListEditorForm::OnSlideSettingPopUpItemSelected(int index) +{ + if (__pPopUp != NULL) + { + __pPopUp->SetShowState(false); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (index == 0) + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + pEditorPanel->OnRequestSlideShow(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast + (pSceneManager->GetCurrentScene()->GetPanel()); + + if (pSelectionPanel != null) + { + pSelectionPanel->OnRequestSlideShow(); + } + } + } + else if (index == 1) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SETTING_MAIN)); + } +} + +void +FileListEditorForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveContentEventListener(this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + __pPresentationModel->AddContentEventListener(this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListEditorForm::OnFormMenuRequested (Tizen::Ui::Controls::Form &source) +{ + if(__isScanProgress) + { + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + int checkedCount = 0; + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_EDITOR) + { + AllListEditorPanel* pEditorPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditorPanel != null) + { + checkedCount = pEditorPanel->GetItemCheckedCount(); + } + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pSelectionPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pSelectionPanel != null) + { + checkedCount = pSelectionPanel->GetItemCheckedCount(); + } + } + + if (__pShareContextMenu != null && __pShareContextMenu->GetShowState() == true) + { + __pShareContextMenu->SetShowState(false); + } + + if (checkedCount < 2 && __pPresentationModel->GetCurrentAlbumName() == ALL_ALBUMS_REAL_NAME ) + { + return; // no option Menu items in this case + } + + if (checkedCount > 0) + { + if (__pOptionMenu == null) + { + return; + } + + __pOptionMenu->RemoveAllItems(); + + if ( __pPresentationModel->GetCurrentAlbumName() != ALL_ALBUMS_REAL_NAME ) + { + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_MOVE"), + IDA_CONTEXT_MENU_MORE_MOVE); + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_COM_BODY_COPY"), + IDA_CONTEXT_MENU_MORE_COPY); + } + + if (checkedCount > 1) + { + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_MEDIABR_OPT_SLIDESHOW"), + IDA_CONTEXT_MENU_MORE_SLIDE_SHOW); + } + + if ( __pPresentationModel->GetCurrentAlbumName() != ALL_ALBUMS_REAL_NAME ) + { + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_IV_OPT_ROTATE_LEFT"),IDA_CONTEXT_MENU_ROTATE_LEFT); + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_IV_OPT_ROTATE_RIGHT"),IDA_CONTEXT_MENU_ROTATE_RIGHT); + } + + __pOptionMenu->SetShowState(true); + __pOptionMenu->Show(); + } +} + +void +FileListEditorForm::SetProgressState(const bool progressState) +{ + __isScanProgress = progressState; +} diff --git a/src/GlFileListForm.cpp b/src/GlFileListForm.cpp new file mode 100644 index 0000000..95fc7b1 --- /dev/null +++ b/src/GlFileListForm.cpp @@ -0,0 +1,369 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListForm.cpp + * @brief This is the implementation file for FileListForm class. + */ + +#include "GlAlbumInfo.h" +#include "GlAllListPanel.h" +#include "GlFileListForm.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlResourceManager.h" +#include "GlSlideSettingListener.h" +#include "GlSlideShowPopUp.h" +#include "GlTypes.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; +using namespace Tizen::Content; + +FileListForm::FileListForm(void) + : __menuState(true) + , __pOptionMenu(null) + , __pPopUp(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +FileListForm::~FileListForm(void) +{ + AppLogDebug("ENTER"); + + if (__pPopUp != NULL) + { + delete __pPopUp; + __pPopUp = NULL; + } + + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +FileListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(IDL_FORM_FILE_LIST); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} +result +FileListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + TryReturn(pHeader != null, E_FAILURE, "[%s] fail to get the Header.", GetErrorMessage(GetLastResult())); + + SetFormMenuEventListener(this); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + + InitializeFooter(); + SetFormBackEventListener(this); + SetOrientation(ORIENTATION_AUTOMATIC); + AddOrientationEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +FileListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + + if (__pOptionMenu != null) + { + delete __pOptionMenu; + __pOptionMenu = null; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +FileListForm::OnContentUpdated() +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + static_cast(pSceneManager->GetCurrentScene()->GetPanel())->Refresh(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + switch (actionId) + { + case IDA_FOOTER_EDIT: + { + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_EDITOR)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_IMAGE_LIST_EDITOR)); + } + else if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_VIDEO_LIST_EDITOR)); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_EDITOR)); + } + } + break; + + case IDA_FOOTER_SLIDESHOW: + { + + if (__pPopUp != NULL) + { + delete __pPopUp; + __pPopUp = NULL; + } + __pPopUp = new (std::nothrow) SlideShowPopUp(); + + if (__pPopUp != null) + { + __pPopUp->Initialize(); + __pPopUp->SetEventListner(this); + __pPopUp->SetShowState(true); + __pPopUp->Show(); + } + } + break; + + case IDA_FOOTER_CAMERA: + { + const String mimeType = APPCONTROL_MIME_IMAGE_JPG; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_CAMERA_ALLOW_SWITCH), new (std::nothrow) String(APPCONTROL_DATA_TRUE)); + __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_CAMERA, APPCONTROL_OPERATION_ID_CREATE_CONTENT, + null, &mimeType, pDataList, this); + } + break; + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_ALBUM_LIST)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListForm::OnOrientationChanged(const Tizen::Ui::Control &source, Tizen::Ui::OrientationStatus orientationStatus) +{ + + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GetCurrentScene(); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_ALL_LIST) + { + AllListPanel* pListPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pListPanel != null) + { + pListPanel->ChangeOrientation(); + } + } +} + +result +FileListForm::InitializeFooter(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + Footer* pFooter = GetFooter(); + TryReturn(pFooter != null, E_FAILURE, "[%s] fail to get the Footer.", GetErrorMessage(GetLastResult())); + + pFooter->RemoveAllItems(); + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON); + + FooterItem itemCamera; + itemCamera.Construct(IDA_FOOTER_CAMERA); + Bitmap* pBitmapCamera = ResourceManager::GetBitmapN(IDB_CONTROLBAR_CAMERA); + if (pBitmapCamera != null) + { + itemCamera.SetIcon(FOOTER_ITEM_STATUS_NORMAL, pBitmapCamera); + } + pFooter->AddItem(itemCamera); + + delete pBitmapCamera; + + if (__pOptionMenu != null) + { + delete __pOptionMenu; + __pOptionMenu = null; + } + + __pOptionMenu = new (std::nothrow) OptionMenu(); + __pOptionMenu->Construct(); + + if (__pPresentationModel->GetCurrentAlbumContentInfoCount() > 1) + { + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_MEDIABR_OPT_SLIDESHOW"), IDA_FOOTER_SLIDESHOW); + } + + if (__pPresentationModel->GetCurrentAlbumContentInfoCount() == 0) + { + __pOptionMenu->SetEnabled(false); + } + else + { + __pOptionMenu->AddItem(ResourceManager::GetString(L"IDS_COM_HEADER_EDIT"), IDA_FOOTER_EDIT); + __pOptionMenu->AddActionEventListener(*this); + } + + pFooter->AddActionEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListForm::SetTitleText(const String& titleText) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + TryReturnVoid(pHeader != null, "[%s] fail to get the Header.", GetErrorMessage(GetLastResult())); + + if (titleText == ALL_ALBUMS_REAL_NAME) + { + String text = ResourceManager::GetString(L"IDS_MEDIABR_BODY_ALL_ALBUMS"); + pHeader->SetTitleText(text); + } + else + { + pHeader->SetTitleText(titleText); + } + + pHeader->Show(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListForm::OnSlideSettingPopUpItemSelected(int index) +{ + if (__pPopUp != NULL) + { + __pPopUp->SetShowState(false); + } + + if (index == 0) + { + result r = E_SUCCESS; + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + + for (int i = 0; i < loopCount; ++i) + { + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(i))); + } + + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_SLIDE_SHOW)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + + r = __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + } + else if (index == 1) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager", GetErrorMessage(GetLastResult())); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SETTING_MAIN)); + } +} + +void +FileListForm::SetMenuState(bool state) +{ + __menuState = state; +} + +void +FileListForm::OnFormMenuRequested (Tizen::Ui::Controls::Form &source) +{ + + if (__menuState == true) + { + InitializeFooter(); + + if (__pOptionMenu == null) + { + return; + } + + __pOptionMenu->SetShowState(true); + __pOptionMenu->Show(); + } +} + +void +FileListForm::OnAppControlCompleteResponseReceived(const AppId& appId, const Tizen::Base::String& operationId, + AppCtrlResult appControlResult, const Tizen::Base::Collection::IMap* pExtraData) +{ + AppLogDebug("OnAppControlCompleteResponseReceived : %d", appControlResult); + + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + TryReturnVoid(pGalleryApp != null, "pGalleryApp is null"); + pGalleryApp->SetFrameEnabled(true); +} diff --git a/src/GlFileListPresentationModel.cpp b/src/GlFileListPresentationModel.cpp new file mode 100644 index 0000000..17020bf --- /dev/null +++ b/src/GlFileListPresentationModel.cpp @@ -0,0 +1,1763 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileListPresentationModel.cpp + * @brief This is the implementation file for FileListPresentationModel class. + */ + +#include +#include +#include +#include "GlCommonUtil.h" +#include "GlFileListPresentationModel.h" +#include "GlContentUpdateEventListener.h" +#include "GlGalleryApp.h" +#include "GlThumbnailEvent.h" +#include "GlThumbnailEventArg.h" +#include "GlThumbnailProvider.h" +#include "GlTypes.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::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; + +static const String CONTENT_INFO_ORDER = L"ContentFileName"; + +static const int SIZE_PAGE_NO = 1; +static const int SIZE_CONUNT_PER_PAGE = 3000; +static const int SIZE_ICON_LIST_CACHE = 50; +static const int W_DURATION_TEXT = 44; +static const int H_DURATION_TEXT = 4; +static const int W_DURATION = 171; +static const int H_DURATION = 32; +static const int W_DEFAULT_THUMBNAIL = 171; +static const int H_DEFAULT_THUMBNAIL = 127; +static const int W_WIDE_THUMBNAIL = 171; +static const int H_WIDE_THUMBNAIL = 127; +static const int W_PLAY_FG = 64; +static const int H_PLAY_FG = 64; +static const int GAP_W_PLAY_FG = (W_DEFAULT_THUMBNAIL -W_PLAY_FG)/2; +static const int GAP_H_PLAY_FG = (H_DEFAULT_THUMBNAIL - H_PLAY_FG)/2; +static const int GAP_H_DURATION = H_DEFAULT_THUMBNAIL - H_DURATION; +static const int ALPHA_DURATION = 70; +static const int FONT_SIZE_DURATION = 24; +static const Dimension DIMENSION_REAL_ICON (171,127); +static const Rectangle RECTANGLE_THUMBNAIL_OFFSET_POSION (1, 1, 171, 127); +static const Rectangle RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION (1, 1, 171, 127); +static const Color COLOR_DURATION_BG (Color::GetColor(COLOR_ID_BLACK)); +static const Color COLOR_TEXT_OUTLINE (Color::GetColor(COLOR_ID_WHITE)); + +static const String RESERVED_MEDIA_PATH = Environment::GetMediaPath(); +static const String RESERVED_CAMERA_PATH = Environment::GetMediaPath() + L"Camera"; +static const String RESERVED_CAMERA_PATH_EXT = Environment::GetExternalStoragePath() + L"Camera"; +static const String RESERVED_DOWNLOAD_PATH = Environment::GetMediaPath() + L"Downloads"; + +FileListPresentationModel* FileListPresentationModel::__pPresentationModelInstance = null; +ThumbnailProvider* FileListPresentationModel::__pThumbnailProvider = null; +ThumbnailEvent* FileListPresentationModel::__pThumbnailEvent = null; +ArrayList* FileListPresentationModel::__pPresentationModelListener = null; +ArrayList* FileListPresentationModel::__pContentEventListener = null; +ArrayList* FileListPresentationModel::__pIconListViewCache = null; +IList* FileListPresentationModel::__pDirectoryList = null; +IList* FileListPresentationModel::__pContentInfoList = null; + +FileListPresentationModel::FileListPresentationModel(void) + : __pContentManager(null) + , __albumContentType(CONTENT_TYPE_ALL) + , __appControlMode(APPCONTROL_MODE_MAIN) + , __appControlMediaType(APPCONTROL_MEDIA_TYPE_IMAGE) + , __appControlSelectionMode(APPCONTROL_SELECTION_MODE_SINGLE) + , __pContentIdList(null) + , __updateProgressStatus(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +FileListPresentationModel::~FileListPresentationModel(void) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + if (__pContentIdList) + { + __pContentIdList->RemoveAll(true); + delete __pContentIdList; + __pContentIdList = null; + } + delete __pContentManager; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +FileListPresentationModel* +FileListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModelInstance == null) + { + CreateInstance(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pPresentationModelInstance; +} + +result +FileListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + + IThumbnailEventListener* pThumbnailEventListener = static_cast(this); + __pThumbnailEvent = new (std::nothrow) ThumbnailEvent(); + __pThumbnailEvent->AddListener(*pThumbnailEventListener, true); + + DeviceManager::AddDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + + ContentUpdateEventListener::GetInstance(); + __pContentManager = new (std::nothrow) ContentManager(); + __pContentManager->Construct(); + + if (__pIconListViewCache != null) + { + __pIconListViewCache->RemoveAll(true); + delete __pIconListViewCache; + __pIconListViewCache = null; + } + __pIconListViewCache = new (std::nothrow) ArrayList(SingleObjectDeleter); + __pIconListViewCache->Construct(SIZE_ICON_LIST_CACHE); + + if (__pDirectoryList != null) + { + delete __pDirectoryList; + } + __pDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + if (__pContentInfoList != null) + { + delete __pContentInfoList; + } + __pContentInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + __pPresentationModelListener = new (std::nothrow) ArrayList(); + __pPresentationModelListener->Construct(); + + __pContentEventListener = new (std::nothrow) ArrayList(); + __pContentEventListener->Construct(); + + __pThumbnailProvider = ThumbnailProvider::GetInstance(); + + GalleryApp* pApp = static_cast(GalleryApp::GetInstance()); + const IMap* pArguments = pApp->GetAppControlArguments(); + String operationId = pApp->GetAppControlOperationId(); + + if (operationId.CompareTo(APPCONTROL_OPERATION_ID_MAIN) == 0) + { + __appControlMode = APPCONTROL_MODE_MAIN; + } + else if (operationId.CompareTo(APPCONTROL_OPERATION_ID_PICK) == 0) + { + __appControlMode = APPCONTROL_MODE_PICK; + + String mimeType = pApp->GetMimeType(); + if (mimeType.IsEmpty() != true) + { + if (mimeType.StartsWith(APPCONTROL_DATA_VIDEO, 0) == true) + { + __appControlMediaType = APPCONTROL_MEDIA_TYPE_VIDEO; + } + } + if (pArguments != null) + { + const String* selectionMode = static_cast(pArguments->GetValue(String(APPCONTROL_KEY_SELECTION_MODE))); + + if (pApp->GetMimeType().StartsWith(APPCONTROL_DATA_VIDEO, 0) == true) + { + __appControlMediaType = APPCONTROL_MEDIA_TYPE_VIDEO; + } + + if (selectionMode != null && selectionMode->CompareTo(APPCONTROL_DATA_MULTIPLE) == 0) + { + __appControlSelectionMode = APPCONTROL_SELECTION_MODE_MULTIPLE; + } + } + } + else if (operationId.CompareTo(APPCONTROL_OPERATION_ID_CONFIGURE) == 0) + { + __appControlMode = APPCONTROL_MODE_SETTING; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +FileListPresentationModel::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pPresentationModelInstance = new (std::nothrow) FileListPresentationModel(); + result r = __pPresentationModelInstance->Construct(); + if (IsFailed(r) == true) + { + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListPresentationModel::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + + delete __pThumbnailEvent; + + if (__pIconListViewCache != null) + { + __pIconListViewCache->RemoveAll(true); + delete __pIconListViewCache; + __pIconListViewCache = null; + } + + if (__pDirectoryList != null) + { + delete __pDirectoryList; + __pDirectoryList = null; + } + + if (__pContentInfoList != null) + { + delete __pContentInfoList; + __pContentInfoList = null; + } + + if (__pPresentationModelListener != null) + { + delete __pPresentationModelListener; + __pPresentationModelListener = null; + } + + if (__pContentEventListener != null) + { + delete __pContentEventListener; + __pContentEventListener = null; + } + + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +String +FileListPresentationModel::GetFileNameFromFullPath(const String& fullPath, const bool withExt) const +{ + AppLogDebug("ENTER"); + if (fullPath.CompareTo(EMPTY_SPACE) == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return EMPTY_SPACE; + } + + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + while (st.HasMoreTokens()) + { + st.GetNextToken(token); + } + + if (withExt == true) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return token; + } + else + { + String subDelim(FILE_EXT_SEPARATOR); + StringTokenizer subSt(token, subDelim); + String subToken; + subSt.GetNextToken(subToken); + AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult())); + + return subToken; + } +} + +String +FileListPresentationModel::GetDirecotyNameFromFullPath(const String& fullPath)const +{ + AppLogDebug("ENTER"); + if (fullPath == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + while (st.HasMoreTokens()) + { + st.GetNextToken(token); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return token; +} + +bool +FileListPresentationModel::IsContainContentInDirectory(const String& directoryPath, ContentType contentType) const +{ + AppLogDebug("ENTER"); + IListT* pContentTypeList = new (std::nothrow) ArrayListT(); + if (&directoryPath == null || pContentTypeList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return false; + } + + if (contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_ALL) + { + pContentTypeList->Add(CONTENT_TYPE_IMAGE); + } + if (contentType == CONTENT_TYPE_VIDEO || contentType == CONTENT_TYPE_ALL) + { + pContentTypeList->Add(CONTENT_TYPE_VIDEO); + } + + ContentDirectory contentDirectory; + result r = contentDirectory.Construct(*pContentTypeList); + if (pContentTypeList != null) + { + delete pContentTypeList; + } + TryReturn(r == E_SUCCESS, false, "[%s] Unable to construct ContentDirectory", GetErrorMessage(r)); + + bool returnValue = false; + int pageNo = SIZE_PAGE_NO; + int countPerPage = SIZE_CONUNT_PER_PAGE; + + IList* pContentList = contentDirectory.GetContentDirectoryItemListN(directoryPath, pageNo, countPerPage, + CONTENT_INFO_ORDER, SORT_ORDER_ASCENDING); + + if (pContentList == null || pContentList->GetCount() <= 0) + { + returnValue = false; + } + else + { + returnValue = true; + } + + if (pContentList != null) + { + delete pContentList; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return returnValue; +} + +result +FileListPresentationModel::GetThumbnailInSyncCacheN(const int index, String*& pName, Bitmap*& pThumbnail) +{ + AppLogDebug("ENTER : index(%d)", index); + Bitmap* pOriginalBitmap = null; + Bitmap* pDestinationBitmap = null; + ContentInfo* pContentInfo = null; + + if (__pContentInfoList != null && index < __pContentInfoList->GetCount()) + { + pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + if (pContentInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + } + else + { + AppLogDebug("EXIT 2 __pContentInfoList(%x) index(%d)", __pContentInfoList, index); + return E_FAILURE; + } + + ThumbnailInfo* pThumbnailInfo = GetThumbnailInfoFromInternalBufferN(pContentInfo->GetContentId()); + if (pThumbnailInfo != null) + { + pName = new (std::nothrow) String(pThumbnailInfo->GetFilePath()); + pOriginalBitmap = pThumbnailInfo->GetBitmapN(); + } + + if ((pThumbnailInfo != null)&&(pThumbnailInfo->GetContentType() == CONTENT_TYPE_VIDEO)) + { + if (pOriginalBitmap != null) + { + pDestinationBitmap = CoverVideoOverlayedImageOnThumbnailN(*pOriginalBitmap, *pThumbnailInfo); + delete pOriginalBitmap; + } + } + else + { + pDestinationBitmap = pOriginalBitmap; + } + + if (pDestinationBitmap != null) + { + Bitmap* pThumbnailBgBitmap = ResourceManager::GetBitmapN(IDB_VIDEOTHUMBNAIL_BG); + Rectangle thumbnailRect(RECTANGLE_THUMBNAIL_OFFSET_POSION); + pDestinationBitmap->Scale(Dimension(RECTANGLE_THUMBNAIL_OFFSET_POSION.width - RECTANGLE_THUMBNAIL_OFFSET_POSION.x + , RECTANGLE_THUMBNAIL_OFFSET_POSION.height - RECTANGLE_THUMBNAIL_OFFSET_POSION.y)); + if (pThumbnailBgBitmap != null) + { + pThumbnailBgBitmap->Scale(DIMENSION_REAL_ICON); + pThumbnail = GetShadedBackgroundBitmapN(*pThumbnailBgBitmap, *pDestinationBitmap, thumbnailRect); + delete pThumbnailBgBitmap; + delete pDestinationBitmap; + } + else + { + pThumbnail = pDestinationBitmap; + } + } + else + { + pThumbnail = null; + } + + if (pThumbnailInfo != null) + { + delete pThumbnailInfo; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +FileListPresentationModel::GetThumbnailVideoInSyncCacheN(const int index, + String*& pName, Bitmap*& pThumbnail, String*& pDuration) const +{ + AppLogDebug("ENTER : index(%d)", index); + ContentInfo* pContentInfo = null; + Bitmap* pOriginalBitmap = null; + + if (__pContentInfoList != null && index < __pContentInfoList->GetCount()) + { + pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + if (pContentInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + AppLogDebug("EXIT 2 __pContentInfoList(%x) index(%d)", __pContentInfoList, index); + return E_FAILURE; + } + + ThumbnailInfo* pThumbnailInfo = GetThumbnailInfoFromInternalBufferN(pContentInfo->GetContentId()); + if (pThumbnailInfo != null) + { + pName = new (std::nothrow) String(pThumbnailInfo->GetFilePath()); + pOriginalBitmap = pThumbnailInfo->GetBitmapN(); + pDuration = new (std::nothrow) String(CommonUtil::DurationToTimeString(pThumbnailInfo->GetDuration())); + } + else + { + pName = new (std::nothrow) String(EMPTY_SPACE); + pDuration = new (std::nothrow) String(CommonUtil::DurationToTimeString(0)); + } + + if (pOriginalBitmap != null) + { + Bitmap* pThumbnailBgBitmap = ResourceManager::GetBitmapN(IDB_VIDEOTHUMBNAIL_BG); + Rectangle thumbnailRect(RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION); + pOriginalBitmap->Scale(Dimension(RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION.width - RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION.x + , RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION.height - RECTANGLE_VIDEO_THUMBNAIL_OFFSET_POSION.y)); + if (pThumbnailBgBitmap != null) + { + pThumbnailBgBitmap->Scale(Dimension(W_WIDE_THUMBNAIL, H_WIDE_THUMBNAIL)); + pThumbnail = GetShadedBackgroundBitmapN(*pThumbnailBgBitmap, *pOriginalBitmap, thumbnailRect); + delete pThumbnailBgBitmap; + } + delete pOriginalBitmap; + } + else + { + pThumbnail = null; + } + + if (pThumbnail != null) + { + pThumbnail->Scale(Dimension(W_WIDE_THUMBNAIL, H_WIDE_THUMBNAIL)); + } + + if (pThumbnailInfo != null) + { + delete pThumbnailInfo; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +FileListPresentationModel::RequestThumbnail(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + ContentInfo* pContentInfo = null; + + if (__pContentInfoList != null && index < __pContentInfoList->GetCount()) + { + pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + if (pContentInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + } + else + { + AppLogDebug("EXIT 2 __pContentInfoList(%x) index(%d)", __pContentInfoList, index); + + return; + } + + __pThumbnailProvider->RequestThumbnail(pContentInfo->GetContentId(), __pThumbnailEvent); + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::RequestThumbnail(const ContentId& contentId) +{ + __pThumbnailProvider->RequestThumbnail(contentId, __pThumbnailEvent); +} + +void +FileListPresentationModel::ClearThumbnailRequests(const bool appTerminating) +{ + AppLogDebug("ENTER"); + + if (__pThumbnailProvider != null) + { + __pThumbnailProvider->ClearThumbnailRequests(appTerminating); + } + + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::OnThumbnailReceivedN(IEventArg& eventArg) +{ + AppLogDebug("ENTER"); + + if (&eventArg != null) + { + ThumbnailEventArg* pThumbnailEventArg = static_cast(&eventArg); + if (pThumbnailEventArg == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + ThumbnailInfo* pThumbnailInfo = pThumbnailEventArg->GetThumbnailInfoN(); + if (pThumbnailInfo == null) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + bool isMatch = false; + ContentId contentId = pThumbnailInfo->GetContentId(); + + if (__pIconListViewCache != null) + { + IEnumerator* pEnum = __pIconListViewCache->GetEnumeratorN(); + Bitmap* pBitmap = null; + while (pEnum->MoveNext() == E_SUCCESS) + { + ThumbnailInfo* pTempThumbnailInfo = static_cast(pEnum->GetCurrent()); + + if (contentId == pTempThumbnailInfo->GetContentId()) + { + AppLogDebug("[CHASEFIRE] PM receive (%ls)", pThumbnailInfo->GetFilePath().GetPointer()); + pBitmap = pThumbnailInfo->GetBitmapN(); + pTempThumbnailInfo->SetBitmap(*pBitmap); + delete pBitmap; + + pTempThumbnailInfo->SetContentType(pThumbnailInfo->GetContentType()); + pTempThumbnailInfo->SetDuration(pThumbnailInfo->GetDuration()); + delete pThumbnailInfo; + isMatch = true; + break; + } + } + + delete pEnum; + + if (isMatch == false) + { + if (SIZE_ICON_LIST_CACHE <= __pIconListViewCache->GetCount()) + { + __pIconListViewCache->RemoveAt(0, true); + } + AppLogDebug("[CHASEFIRE] (all:%d) Add Thumbail(%ls)", __pIconListViewCache->GetCount(), + pThumbnailInfo->GetFilePath().GetPointer()); + __pIconListViewCache->Add(pThumbnailInfo); + } + } + + int index = -1; + int loopCount = __pContentInfoList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + if (contentId == (static_cast(__pContentInfoList->GetAt(i)))->GetContentId()) + { + index = i; + break; + } + } + + IAlbumEventListener* pInterface = null; + IEnumerator* pEventEnum = __pPresentationModelListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnThumbnailDecoded(index); + } + delete pEventEnum; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListPresentationModel::OnContentCreated(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + IFormContentUpdateEventListener* pInterface = null; + if (__pContentEventListener == null) + { + AppLogDebug("EXIT"); + return; + } + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + if (pInterface != null) + { + pInterface->OnContentUpdated(); + } + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::OnContentUpdated(const ContentId& contentId) +{ + AppLogDebug("ENTER"); + RequestThumbnail(contentId); + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + //Clear the ImageCaches when content is updated like rotate. + if (__pContentEventListener->GetCount()) + { + ClearImageCache(); + } + + IFormContentUpdateEventListener* pInterface = null; + if (__pContentEventListener == null) + { + AppLogDebug("EXIT"); + return; + } + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::OnContentDeleted(void) +{ + AppLogDebug("ENTER"); + if (__updateProgressStatus == true) + { + AppLogDebug("EXIT update in application"); + return; + } + IFormContentUpdateEventListener* pInterface = null; + if (__pContentEventListener == null) + { + AppLogDebug("EXIT"); + return; + } + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + ClearThumbnailRequests(); + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::AddPresentationModelListener(const IAlbumEventListener* listener) +{ + AppLogDebug("ENTER"); + __pPresentationModelListener->Add((Object*)listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListPresentationModel::RemovePresentationModelListener(const IAlbumEventListener& listener) +{ + AppLogDebug("ENTER"); + __pPresentationModelListener->Remove(listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +FileListPresentationModel::AddContentEventListener(const IFormContentUpdateEventListener* listener) +{ + AppLogDebug("ENTER"); + if (__pContentEventListener != null) + { + __pContentEventListener->RemoveAll(); + __pContentEventListener->Add((Object*)listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + } +} + +void +FileListPresentationModel::RemoveContentEventListener(const IFormContentUpdateEventListener* listener) +{ + AppLogDebug("ENTER"); + __pContentEventListener->Remove(*listener); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailInfo* +FileListPresentationModel::GetThumbnailInfoFromInternalBufferN(const ContentId& contentId) const +{ + AppLogDebug("ENTER"); + ThumbnailInfo* pThumbnailInfo = null; + ThumbnailInfo* pTempThumbnailInfo = null; + if (__pIconListViewCache != null) + { + int loopCount = __pIconListViewCache->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pTempThumbnailInfo = static_cast(__pIconListViewCache->GetAt(i)); + if (contentId == pTempThumbnailInfo->GetContentId()) + { + + pThumbnailInfo = new (std::nothrow) ThumbnailInfo(); + Bitmap* pBitmap = pTempThumbnailInfo->GetBitmapN(); + pThumbnailInfo->Construct(pTempThumbnailInfo->GetContentId(), pTempThumbnailInfo->GetFilePath(), + *pBitmap, pTempThumbnailInfo->GetContentType(), pTempThumbnailInfo->GetDuration()); + delete pBitmap; + break; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pThumbnailInfo; +} + +void +FileListPresentationModel::ShowAnimation(void) +{ + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->ShowAnimation(); + } + delete pEventEnum; +} + +void +FileListPresentationModel::StopAnimation(void) +{ + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->StopAnimation(); + } + delete pEventEnum; +} +result +FileListPresentationModel::DeleteContentFileList(const IList& contentIndexList) +{ + AppLogDebug("ENTER"); + if (&contentIndexList == null || contentIndexList.GetCount() <= 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; + } + + IList * pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + int loopCount = contentIndexList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + const Integer* pIndex = static_cast(contentIndexList.GetAt(i)); + + if ((pIndex != null) && (pIndex->ToInt())>=0 && __pContentInfoList->GetCount() > pIndex->ToInt()) + { + pContentIdList->Add(new (std::nothrow) ContentId((static_cast + (__pContentInfoList->GetAt(pIndex->ToInt())))->GetContentId())); + } + } + + loopCount = pContentIdList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + ContentId* pContentId = static_cast(pContentIdList->GetAt(i)); + if (pContentId != null) + { + ContentInfo* cntInfo = __pContentManager->GetContentInfoN(*pContentId); + if (cntInfo) + { + String filePath = cntInfo->GetContentPath(); + delete cntInfo; + DeleteContentFile(filePath); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +IList* +FileListPresentationModel::GetCollisionIndexListN(const IList& contentIndexList, const String& destDirectory) +{ + AppLogDebug("ENTER"); + if (&contentIndexList == null || contentIndexList.GetCount() <= 0 || &destDirectory == null + || destDirectory.IsEmpty() == true) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + if (File::IsFileExist(destDirectory) == false) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + IList * pCollisionInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter); + ContentInfo* pContentInfo = null; + int loopCount = contentIndexList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + const Integer* pIndex = static_cast(contentIndexList.GetAt(i)); + + if ((pIndex != null) && (pIndex->ToInt()) >= 0 && __pContentInfoList->GetCount() > pIndex->ToInt()) + { + pContentInfo = const_cast(static_cast(__pContentInfoList->GetAt(pIndex->ToInt()))); + String filePath = pContentInfo->GetContentPath(); + String fileName = GetFileNameFromFullPath(filePath, true); + + String destPath; + if (destDirectory.EndsWith(DIRECTORY_SEPARATOR) == true) + { + destPath.Append(destDirectory); + destPath.Append(fileName); + } + else + { + destPath.Append(destDirectory); + destPath.Append(DIRECTORY_SEPARATOR); + destPath.Append(fileName); + } + + if (File::IsFileExist(destPath) == true) + { + pCollisionInfoList->Add(*(new (std::nothrow) String(pIndex->ToString() + MULTI_ITEM_SEPARATOR + fileName))); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pCollisionInfoList; +} + +result +FileListPresentationModel::MoveToContentFileList(const IList& contentIndexList, const String& destDirectory) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (&contentIndexList == null || contentIndexList.GetCount() <= 0 || &destDirectory == null || destDirectory.IsEmpty() == true) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return r; + } + + if (File::IsFileExist(destDirectory) == false) + { + Directory::Create(destDirectory, true); + } + + delete __pContentIdList; + __pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + int loopCount = contentIndexList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + const Integer* pIndex = static_cast(contentIndexList.GetAt(i)); + + if ((pIndex != null) && (pIndex->ToInt())>=0 && __pContentInfoList->GetCount() > pIndex->ToInt()) + { + __pContentIdList->Add(new (std::nothrow) ContentId((static_cast(__pContentInfoList->GetAt(pIndex->ToInt())))->GetContentId())); + } + } + + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +FileListPresentationModel::DeleteContentFile(const String& filePath) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + r = File::Remove(filePath); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +FileListPresentationModel::MoveToContentFile(const String& filePath, const String& destDirectory, const bool isCopyOperation) +{ + AppLogDebug("ENTER"); + if (destDirectory.IsEmpty() == true) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + result r = E_SUCCESS; + + if (filePath.GetLength() < 4) + { + AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + + String destPath; + if (destDirectory.EndsWith(DIRECTORY_SEPARATOR) == true) + { + destPath.Append(destDirectory); + destPath.Append(GetFileNameFromFullPath(filePath, true)); + } + else + { + destPath.Append(destDirectory); + destPath.Append(DIRECTORY_SEPARATOR); + destPath.Append(GetFileNameFromFullPath(filePath, true)); + } + + if (destPath.CompareTo(filePath) == 0) + { + AppLogDebug("EXIT 4(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + + while (File::IsFileExist(destPath) == true) + { + int index = 0; + r = destPath.IndexOf(FILE_EXT_SEPARATOR, 0, index); + if (!IsFailed(r)) + { + if (index < 0) + { + return E_FAILURE; + } + else + { + destPath.Insert(Math::Rand()%10, index); + } + } + else + { + return E_FAILURE; + } + } + + r = File::Copy(filePath, destPath, false); + + if (r == E_STORAGE_FULL) + { + File::Remove(destPath); + } + + if (r == E_SUCCESS) + { + if (isCopyOperation == false) + { + File::Remove(filePath); // if Move Op remove original file + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListPresentationModel::ClearProviderId(void) +{ + __providerId.Clear(); +} + +result +FileListPresentationModel::StartAppControl(const String& providerId, const String& operationId, + const String* pUriData, const Tizen::Base::String* pMimeType, const HashMap* pDataList, + IAppControlResponseListener* pListener) +{ + AppLogDebug("ENTER"); + AppControl* pAc = AppManager::FindAppControlN(providerId, operationId); + + ClearProviderId(); + __providerId.Append(providerId); + + if (pAc == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + result r = pAc->Start(pUriData, pMimeType, pDataList, pListener); + + if (r == E_SUCCESS) + { + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + pGalleryApp->SetFrameEnabled(false); + } + + delete pAc; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +FileListPresentationModel::SetCurrentAlbumInfo(const String& albumName, const IList& directoryList) +{ + AppLogDebug("ENTER"); + + if (&directoryList != null) + { + if (__pDirectoryList != null && __pDirectoryList->GetCount() > 0) + { + bool isMatched = false; + int outterLoopCount = __pDirectoryList->GetCount(); + int innerLoopCount = 0; + for (int i = 0; i < outterLoopCount; ++i) + { + isMatched = false; + innerLoopCount = directoryList.GetCount(); + for (int j = 0; j < innerLoopCount; ++j) + { + if (static_cast(__pDirectoryList->GetAt(i))->CompareTo( + *(const_cast(static_cast(directoryList.GetAt(j))))) == 0) + { + isMatched = true; + break; + } + } + } + + outterLoopCount = directoryList.GetCount(); + for (int i = 0; i < outterLoopCount; ++i) + { + isMatched = false; + innerLoopCount = __pDirectoryList->GetCount(); + for (int j = 0; j < innerLoopCount; ++j) + { + if (const_cast(static_cast(directoryList.GetAt(i)))->CompareTo( + *(static_cast(__pDirectoryList->GetAt(j)))) == 0) + { + isMatched = true; + break; + } + } + } + } + } + + __albumName = albumName; + __providerId.Clear(); + + if (__pDirectoryList != null) + { + delete __pDirectoryList; + } + __pDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + int loopCount = directoryList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + __pDirectoryList->Add(new (std::nothrow) String(*(const_cast + (static_cast(directoryList.GetAt(i)))))); + } + + if (__pContentInfoList != null) + { + delete __pContentInfoList; + __pContentInfoList = null; + } + + if (GetAppControlMode() == APPCONTROL_MODE_PICK) + { + AppControlMediaType appControlMediaType = GetAppControlMediaType(); + if (appControlMediaType == APPCONTROL_MEDIA_TYPE_IMAGE) + { + __albumContentType = CONTENT_TYPE_IMAGE; + } + else if (appControlMediaType == APPCONTROL_MEDIA_TYPE_VIDEO) + { + __albumContentType = CONTENT_TYPE_VIDEO; + } + } + __pContentInfoList = GetContentInfoListInDirectoryListN(*__pDirectoryList, __albumContentType); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +FileListPresentationModel::RefreshCurrentAlbumContentInfoList(const ContentType contentType) +{ + AppLogDebug("ENTER"); + result r = RefreshContentInfoList(contentType); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +FileListPresentationModel::AddDirectoryIfNew(const String& dirName) +{ + + bool isMatched = false; + int dirCount = __pDirectoryList->GetCount(); + String fullDirName; + fullDirName = Environment::GetMediaPath(); + fullDirName.Append(dirName); + + if (__albumName != ALL_ALBUMS_REAL_NAME) //we are not in All albums + { + return; + } + + for (int i = 0; i < dirCount; ++i) + { + if (static_cast(__pDirectoryList->GetAt(i))->CompareTo(fullDirName) == 0) + { + isMatched = true; + break; + } + } + + if (!isMatched) + { + __pDirectoryList->Add(new (std::nothrow) String(fullDirName)); + } +} + +result +FileListPresentationModel::RefreshContentInfoList(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if ((contentType != CONTENT_TYPE_ALL) && (contentType != CONTENT_TYPE_IMAGE) && (contentType != CONTENT_TYPE_VIDEO)) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; + } + + if ((__pDirectoryList == null) || (__pDirectoryList->GetCount() <= 0)) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; + } + + __albumContentType = contentType; + + if (__pContentInfoList != null) + { + delete __pContentInfoList; + __pContentInfoList = null; + } + + __pContentInfoList = GetContentInfoListInDirectoryListN(*__pDirectoryList, __albumContentType); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +String +FileListPresentationModel::GetCurrentAlbumName(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __albumName; +} + +void +FileListPresentationModel::SetCurrentAlbumName(const String& albumName) +{ + AppLogDebug("ENTER"); + if (&albumName == null) + { + __albumName = EMPTY_SPACE; + } + else + { + __albumName = albumName; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ContentType +FileListPresentationModel::GetCurrentAlbumContentType(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __albumContentType; +} + +void +FileListPresentationModel::SetCurrentAlbumContentType(const ContentType contentType) +{ + AppLogDebug("ENTER"); + __albumContentType = contentType; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +IList* +FileListPresentationModel::GetAlbumDirectoryListN(void) const +{ + AppLogDebug("ENTER"); + IList* pAlbumDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (__pDirectoryList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return pAlbumDirectoryList; + } + + String* pDirectory = null; + int loopCount = __pDirectoryList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pDirectory = static_cast(__pDirectoryList->GetAt(i)); + pAlbumDirectoryList->Add(new (std::nothrow) String(*pDirectory)); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pAlbumDirectoryList; +} + +IList* +FileListPresentationModel::GetAlbumContentInfoList(void) const +{ + AppLogDebug("ENTER"); + IList* pContentList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (__pContentInfoList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return pContentList; + } + + ContentInfo* pContentInfo = null; + int loopCount = __pContentInfoList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pContentInfo = static_cast(__pContentInfoList->GetAt(i)); + pContentList->Add(pContentInfo); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pContentList; +} + +ContentInfo* +FileListPresentationModel::GetContentInfo(const int index) const +{ + AppLogDebug("ENTER"); + if (__pContentInfoList == null || __pContentInfoList->GetCount() == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + if (index < 0 || index >= __pContentInfoList->GetCount()) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + ContentInfo* pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pContentInfo; +} + +IList* FileListPresentationModel::GetContentIdListAtIndexN(const IList& indexList) const +{ + AppLogDebug("ENTER"); + IList* pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + int loopCount = indexList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + const Integer* pIndex = static_cast(indexList.GetAt(i)); + + if ((pIndex != null) && (pIndex->ToInt())>=0 && __pContentInfoList->GetCount() > pIndex->ToInt()) + { + ContentInfo* pContentInfo = const_cast(static_cast(__pContentInfoList->GetAt(pIndex->ToInt()))); + pContentIdList->Add(new (std::nothrow) ContentId(pContentInfo->GetContentId())); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return pContentIdList; +} + +int +FileListPresentationModel::GetCurrentAlbumContentInfoCount(void) const +{ + AppLogDebug("ENTER"); + if (__pContentInfoList == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return 0; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pContentInfoList->GetCount(); +} + +ContentId +FileListPresentationModel::GetContentInfoIndex(const int index) const +{ + AppLogDebug("ENTER"); + if (__pContentInfoList == null || __pContentInfoList->GetCount() == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return 0; + } + + if (index < 0 || index >= __pContentInfoList->GetCount()) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return 0; + } + ContentInfo* pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + ContentId contentId = pContentInfo->GetContentId(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return contentId; +} + +String +FileListPresentationModel::GetContentFilePath(const int index) const +{ + AppLogDebug("ENTER index(%d)", index); + if (__pContentInfoList == null || __pContentInfoList->GetCount() == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return EMPTY_SPACE; + } + + if (index < 0 || index >= __pContentInfoList->GetCount()) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return EMPTY_SPACE; + } + + ContentInfo* pContentInfo = static_cast(__pContentInfoList->GetAt(index)); + String contentPath = pContentInfo->GetContentPath(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return contentPath; +} + +Bitmap* +FileListPresentationModel::CoverVideoOverlayedImageOnThumbnailN(Bitmap& thumbnail, + const ThumbnailInfo& thumbmailInfo) +{ + AppLogDebug("ENTER"); + Bitmap* pOverlayedImage = null; + + if (&thumbmailInfo != null) + { + long duration = thumbmailInfo.GetDuration(); + + Canvas mainCanvas; + if (&thumbnail != null) + { + BufferInfo bufferInfo; + thumbnail.Lock(bufferInfo, INFINITE); + thumbnail.Unlock(); + mainCanvas.Construct(bufferInfo); + } + else + { + Rectangle mainRect(0, 0, W_DEFAULT_THUMBNAIL, H_DEFAULT_THUMBNAIL); + mainCanvas.Construct(mainRect); + mainCanvas.FillRectangle(Color::GetColor(COLOR_ID_BLACK), mainRect); + } + + Rectangle playRect(GAP_W_PLAY_FG, GAP_H_PLAY_FG, W_PLAY_FG, H_PLAY_FG); + Bitmap* playBitmap = ResourceManager::GetBitmapN(IDB_VIDEOTHUMBNAIL_PLAY); + if (playBitmap != null) + { + mainCanvas.DrawBitmap(playRect, *playBitmap); + delete playBitmap; + } + + Canvas durCanvas; + Rectangle durSize(0, 0, W_DURATION, H_DURATION); + Rectangle durRect(0, GAP_H_DURATION, W_DURATION, H_DURATION); + Color durColor(COLOR_DURATION_BG); + durColor.SetAlpha(ALPHA_DURATION); + durCanvas.Construct(durSize); + durCanvas.FillRectangle(durColor, durSize); + Font durFont; + durFont.Construct(FONT_STYLE_PLAIN, FONT_SIZE_DURATION); + durCanvas.SetFont(durFont); + durCanvas.DrawText(Point(W_DURATION_TEXT, H_DURATION_TEXT), + CommonUtil::DurationToTimeString(duration), COLOR_TEXT_OUTLINE); + Bitmap durBitmap; + durBitmap.Construct(durCanvas, durCanvas.GetBounds()); + mainCanvas.DrawBitmap(durRect, durBitmap); + + pOverlayedImage = new (std::nothrow) Bitmap(); + pOverlayedImage->Construct(mainCanvas, mainCanvas.GetBounds()); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pOverlayedImage; +} + +Bitmap* +FileListPresentationModel::GetShadedBackgroundBitmapN(Bitmap& bgBitmap, + const Bitmap& originalBitmap, const Rectangle& originalBitmapPosition) const +{ + AppLogDebug("ENTER"); + if (&originalBitmap == null || &originalBitmap == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return null; + } + + BufferInfo bufferInfo; + bgBitmap.Lock(bufferInfo, INFINITE); + bgBitmap.Unlock(); + Canvas mainCanvas; + mainCanvas.Construct(bufferInfo); + mainCanvas.Clear(); + mainCanvas.DrawBitmap(originalBitmapPosition, originalBitmap); + + Bitmap* pMainImage = new (std::nothrow) Bitmap(); + pMainImage->Construct(mainCanvas,mainCanvas.GetBounds()); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pMainImage; +} + +IList* +FileListPresentationModel::GetContentInfoListInDirectoryListN(const IList& contentDirectoryList, + ContentType contentType)const +{ + AppLogDebug("ENTER"); + IList* pContentList = new (std::nothrow) ArrayList(SingleObjectDeleter); + + if ((&contentDirectoryList == null) || (contentDirectoryList.GetCount() == 0) + || ((contentType != CONTENT_TYPE_IMAGE) && (contentType != CONTENT_TYPE_VIDEO) && (contentType != CONTENT_TYPE_ALL))) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return pContentList; + } + + ContentDirectory contentDirectory; + IListT* pContentTypeList = new (std::nothrow) ArrayListT(); + if (contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_ALL) + { + pContentTypeList->Add(CONTENT_TYPE_IMAGE); + } + if (contentType == CONTENT_TYPE_VIDEO || contentType == CONTENT_TYPE_ALL) + { + pContentTypeList->Add(CONTENT_TYPE_VIDEO); + } + result r = contentDirectory.Construct(*pContentTypeList); + delete pContentTypeList; + + if (r == E_SUCCESS) + { + int pageNo = SIZE_PAGE_NO; + int countPerPage = SIZE_CONUNT_PER_PAGE; + String* pContentDirectory = null; + + int loopCount = contentDirectoryList.GetCount(); + for (int i = 0; i < loopCount; ++i) + { + IList* pIList = null; + pContentDirectory = const_cast(static_cast(contentDirectoryList.GetAt(i))); + if (pContentDirectory != null) + { + pIList = contentDirectory.GetContentDirectoryItemListN(*pContentDirectory, pageNo, countPerPage, + CONTENT_INFO_ORDER, SORT_ORDER_NONE); + + if (pIList != null) + { + pContentList->AddItems(*pIList); + } + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pContentList; +} + +String +FileListPresentationModel::ConvertToAlbumName(const String& targetPath)const +{ + AppLogDebug("ENTER"); + String albumName; + if (&targetPath == null || targetPath.GetLength() == 0) + { + return albumName; + } + + String mediaPath = RESERVED_MEDIA_PATH; + int length = mediaPath.GetLength(); + mediaPath.Remove(length-1,1); + + + if (targetPath == RESERVED_CAMERA_PATH || targetPath == RESERVED_CAMERA_PATH_EXT) + { + albumName = ResourceManager::GetString(L"IDS_MEDIABR_BODY_CAMERA_ROLL_ABB"); + } + else if (targetPath == RESERVED_DOWNLOAD_PATH) + { + albumName = ResourceManager::GetString(L"IDS_COM_BODY_DOWNLOADS"); + } + else if (targetPath == mediaPath) + { + + albumName = ResourceManager::GetString(L"IDS_MEDIABR_POP_NO_NAME"); + } + else + { + String directoryName = GetDirecotyNameFromFullPath(targetPath); + albumName = directoryName; + } + + return albumName; +} + +AppControlMode +FileListPresentationModel::GetAppControlMode(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + + return __appControlMode; +} + +AppControlMediaType +FileListPresentationModel::GetAppControlMediaType(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + + return __appControlMediaType; +} + +AppControlSelectionMode +FileListPresentationModel::GetAppControlSelectionMode(void) const +{ + AppLogDebug("Enter"); + AppLogDebug("Exit"); + + return __appControlSelectionMode; +} + +void +FileListPresentationModel::SetUpdateProgressStatus(const bool status) +{ + AppLogDebug("ENTER status = %d",status); + __updateProgressStatus = status; + AppLogDebug("EXIT"); +} + +result +FileListPresentationModel::RotateImage(const Tizen::Content::ContentId& contentId, RotateMode rotateMode) +{ + result r = E_SUCCESS; + ImageBuffer rotateBuffer; + ImageBuffer* pRotatedBuffer = null; + ImageFormat imageFormat; + Image img; + ContentInfo* cntInfo = __pContentManager->GetContentInfoN(contentId); + if (!cntInfo) + { + return E_FAILURE; + } + String filePath = cntInfo->GetContentPath(); + delete cntInfo; + + ContentType contentType = ContentManagerUtil::CheckContentType(filePath); + if (contentType == CONTENT_TYPE_VIDEO) + { + return r; + } + + r = img.Construct(); + + if (r == E_SUCCESS) + { + imageFormat = img.GetImageFormat(filePath); + + r = rotateBuffer.Construct(filePath); + if (r == E_SUCCESS) + { + if (rotateMode == ROTATE_MODE_RIGHT) + { + pRotatedBuffer = rotateBuffer.RotateN(IMAGE_ROTATION_90); + } + else + { + pRotatedBuffer = rotateBuffer.RotateN(IMAGE_ROTATION_270); + } + } + + if (pRotatedBuffer != null) + { + r = pRotatedBuffer->EncodeToFile(filePath, imageFormat, true, 100); + delete pRotatedBuffer; + ContentManager::ScanFile(filePath); + } + } + + return r; +} + +void +FileListPresentationModel::ClearImageCache(void) +{ + AppLogDebug("ENTER"); + + if(__pIconListViewCache != null) + { + bool clearThumbnailReq = true; + while(__pIconListViewCache->GetCount() != 0) + { + //This is to Clear the Thumbnail Reuqests only Once + if(clearThumbnailReq == true) + { + ClearThumbnailRequests(); + clearThumbnailReq = false; + } + __pIconListViewCache->RemoveAt(0, true); + } + } + AppLogDebug("EXIT"); +} + +void +FileListPresentationModel::OnDeviceStateChanged(DeviceType deviceType, const Tizen::Base::String& state) +{ + AppLogDebug("ENTER"); + if (deviceType == DEVICE_TYPE_STORAGE_CARD && state == DEVICE_STORAGE_CARD_UNMOUNTED) + { + IFormContentUpdateEventListener* pInterface = null; + IEnumerator* pEventEnum = __pContentEventListener->GetEnumeratorN(); + while (pEventEnum->MoveNext() == E_SUCCESS) + { + pInterface = static_cast(pEventEnum->GetCurrent()); + pInterface->OnContentUpdated(); + } + delete pEventEnum; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlFileMoveTimer.cpp b/src/GlFileMoveTimer.cpp new file mode 100644 index 0000000..818436f --- /dev/null +++ b/src/GlFileMoveTimer.cpp @@ -0,0 +1,282 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 FileMoveTimer.cpp + * @brief This is the source file for FileMoveTimer class. + */ + +#include +#include +#include +#include +#include + +#include "GlFileListPresentationModel.h" +#include "GlFileMoveTimer.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Io; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FileMoveTimer::FileMoveTimer(String& destDirectory, IList* list, FileListPresentationModel* presentationModel, + IFileOpInvalidateListener* pInvalidate, bool isCopyOperation) + : GlTimerBase(pInvalidate, FILE_ACTION_MOVE) + , __pMoveIndexList(list) + , __moveToDir(destDirectory) + , __isCopyOperation(false) + , __pPresentationModel(presentationModel) + , __scanDirMap(SingleObjectDeleter) + , __pContentManager(null) +{ + AppLogDebug("ENTER"); + __scanDirMap.Construct(); + DeviceManager::AddDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + AppLogDebug("EXIT"); +} + +FileMoveTimer::~FileMoveTimer(void) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + ScanDirectories(); + delete __pMoveIndexList; + delete __pContentManager; + AppLogDebug("EXIT"); +} + +IList * +FileMoveTimer::TimerStart(void) +{ + AppLogDebug("ENTER"); + if (&__moveToDir == null || __moveToDir.IsEmpty()) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + if (__pMoveIndexList == null || __pMoveIndexList->GetCount() <= 0) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + if (__pMoveIndexList->GetCount() > 0) + { + __pContentManager = new (std::nothrow) ContentManager(); + __pContentManager->Construct(); + if (__isCopyOperation == true) + { + SetActionMode(FILE_ACTION_COPY); + } + if (File::IsFileExist(__moveToDir) == false) + { + result r = Directory::Create(__moveToDir, true); + AppLog("The directory create result is 2(%s)", GetErrorMessage(r)); + + if ( r == E_STORAGE_FULL) + { + return null; + } + + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + IList* pCntIdList = __pPresentationModel->GetContentIdListAtIndexN(*__pMoveIndexList); + return pCntIdList; + } + else + { + return null; + } +} + +result +FileMoveTimer::TimerExpired(const Object* contentId) +{ + AppLogDebug("ENTER"); + const ContentId* cntId = static_cast(contentId); + if(cntId == null) + { + return E_FAILURE; + } + ContentInfo* cntInfo = __pContentManager->GetContentInfoN(*cntId); + if (cntInfo) + { + String filePath = cntInfo->GetContentPath(); + delete cntInfo; + result r = __pPresentationModel->MoveToContentFile(filePath, __moveToDir, __isCopyOperation); + if (!IsFailed(r)) + { + if (__isCopyOperation == false) + { + //For Move operation, add the directory being moved from for scanning + String dirPath; + int index =0; + result r = filePath.LastIndexOf(DIRECTORY_SEPARATOR, filePath.GetLength() - 1, index); + TryReturn(r == E_SUCCESS, false, "[%s] Unable to get Dirpath", GetErrorMessage(r)); + filePath.SubString(0, index, dirPath); + if(!__scanDirMap.ContainsKey(dirPath)) + { + __scanDirMap.Add(new String(dirPath), new Integer(0)); + } + } + if (!__scanDirMap.ContainsKey(__moveToDir)) + { + __scanDirMap.Add(new String(__moveToDir), new Integer(0)); + } + } + return r; + } + return E_FAILURE; +} + +result +FileMoveTimer::ScanDirectories(void) +{ + AppLogDebug("ENTER"); + RequestId reqId; + result r = E_FAILURE; + if (__scanDirMap.GetCount() > 0) + { + AppLogDebug("Print AlbumScanMoveToDirPath 2(%d)", __scanDirMap.GetCount()); + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + r = ContentManager::ScanDirectory(*(pKey), true, null, reqId); + } + __scanDirMap.RemoveAll(); + delete pMapEnum; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return r; +} + +void +FileMoveTimer::TimerCancel(int, enum FileActionCancelRes res) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + if (res == CANCEL_USER || (res == CANCEL_SYS_ERROR && GetMovedCount() > 0) ) + { + String albumName = __pPresentationModel->ConvertToAlbumName(__moveToDir); + + if (albumName != EMPTY_SPACE) + { + IList* pDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pDirectoryList->Add(new (std::nothrow) String(__moveToDir)); + __pPresentationModel->SetCurrentAlbumInfo(albumName, *pDirectoryList); + __pPresentationModel->SetCurrentAlbumContentType(CONTENT_TYPE_ALL); + delete pDirectoryList; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST)); + } + } + else if (res == CANCEL_SYS_ERROR && GetMovedCount() == 0) + { + if (__isCopyOperation == true) + { + MessageBox messageBox; + messageBox.Construct(L"", L"Unable to copy files.", + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + } + AppLogDebug("EXIt"); +} + +int +FileMoveTimer::GetDirScanCount() +{ + AppLogDebug("ENTER"); + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + if (File::IsFileExist(*pKey) == false) + { + __scanDirMap.Remove(*pKey); + } + } + delete pMapEnum; + return __scanDirMap.GetCount(); +} + +void +FileMoveTimer::TimerComplete(int, enum FileActionCompleteRes res) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + String albumName = __pPresentationModel->ConvertToAlbumName(__moveToDir); + + if (albumName != EMPTY_SPACE) + { + IList* pDirectoryList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pDirectoryList->Add(new (std::nothrow) String(__moveToDir)); + __pPresentationModel->SetCurrentAlbumInfo(albumName, *pDirectoryList); + __pPresentationModel->SetCurrentAlbumContentType(CONTENT_TYPE_ALL); + delete pDirectoryList; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST)); + } + AppLogDebug("EXIt"); +} + +void +FileMoveTimer::SetCopy(void) +{ + __isCopyOperation = true; +} + +void +FileMoveTimer::ClearCopy(void) +{ + __isCopyOperation = false; +} + + +void +FileMoveTimer::OnDeviceStateChanged(DeviceType deviceType, const Tizen::Base::String& state) +{ + AppLogDebug("ENTER"); + if (deviceType == DEVICE_TYPE_STORAGE_CARD && state == DEVICE_STORAGE_CARD_UNMOUNTED) + { + String sdcPath = Environment::GetExternalStoragePath(); + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + if (pKey->StartsWith(sdcPath, 0)) + { + __scanDirMap.Remove(*pKey); + } + } + delete pMapEnum; + } + AppLogDebug("EXIT"); +} diff --git a/src/GlFileUpdateTimer.cpp b/src/GlFileUpdateTimer.cpp new file mode 100644 index 0000000..1ef83cc --- /dev/null +++ b/src/GlFileUpdateTimer.cpp @@ -0,0 +1,211 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFileUpdateTimer.cpp + * @brief This is the source file for FileUpdateTimer class. + */ + +#include + +#include "GlFileUpdateTimer.h" +#include "GlFileListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Io; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FileUpdateTimer::FileUpdateTimer(Tizen::Base::Collection::IList* pDelList + , IContentFileUpdateManager* pFDM + , IFileOpInvalidateListener* invalidate + , FileActionMode actionId + , RotateMode rotateMode) + : GlTimerBase(invalidate, actionId) + , __pUpdateIndexList(pDelList) + , __pFileUpdateManager(pFDM) + , __rotateMode(rotateMode) + , __scanDirMap(SingleObjectDeleter) + , __pContentManager(null) +{ + __scanDirMap.Construct(); + DeviceManager::AddDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); +} + +FileUpdateTimer::~FileUpdateTimer(void) +{ + AppLogDebug("ENTER"); + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); + ScanDirectories(); + delete __pUpdateIndexList; + delete __pContentManager; + AppLogDebug("EXIT"); +} + +IList * +FileUpdateTimer::TimerStart(void) +{ + AppLogDebug("ENTER"); + __pContentManager = new (std::nothrow) ContentManager(); + __pContentManager->Construct(); + IList* pCntIdList = __pFileUpdateManager->GetContentIdListAtIndexN(*__pUpdateIndexList); + AppLogDebug("EXIT"); + return pCntIdList; +} + +result +FileUpdateTimer::TimerExpired(const Object* contentId) +{ + AppLogDebug("ENTER"); + if (_actionId == FILE_ACTION_DELETE) + { + const ContentId* cntId = static_cast(contentId); + if(cntId == null) + { + return E_FAILURE; + } + ContentInfo* cntInfo = __pContentManager->GetContentInfoN(*cntId); + if (cntInfo) + { + String filePath = cntInfo->GetContentPath(); + delete cntInfo; + result r = __pFileUpdateManager->DeleteContentFile(filePath); + if (!IsFailed(r)) + { + String dirPath; + int index =0; + result r = filePath.LastIndexOf(DIRECTORY_SEPARATOR, filePath.GetLength() - 1, index); + TryReturn(r == E_SUCCESS, false, "[%s] Unable to get Dirpath", GetErrorMessage(r)); + filePath.SubString(0, index, dirPath); + if(!__scanDirMap.ContainsKey(dirPath)) + { + __scanDirMap.Add(new String(dirPath), new Integer(0)); + } + } + return r; + } + else + { + return E_FAILURE; + } + } + else + { + result r = E_SUCCESS; + const ContentId* cntId = static_cast(contentId); + if (contentId != null) + { + r = __pFileUpdateManager->RotateImage(*cntId, __rotateMode); + if ( r == E_SUCCESS ) + { + __pFileUpdateManager->RequestThumbnail(*cntId); // do not request thumbnail for video files + } + else + { + return r; + } + } + return r; + } + AppLogDebug("EXIT"); +} + +result +FileUpdateTimer::ScanDirectories(void) +{ + AppLogDebug("ENTER"); + RequestId reqId; + result r = E_SUCCESS; + if (_actionId == FILE_ACTION_DELETE) + { + int scanCount = __scanDirMap.GetCount(); + if( scanCount == 0) + { + return r; + } + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + r = ContentManager::ScanDirectory(*(pKey), true, null, reqId); + } + __scanDirMap.RemoveAll(); + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return r; + } + else + { + AppLogDebug("EXIT, nothing to be done"); + return E_SUCCESS; + } +} + +int +FileUpdateTimer::GetDirScanCount() +{ + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + if (File::IsFileExist(*pKey) == false) + { + __scanDirMap.Remove(*pKey); + } + } + delete pMapEnum; + return __scanDirMap.GetCount(); +} + +void +FileUpdateTimer::OnDeviceStateChanged(DeviceType deviceType, const Tizen::Base::String& state) +{ + AppLogDebug("ENTER"); + if (deviceType == DEVICE_TYPE_STORAGE_CARD && state == DEVICE_STORAGE_CARD_UNMOUNTED && + _actionId == FILE_ACTION_DELETE) + { + String sdcPath = Environment::GetExternalStoragePath(); + IMapEnumerator* pMapEnum = __scanDirMap.GetMapEnumeratorN(); + String* pKey = null; + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast< String* > (pMapEnum->GetKey()); + if (pKey->StartsWith(sdcPath, 0)) + { + __scanDirMap.Remove(*pKey); + } + } + delete pMapEnum; + } + AppLogDebug("EXIT"); +} + +void +FileUpdateTimer::TimerCancel(int, enum FileActionCancelRes res) +{ + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); +} +void +FileUpdateTimer::TimerComplete(int, enum FileActionCompleteRes res) +{ + DeviceManager::RemoveDeviceEventListener(DEVICE_TYPE_STORAGE_CARD, *this); +} diff --git a/src/GlFormFactory.cpp b/src/GlFormFactory.cpp new file mode 100644 index 0000000..f4161f2 --- /dev/null +++ b/src/GlFormFactory.cpp @@ -0,0 +1,109 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlFormFactory.cpp + * @brief This is the implementation file for FormFactory class. + */ + +#include "GlAlbumListEditorForm.h" +#include "GlAlbumListForm.h" +#include "GlAlbumNameEditorForm.h" +#include "GlFileListEditorForm.h" +#include "GlFileListForm.h" +#include "GlFormFactory.h" +#include "GlImageCropForm.h" +#include "GlSettingMainForm.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FormFactory::FormFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +FormFactory::~FormFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +Form* +FormFactory::CreateFormN(const String& formId, const SceneId& sceneId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Form* pNewForm = null; + + if (formId == IDC_FORM_ALBUM_LIST) + { + AlbumListForm* pForm = new (std::nothrow) AlbumListForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_FORM_ALBUM_LIST_EDITOR) + { + AlbumListEditorForm* pForm = new (std::nothrow) AlbumListEditorForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_FORM_ALBUM_NAME_EDITOR) + { + AlbumNameEditorForm* pForm = new (std::nothrow) AlbumNameEditorForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_FORM_FILE_LIST) + { + FileListForm* pForm = new (std::nothrow) FileListForm(); + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDC_FORM_FILE_LIST_EDITOR) + { + FileListEditorForm* pForm = new (std::nothrow) FileListEditorForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_FORM_SETTING_MAIN) + { + SettingMainForm* pForm = new (std::nothrow) SettingMainForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_FORM_IMAGE_CROP) + { + ImageCropForm* pForm = new (std::nothrow) ImageCropForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pNewForm; +} diff --git a/src/GlGalleryApp.cpp b/src/GlGalleryApp.cpp new file mode 100644 index 0000000..8428b1c --- /dev/null +++ b/src/GlGalleryApp.cpp @@ -0,0 +1,257 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlGalleryApp.cpp + * @brief This is the implementation file for GalleryApp class. + */ + +#include +#include "GlAlbumListPresentationModel.h" +#include "GlContentUpdateEventListener.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlMainFrame.h" +#include "GlSettingPresentationModel.h" +#include "GlTypes.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::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +GalleryApp::GalleryApp(void) + : __requestId(0) + , __pArguments(null) + , __appControlResult(APP_CTRL_RESULT_SUCCEEDED) + , __frameActivated(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +GalleryApp::~GalleryApp(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +UiApp* +GalleryApp::CreateInstance(void) +{ + AppLogDebug("ENTER"); + UiApp* pUiApp = new (std::nothrow) GalleryApp(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pUiApp; +} + +String +GalleryApp::GetAppControlOperationId(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __operationId; +} + +String +GalleryApp::GetMimeType(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return __mimeType; +} + +const IMap* +GalleryApp::GetAppControlArguments(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pArguments; +} + +void +GalleryApp::SendAppControlResult(const AppCtrlResult appControlResult, const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + AppControlProviderManager* pAppManager = AppControlProviderManager::GetInstance(); + result r = pAppManager->SendAppControlResult(__requestId, appControlResult, pExtraData); + if (r == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + } + + AppLogDebug("appControlResult is %d", appControlResult); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +GalleryApp::OnAppInitializing(AppRegistry& appRegistry) +{ + AppLogDebug("ENTER"); + AppControlProviderManager::GetInstance()->SetAppControlProviderEventListener(this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +bool +GalleryApp::OnAppInitialized(void) +{ + AppLogDebug("ENTER"); + MainFrame* pMainFrame = new (std::nothrow) MainFrame(); + pMainFrame->Construct(); + AddFrame(*pMainFrame); + + SettingInfo::AddSettingEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +bool +GalleryApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + AppLogDebug("ENTER"); + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + if (pContentListener) + { + pContentListener->RemoveContentListener(); + } + AlbumListPresentationModel* pAlbumListPresentationModel = AlbumListPresentationModel::GetInstance(); + if (pAlbumListPresentationModel != null) + { + pAlbumListPresentationModel->ClearThumbnailRequests(true); + } + FileListPresentationModel* pFileListPresentationModel = FileListPresentationModel::GetInstance(); + if (pFileListPresentationModel != null) + { + pFileListPresentationModel->ClearThumbnailRequests(true); + } + + delete __pArguments; + __pArguments = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +GalleryApp::OnForeground(void) +{ + AppLogDebug("ENTER"); + static bool bFirst = true; + if (bFirst) + { + bFirst = false; + return; + } + + MainFrame* pMainFrame = dynamic_cast(GetFrameAt(0)); + if (pMainFrame) + { + pMainFrame->SetEnabled(true); + pMainFrame->Invalidate(true); + } + + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + if (pContentListener->GetChangeNotificationStatus() == true) + { + pContentListener->ResumeOperation(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GalleryApp::OnAppControlRequestReceived(RequestId reqId, const String& operationId, + const String* pUriData, const String* pMimeType, const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + __requestId = reqId; + __operationId = operationId; + + if (pMimeType != null) + { + __mimeType = *pMimeType; + } + if (pExtraData != null) + { + HashMap* pArguments = new (std::nothrow) HashMap(SingleObjectDeleter); + pArguments->Construct(); + + const String* pKey = null; + const String* pValue = null; + IList* pKeyList = pExtraData->GetKeysN(); + + int loopCount = pKeyList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pKey = static_cast(pKeyList->GetAt(i)); + pValue = static_cast(pExtraData->GetValue(*pKey)); + + pArguments->Add(new (std::nothrow) String(*pKey), new (std::nothrow) String(*pValue)); + } + __pArguments = pArguments; + delete pKeyList; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GalleryApp::OnSettingChanged(String& key) +{ + AppLogDebug("ENTER key(%ls)", key.GetPointer()); + if (key.CompareTo(SETTING_KEY_LANGUAGE) == 0 || key.CompareTo(SETTING_KEY_FONT_SIZE) == 0) + { + UiApp::GetInstance()->Terminate(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GalleryApp::SetFrameEnabled(const bool enabled) +{ + MainFrame* pMainFrame = dynamic_cast(GetFrameAt(0)); + if (pMainFrame) + { + pMainFrame->SetEnabled(enabled); + } +} + +void +GalleryApp::SetFrameActivated(bool frameActivated) +{ + __frameActivated = frameActivated; +} + +bool +GalleryApp::GetFrameActivated(void) const +{ + return __frameActivated; +} + diff --git a/src/GlGalleryEntry.cpp b/src/GlGalleryEntry.cpp new file mode 100644 index 0000000..4fb4032 --- /dev/null +++ b/src/GlGalleryEntry.cpp @@ -0,0 +1,56 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlGalleryEntry.cpp + * @brief This is the implementation file for GalleryEntry class. + */ + +#include "GlGalleryApp.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +// +// The entry function of Tizen application called by the operating system. +// +_EXPORT_ int +OspMain(int argc, char *pArgv[]) +{ + AppLogDebug("ENTER"); + AppLogDebug("Application started."); + ArrayList args(SingleObjectDeleter); + args.Construct(); + for (int i = 0; i < argc; i++) + { + args.Add(new (std::nothrow) String(pArgv[i])); + } + + result r = Tizen::App::UiApp::Execute(GalleryApp::CreateInstance, &args); + TryLog(r == E_SUCCESS, "[%s] Application execution failed", GetErrorMessage(r)); + AppLogDebug("Application finished."); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return static_cast(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/src/GlImageCropForm.cpp b/src/GlImageCropForm.cpp new file mode 100644 index 0000000..28774ea --- /dev/null +++ b/src/GlImageCropForm.cpp @@ -0,0 +1,960 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageCrop.cpp + * @brief This is the implementation file for Image Crop. + */ + +#include +#include +#include +#include +#include "GlGalleryApp.h" +#include "GlImageCropForm.h" +#include "GlResourceManager.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Text; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const unsigned int COLOR_GALLERY_BG = Color32<31,31,31>::Value; +static const unsigned int CROP_BOX_RECTANGLE_COLOR = Color32<199, 110, 6>::Value; +static const int CROP_BOX_LINE_WIDTH = 5; +static const int H_CROP_RECTANGLE = 20; +static const wchar_t* PATH_DATA_DIRECTORY_IN_CROP = L"data/"; +static const wchar_t* FILE_NAME_SEPARATOR = L"_"; +static const int MAX_FILE_LENGHT = 255; +static const int CROP_BOX_OFFSET = 20; + +ImageCropForm::ImageCropForm(void) + : __sourceFilePath(L"") + , __cropMode(APPCONTROL_DATA_CROP_TYPE_FIT_TO_SCREEN) + , __pCanvas(null) + , __pCurrentBitmap(null) + , __pRectangleBitmap(null) + , __imageFormat(IMG_FORMAT_NONE) + , __imageBuffer(null) + , __pointLocation(OUTSIDE_CROPBOX) + , __isOrientationChanged(false) + , __imageHeight(0) + , __imageWidth(0) + , __statusValue(-1) + , __formHeight(0) + , __formWidth(0) + , __skipMoveEvent(0) + +{ +} + +ImageCropForm::~ImageCropForm(void) +{ + if (__pCurrentBitmap != null) + { + delete __pCurrentBitmap; + } + if (__pRectangleBitmap != null) + { + delete __pRectangleBitmap; + } + if (__pCanvas != null) + { + delete __pCanvas; + } +} + +bool +ImageCropForm::Initialize(void) +{ + Form::Construct(IDL_FORM_IMAGE_CROP); + + return true; +} + +result +ImageCropForm::OnInitializing(void) +{ + AppLogDebug("OnInitializing"); + + AppResource* pAppResource = null; + pAppResource = UiApp::App::GetInstance()->GetAppResource(); + + if (pAppResource != null) + { + __pRectangleBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_RECTANGLE); + } + + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->RemoveAllItems(); + pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + + FooterItem footerItem1; + footerItem1.Construct(IDA_BUTTON_SAVE); + footerItem1.SetText(ResourceManager::GetString(L"IDS_COM_OPT_SAVE")); + + pFooter->AddItem(footerItem1); + } + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + AddTouchEventListener(*this); + AddOrientationEventListener(*this); + SetFormBackEventListener(this); + + return E_SUCCESS; +} + +result +ImageCropForm::OnDraw(void) +{ + AppLogDebug("OnDraw"); + result r = E_SUCCESS; + + if (__pCanvas != null) + { + __pCanvas->Clear(); + r = __pCanvas->SetLineWidth(CROP_BOX_LINE_WIDTH); + r = __pCanvas->DrawBitmap(Rectangle(__imageBox.x, __imageBox.y, __imageBox.width, __imageBox.height), *__pCurrentBitmap); // Image to be cropped + r = __pCanvas->DrawRectangle(Rectangle(__cropBox.x, __cropBox.y, __cropBox.width, __cropBox.height)); // Cropbox rectangle + r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Rectangle + r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); //Left Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); //Right Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Left Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Right Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Right Rectangle + r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Left Rectangle + __pCanvas->SetBackgroundColor(COLOR_GALLERY_BG); + } + + return r; +} + +void +ImageCropForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("OnFormBackRequested"); + + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition()); +} + +void +ImageCropForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("OnActionPerformed"); + result r = E_SUCCESS; + + switch(actionId) + { + case IDA_BUTTON_SAVE: + { + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + + if (pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_PICK) + { + ImageBuffer* pCropBuffer = null; + int count = 1; + int index = 0; + + String destFilePath; + destFilePath.Append(App::GetInstance()->GetAppSharedPath()); + destFilePath.Append(PATH_DATA_DIRECTORY_IN_CROP); + destFilePath.Append(GetFileName(__sourceFilePath)); + destFilePath.Reverse(); + r = destFilePath.IndexOf(FILE_EXT_SEPARATOR, 0, index); + destFilePath.Reverse(); + if (r != E_SUCCESS) + { + index = 0; + destFilePath.Append(FILE_EXT_SEPARATOR); + } + destFilePath.Insert(FILE_NAME_SEPARATOR, destFilePath.GetLength() - index - 1); + destFilePath.Insert(count, destFilePath.GetLength() - index - 1); + + if (__imageFormat != IMG_FORMAT_JPG || __imageFormat != IMG_FORMAT_PNG || __imageFormat != IMG_FORMAT_BMP) + { + destFilePath.Remove(destFilePath.GetLength() - index, index); + destFilePath.Append(CONTENT_EXT_JPG); + } + + while (File::IsFileExist(destFilePath) == true) + { + count++; + destFilePath.Clear(); + destFilePath.Append(App::GetInstance()->GetAppSharedPath()); + destFilePath.Append(PATH_DATA_DIRECTORY_IN_CROP); + destFilePath.Append(GetFileName(__sourceFilePath)); + destFilePath.Insert(FILE_NAME_SEPARATOR, destFilePath.GetLength() - index - 1); + destFilePath.Insert(count, destFilePath.GetLength() - index - 1); + if (__imageFormat != IMG_FORMAT_JPG || __imageFormat != IMG_FORMAT_PNG || __imageFormat != IMG_FORMAT_BMP) + { + destFilePath.Remove(destFilePath.GetLength() - index, index); + destFilePath.Append(CONTENT_EXT_JPG); + } + } + + AppCtrlResult appControlResult = APP_CTRL_RESULT_FAILED; + HashMap* pMap = null; + int inputLength = 0; + Utf8Encoding utf8; + r = utf8.GetByteCount(GetFileName(destFilePath), inputLength); + + while (inputLength > MAX_FILE_LENGHT) + { + destFilePath.IndexOf(FILE_NAME_SEPARATOR, 0, index); + destFilePath.Remove(index - 1, 1); + r = utf8.GetByteCount(GetFileName(destFilePath), inputLength); + } + + pCropBuffer = __imageBuffer->CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height, + (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height); + + if (pCropBuffer != null) + { + if (__imageFormat == IMG_FORMAT_JPG || __imageFormat == IMG_FORMAT_PNG || __imageFormat == IMG_FORMAT_BMP) + { + r = pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100); + } + else + { + r = pCropBuffer->EncodeToFile(destFilePath, IMG_FORMAT_JPG, true, 100); + } + delete pCropBuffer; + + if (r == E_SUCCESS ) + { + ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pList->Add(new (std::nothrow) String(destFilePath)); + + pMap = new (std::nothrow) HashMap(SingleObjectDeleter); + pMap->Construct(); + pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_DATA_SELECTED), pList); + + appControlResult = APP_CTRL_RESULT_SUCCEEDED; + } + else + { + appControlResult = APP_CTRL_RESULT_FAILED; + } + } + else + { + appControlResult = APP_CTRL_RESULT_FAILED; + } + + pApp->SendAppControlResult(appControlResult, pMap); + pApp->Terminate(); + } + } + break; + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return; +} + +void +ImageCropForm::OnOrientationChanged(const Control &source, OrientationStatus orientationStatus) +{ + AppLogDebug("OnOrientationChanged"); + + __isOrientationChanged = true; + SetValue(); + + if (__pCanvas != null) + { + __pCanvas->Clear(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageCropForm::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("OnTouchPressed"); + + __touchStart = currentPosition; + CheckCurrentPosition(currentPosition); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageCropForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + if (++__skipMoveEvent % 5 != 0) + { + return; + } + else + { + __skipMoveEvent = 0; + } + + int deltaX = currentPosition.x - __touchStart.x; + int deltaY = currentPosition.y - __touchStart.y; + if (__cropMode.Equals(APPCONTROL_DATA_CROP_TYPE_AUTO, false)) + { + switch(__pointLocation) + { + case INSIDE_TOP_RECTANGLE: + { + if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3))) + { + __cropBox.y += deltaY; + __cropBox.height -= deltaY; + } + } + break; + + case INSIDE_BOTTOM_RECTANGLE: + { + if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) + && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3)) + { + __cropBox.height += deltaY; + } + } + break; + + case INSIDE_LEFT_RECTANGLE: + { + if ((__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3)) + { + __cropBox.x += deltaX; + __cropBox.width -= deltaX; + } + } + break; + + case INSIDE_RIGHT_RECTANGLE: + { + if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) + && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3)) + { + __cropBox.width += deltaX; + } + } + break; + + case INSIDE_TOP_LEFT_RECTANGLE: + { + if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3)) + && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3)) + { + __cropBox.y += deltaY; + __cropBox.height -= deltaY; + __cropBox.x += deltaX; + __cropBox.width -= deltaX; + } + } + break; + + case INSIDE_TOP_RIGHT_RECTANGLE: + { + if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3)) + && (__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3)) + { + __cropBox.width += deltaX; + __cropBox.y += deltaY; + __cropBox.height -= deltaY; + } + } + break; + + case INSIDE_BOTTOM_LEFT_RECTANGLE: + { + if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3) + && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3)) + { + __cropBox.x += deltaX; + __cropBox.width -= deltaX; + __cropBox.height += deltaY; + } + } + break; + + case INSIDE_BOTTOM_RIGHT_RECTANGLE: + { + if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3) + && (__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3)) + { + __cropBox.width += deltaX; + __cropBox.height += deltaY; + } + } + break; + + case INSIDE_CROPBOX: + { + if ((__cropBox.x + deltaX) > __imageBox.x) + { + __cropBox.x += deltaX; + } + else + { + __cropBox.x = __imageBox.x; + } + if ((__cropBox.y + deltaY) > __imageBox.y) + { + __cropBox.y += deltaY; + } + else + { + __cropBox.y = __imageBox.y; + } + if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width)) + { + __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width; + } + if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height)) + { + __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height; + } + } + break; + + default: + break; + } + } + else if (__cropMode.Equals(APPCONTROL_DATA_CROP_TYPE_FIT_TO_SCREEN, false)) + { + if (__pointLocation == INSIDE_LEFT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_LEFT_RECTANGLE + || __pointLocation == INSIDE_TOP_LEFT_RECTANGLE) + { + int temp = __cropBox.height; + int height = (__formHeight * (__cropBox.width - (2 * deltaX))) /__formWidth; + temp = height - temp; + if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width))) + { + if (__cropBox.x + deltaX >= __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width + && __cropBox.y - (temp / 2) >= __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height + && (__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3))) + { + __cropBox.x += deltaX; + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + __cropBox.y = __cropBox.y - (temp / 2); + } + else if ((__cropBox.y + __cropBox.height) <= (__imageBox.y + __imageBox.height) + && __cropBox.width < __imageBox.width + && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y ) + { + if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width + && __cropBox.x + deltaX >= __imageBox.x) + { + __cropBox.x += deltaX; + } + else + { + __cropBox.x = __cropBox.x + (2 * deltaX); + } + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + __cropBox.y = __cropBox.y - temp; + } + else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width + && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height) + { + if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width) + { + __cropBox.x += deltaX; + } + else + { + __cropBox.x = __cropBox.x + (2 * deltaX); + } + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + } + } + } + else if (__pointLocation == INSIDE_RIGHT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_RIGHT_RECTANGLE + || __pointLocation == INSIDE_TOP_RIGHT_RECTANGLE) + { + deltaX *= -1; + int temp = __cropBox.height; + int height = (__formHeight * (__cropBox.width - (2 * deltaX))) / __formWidth; + temp = height - temp; + if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width))) + { + if (deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3)) + { + if (__cropBox.x + deltaX > __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width + && __cropBox.y - (temp / 2) > __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height) + { + __cropBox.x += deltaX; + __cropBox.width = __cropBox.width - (2 * deltaX);; + __cropBox.height = height; + __cropBox.y = __cropBox.y - (temp / 2); + } + else if ((__cropBox.y + __cropBox.height + (temp / 2)) >= (__imageBox.y + __imageBox.height) + && __cropBox.x + __cropBox.width - (2 * deltaX) <= __imageBox.x + __imageBox.width + && __cropBox.x - deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y ) + { + if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width + && __cropBox.x + deltaX >= __imageBox.x) + { + __cropBox.x += deltaX; + } + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + __cropBox.y = __cropBox.y - temp; + } + else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width + && __cropBox.x + deltaX <= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height) + { + if (__cropBox.x + deltaX >= __imageBox.x) + { + __cropBox.x += deltaX; + } + else + { + __cropBox.x = __imageBox.x; + } + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + } + else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.x + deltaX >= __imageBox.x + && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width + && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height) + { + __cropBox.x += deltaX; + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.height = height; + } + else if (__cropBox.x + deltaX <= __imageBox.x && __cropBox.y - (temp / 2) >= __imageBox.y + && __cropBox.x + __cropBox.width - (2 * deltaX) <= __imageBox.x + __imageBox.width + && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height) + { + __cropBox.width = __cropBox.width - (2 * deltaX); + __cropBox.y = __cropBox.y - (temp / 2); + __cropBox.height = height; + } + } + } + } + else if (__pointLocation == INSIDE_TOP_RECTANGLE) + { + int temp = __cropBox.width; + int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight; + temp = width - temp; + if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width))) + { + if (__cropBox.x - (temp /2 ) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width + && __cropBox.y + (deltaY) > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height) + { + __cropBox.y += deltaY; + __cropBox.height = __cropBox.height - (2 * deltaY); + __cropBox.width = width; + __cropBox.x = __cropBox.x - (temp / 2); + } + else if (__cropBox.x - (temp / 2) < __imageBox.x) + { + if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width) + { + __cropBox.width = width; + } + if (__cropBox.y + deltaY >= __imageBox.y) + { + __cropBox.y += deltaY; + } + if (__cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height) + { + __cropBox.height = __cropBox.height - (2 * deltaY); + } + } + else if (__cropBox.y + __cropBox.height - (2 * deltaY) >= __imageBox.x + __imageBox.height + && __cropBox.y + (2 * deltaY) >= __imageBox.y) + { + if (__cropBox.x - temp >= __imageBox.x + && __cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width) + { + __cropBox.x = __cropBox.x - temp; + } + else if (__cropBox.x - temp >= __imageBox.x) + { + __cropBox.x = __cropBox.x - temp / 2; + } + if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width) + { + __cropBox.width = width; + } + if (__cropBox.y + (2 * deltaY) >= __imageBox.y) + { + __cropBox.y = __cropBox.y + (2 * deltaY); + __cropBox.height = __cropBox.height - (2 * deltaY); + } + } + else if (__cropBox.x + __cropBox.width + (temp / 2) > __imageBox.x + __imageBox.width + && __cropBox.x - temp >= __imageBox.x && __cropBox.y + deltaY >= __imageBox.y + && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height) + { + __cropBox.x = __cropBox.x - temp; + __cropBox.width = width; + __cropBox.y += deltaY; + __cropBox.height = __cropBox.height - (2 * deltaY); + } + } + } + else if (__pointLocation == INSIDE_BOTTOM_RECTANGLE) + { + deltaY = deltaY * (-1); + int temp = __cropBox.width; + int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight; + temp = width - temp; + if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width))) + { + if (__cropBox.x - (temp / 2) >= __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width + && __cropBox.y + deltaY > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height) + { + __cropBox.y += deltaY; + __cropBox.height = __cropBox.height - (2 * deltaY);; + __cropBox.width = width; + __cropBox.x = __cropBox.x - (temp / 2); + } + else if (__cropBox.y + deltaY < __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height + && __cropBox.x - (temp / 2) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width) + { + __cropBox.x = __cropBox.x - (temp / 2); + __cropBox.width = width; + __cropBox.height = __cropBox.height - (2 * deltaY); + } + else if (__cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width + && __cropBox.y + deltaY >= __imageBox.y && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height + && __cropBox.x - temp >= __imageBox.x) + { + __cropBox.x = __cropBox.x - temp; + __cropBox.y += deltaY; + __cropBox.width = width; + __cropBox.height = __cropBox.height - (2 * deltaY); + } + else if (__cropBox.x + __cropBox.width + temp >= __imageBox.x + __imageBox.width + && __cropBox.y + deltaY <= __imageBox.y && __cropBox.x - temp > __imageBox.x + && __cropBox.y + __cropBox.height + temp < __imageBox.y + __imageBox.height) + { + __cropBox.x -= temp; + __cropBox.width = width; + __cropBox.height = __cropBox.height - (2 * deltaY); + } + else if (__cropBox.x - temp < __imageBox.x && __cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width + && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height) + { + if (__cropBox.y + deltaY >= __imageBox.y) + { + __cropBox.y += deltaY; + } + __cropBox.width = width; + __cropBox.height = __cropBox.height - (2 * deltaY); + } + } + } + else if (__pointLocation == INSIDE_CROPBOX) + { + if ((__cropBox.x + deltaX) > __imageBox.x) + { + __cropBox.x += deltaX; + } + else + { + __cropBox.x = __imageBox.x; + } + if ((__cropBox.y + deltaY) > __imageBox.y) + { + __cropBox.y += deltaY; + } + else + { + __cropBox.y = __imageBox.y; + } + if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width)) + { + __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width; + } + if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height)) + { + __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height; + } + } + } + RequestRedraw(false); + __touchStart = currentPosition; +} + +void +ImageCropForm::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("OnTouchReleased"); + + __pointLocation = OUTSIDE_CROPBOX; +} + +void +ImageCropForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("OnSceneActivatedN"); + + __pPresentationModel->AddContentEventListener(this); + + if (pArgs != null) + { + __sourceFilePath = *(static_cast(pArgs->GetAt(0))); + pArgs->RemoveAll(true); + delete pArgs; + + if (__sourceFilePath.IsEmpty() == false) + { + if ( __imageBuffer != null) + { + delete __imageBuffer; + __imageBuffer = null; + } + + __imageBuffer = new (std::nothrow) ImageBuffer(); + + result r = __imageBuffer->Construct(__sourceFilePath.GetPointer()); + if (r == E_SUCCESS) + { + __imageWidth = __imageBuffer->GetWidth(); + __imageHeight = __imageBuffer->GetHeight(); + + int physicalHeight = CoordinateSystem::ConvertToPhysicalY(__imageHeight); + int physicalWidth = CoordinateSystem::ConvertToPhysicalX(__imageWidth); + __pCurrentBitmap = __imageBuffer->GetBitmapN(BITMAP_PIXEL_FORMAT_ARGB8888, physicalWidth, physicalHeight); + SetValue(); + + Image img; + r = img.Construct(); + if (r == E_SUCCESS) + { + __imageFormat = img.GetImageFormat(__sourceFilePath); + } + } + else + { + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_PICK) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_FAILED, null); + pApp->Terminate(); + } + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageCropForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId) +{ + AppLogDebug("OnSceneDeactivated"); + __pPresentationModel->RemoveContentEventListener(this); + RemoveOrientationEventListener(*this); +} + +void +ImageCropForm::CheckCurrentPosition(const Point currentPosition) +{ + AppLogDebug("CheckCurrentPosition"); + + if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_TOP_RECTANGLE; + } + else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_LEFT_RECTANGLE; + } + else if (currentPosition.x > (__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_RIGHT_RECTANGLE; + } + else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_BOTTOM_RECTANGLE; + } + else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_TOP_LEFT_RECTANGLE; + } + else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_TOP_RIGHT_RECTANGLE; + } + else if (currentPosition.x > (__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_BOTTOM_RIGHT_RECTANGLE; + } + else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET) + && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)) + { + __pointLocation = INSIDE_BOTTOM_LEFT_RECTANGLE; + } + else if (currentPosition.x > __cropBox.x && currentPosition.x < (__cropBox.x + __cropBox.width) && currentPosition.y > __cropBox.y && currentPosition.y < (__cropBox.y + __cropBox.height)) + { + __pointLocation = INSIDE_CROPBOX; + } + else + { + __pointLocation = OUTSIDE_CROPBOX; + } + return; +} + +void +ImageCropForm::SetValue(void) +{ + int prevHeight = __imageBox.height; + int prevWidth = __imageBox.width; + int prevImageboxX = __imageBox.x; + int prevImageBoxY = __imageBox.y; + + if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT) + { + __formHeight = Form::GetBounds().height; + __formWidth = Form::GetBounds().width; + } + else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + __formHeight = Form::GetBounds().width; + __formWidth = Form::GetBounds().height; + } + + float clientAreaRatio = (GetClientAreaBoundsF().height) / GetClientAreaBoundsF().width; + + if (__imageWidth >= GetClientAreaBounds().width || __imageHeight > GetClientAreaBounds().height) + { + float imageRatio = __imageHeight / (float) __imageWidth; + if (imageRatio < clientAreaRatio) + { + __imageBox.width = GetClientAreaBounds().width; + __imageBox.height = (__imageHeight * __imageBox.width) / __imageWidth; + __imageBox.x = GetClientAreaBounds().x; + __imageBox.y = GetClientAreaBounds().y + (GetClientAreaBounds().height - __imageBox.height) / 2; + } + else + { + __imageBox.height = GetClientAreaBounds().height; + __imageBox.width = (__imageWidth * __imageBox.height) / __imageHeight; + __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2; + __imageBox.y = GetClientAreaBounds().y; + } + } + else + { + __imageBox.height = __imageHeight; + __imageBox.width = __imageWidth; + __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2; + __imageBox.y = GetClientAreaBounds().y + (GetClientAreaBounds().height - __imageBox.height) / 2 ; + } + if (__isOrientationChanged == false) + { + if (__imageBox.height > __imageBox.width) + { + __cropBox.width = (2 * __imageBox.width) / 3; + __cropBox.height = (__formHeight * __cropBox.width / __formWidth); + if (__cropBox.height > __imageBox.height) + { + __cropBox.height = (2 * __imageBox.height) / 3; + __cropBox.width = (__cropBox.height * __formWidth) / __formHeight; + } + __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2; + __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2; + } + else + { + __cropBox.height = (2 *__imageBox.height) / 3; + __cropBox.width = (__formWidth * __cropBox.height / __formHeight); + if (__cropBox.width > __imageBox.width) + { + __cropBox.width = (2 * __imageBox.width) / 3; + __cropBox.height = (__formHeight * __cropBox.width) / __formWidth; + } + __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2; + __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2; + } + } + else + { + float temp = __imageBox.x + ((__cropBox.x - prevImageboxX) * __imageBox.width) / (float) prevWidth; + __cropBox.x = (temp + 0.5); + temp = __imageBox.y + ((__cropBox.y - prevImageBoxY) * __imageBox.height) / (float) prevHeight; + __cropBox.y = (temp + 0.5); + temp = (__cropBox.height * __imageBox.height) / (float) prevHeight; + __cropBox.height = (temp + 0.5); + temp = (__cropBox.width * __imageBox.width) / (float) prevWidth; + __cropBox.width = (temp + 0.5); + } + __pCanvas = GetCanvasN(0.0f, 0.0f, GetClientAreaBoundsF().width, GetClientAreaBoundsF().height); + if (__pCanvas != null) + { + __pCanvas->SetBackgroundColor(COLOR_GALLERY_BG); + __pCanvas->SetForegroundColor(CROP_BOX_RECTANGLE_COLOR); + } +} + +String +ImageCropForm::GetFileName(const String& filePath, bool isCheckExe) const +{ + String strResult; + int lastIndex = -1 ; + + filePath.LastIndexOf(DIRECTORY_SEPARATOR, filePath.GetLength() - 1, lastIndex); + filePath.SubString(lastIndex+1, strResult); + + if (isCheckExe == true) + { + String strTemp = strResult; + + lastIndex = -1; + strTemp.LastIndexOf(FILE_EXT_SEPARATOR, strTemp.GetLength() - 1, lastIndex); + strTemp.SubString(0, lastIndex, strResult); + } + + return strResult; +} + +void +ImageCropForm::OnContentUpdated() +{ + AppLogDebug("ENTER"); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + + AppLogDebug("EXIT(%s)"); +} diff --git a/src/GlImageListEditorPanel.cpp b/src/GlImageListEditorPanel.cpp new file mode 100644 index 0000000..90dd923 --- /dev/null +++ b/src/GlImageListEditorPanel.cpp @@ -0,0 +1,708 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageListEditorPanel.cpp + * @brief This is the implementation file for ImageListEditorPanel class. + */ + +#include +#include +#include "GlAlbumInfo.h" +#include "GlCommonUtil.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlImageListEditorPanel.h" +#include "GlResourceManager.h" +#include "GlTypes.h" +#include "GlFileUpdateTimer.h" +#include "GlFileListEditorForm.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_SELECTALL_REGION = 112; +static const int COUNT_LABEL_FONT_SIZE = 33; +static const unsigned int COLOR_COUNT_LABEL = Color32<68, 68, 68>::Value; +static const unsigned int COLOR_SELECT_COUNT_FONT = Color32<255, 255, 255>::Value; +static const Color COLOR_THUMBNAIL_DIM (Color::GetColor(COLOR_ID_BLACK)); +static const float H_COUNT_LABEL = 48.0f; +static const int LENGTH_COUNT_LABEL = 256; +static const int ALPHA_THUMBNAIL_DIM = 70; +static const Rectangle RECT_INITIAL (0, 0, 10, 10); +static const int H_CROP_RECTANGLE = 20; + +ImageListEditorPanel::ImageListEditorPanel(void) + : __itemCount(0) + , __pContentIconListView(null) + , __pCheckButton(null) + , __pLabelSelectCnt(null) + , __pPresentationModel(null) + , __pFileListEditorForm(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ImageListEditorPanel::~ImageListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +ImageListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +ImageListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + __itemCount = 0; + + FloatRectangle clientAreaBounds = pForm->GetClientAreaBoundsF(); + SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + __pContentIconListView = new (std::nothrow) IconListView(); + + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, clientAreaBounds.height - H_COUNT_LABEL), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_MARK, + ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_RIGHT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __pLabelSelectCnt = new (std::nothrow) Label(); + + __pLabelSelectCnt->Construct(FloatRectangle(0, clientAreaBounds.height - H_COUNT_LABEL, + clientAreaBounds.width, H_COUNT_LABEL), ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED")); + __pLabelSelectCnt->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pLabelSelectCnt->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + __pLabelSelectCnt->SetBackgroundColor(COLOR_COUNT_LABEL); + __pLabelSelectCnt->SetTextColor(Color(COLOR_SELECT_COUNT_FONT)); + __pLabelSelectCnt->SetTextConfig(COUNT_LABEL_FONT_SIZE, LABEL_TEXT_STYLE_BOLD); + AddControl(__pLabelSelectCnt); + } + else + { + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, clientAreaBounds.height), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_NORMAL, + ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_RIGHT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + } + } + else + { + __pContentIconListView = new (std::nothrow) IconListView(); + __pContentIconListView->Construct(Rectangle(0, H_SELECTALL_REGION, clientAreaBounds.width, + clientAreaBounds.height - H_SELECTALL_REGION), DIMENSION_DEFAULT_THUMBNAIL, + ICON_LIST_VIEW_STYLE_MARK, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_RIGHT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __pLabelSelectCnt = new (std::nothrow) Label(); + __pLabelSelectCnt->Construct( + Rectangle(0, clientAreaBounds.height - H_COUNT_LABEL, clientAreaBounds.width, H_COUNT_LABEL), + ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED")); + __pLabelSelectCnt->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pLabelSelectCnt->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + __pLabelSelectCnt->SetBackgroundColor(COLOR_COUNT_LABEL); + __pLabelSelectCnt->SetTextColor(Color(COLOR_SELECT_COUNT_FONT)); + AddControl(__pLabelSelectCnt); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +ImageListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +int +ImageListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +ImageListEditorPanel::CreateItem(int index) +{ + AppLogDebug("ENTER : index(%d)", index); + IconListViewItem* pIconListviewItem = new (std::nothrow) IconListViewItem(); + Bitmap* pBitmap = null; + String* pItemText = null; + + result r = __pPresentationModel->GetThumbnailInSyncCacheN(index, pItemText, pBitmap); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + else if ((*pItemText) != ResourceManager::GetString(L"EMPTY_SPACE")) + { + delete pItemText; + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + if (__pContentIconListView->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + Color dimColor(COLOR_THUMBNAIL_DIM); + dimColor.SetAlpha(ALPHA_THUMBNAIL_DIM); + + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pIconListviewItem->Construct(*pBitmap, pItemText, pSelectedBitmap); + delete pSelectedBitmap; + } + else + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete pIconListviewItem; + delete pItemText; + return null; + } + } + else + { + pIconListviewItem->Construct(*pBitmap, pItemText); + } + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +bool +ImageListEditorPanel::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +ImageListEditorPanel::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + + if (status == ICON_LIST_VIEW_ITEM_CHECKED || status == ICON_LIST_VIEW_ITEM_UNCHECKED) + { + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + int checkedCount = GetItemCheckedCount(); + String strTmp; + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + else + { + int checkedCount = GetItemCheckedCount(); + String strTmp; + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + if (__pCheckButton->IsSelected()) + { + __pCheckButton->SetSelected(false); + } + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + + if ( __pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK + && __pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_SINGLE) + { + if (status == ICON_LIST_VIEW_ITEM_SELECTED) + { + GalleryApp* pApp = static_cast(GalleryApp::GetInstance()); + const IMap* pArguments = pApp->GetAppControlArguments(); + const String* cropMode = null; + + if (pArguments != null) + { + cropMode = static_cast(pArguments->GetValue(String(APPCONTROL_KEY_IMAGEVIEWER_MODE))); + } + + int width = 0; + int height = 0; + ImageFormat imageFormat = IMG_FORMAT_NONE; + result r = E_SUCCESS; + r = ImageBuffer::GetImageInfo(__pPresentationModel->GetContentFilePath(index), imageFormat, width, height); + + if (cropMode != null && r == E_SUCCESS && width > (H_CROP_RECTANGLE * 5) && height > (H_CROP_RECTANGLE * 5)) + { + ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(index))); + SceneManager::GetInstance()->GoForward(ForwardSceneTransition(IDSCN_IMAGE_CROP), pList); + } + else + { + + HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter); + result r = pMap->Construct(); + if (r == E_SUCCESS) + { + + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + r = pArrayList->Construct(); + if (r == E_SUCCESS) + { + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(index))); + pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_DATA_SELECTED), (Object*)pArrayList); + + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap); + pApp->Terminate(); + } + else + { + delete pMap; + } + } + else + { + delete pArrayList; + delete pMap; + } + } + else + { + delete pMap; + } + } + } + } + SetButtonState(); + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_IMAGE) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_IMAGE); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)",index); + if (index >= 0) + { + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + + ChangeOrientation(); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (currentSceneId == IDSCN_IMAGE_LIST_EDITOR) + { + if (previousSceneId == IDSCN_ALBUM_LIST) + { + AlbumInfo* pAlbumInfo = static_cast(pArgs->GetAt(0)); + if (pAlbumInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + IList* pDirectoryList = pAlbumInfo->GetDirectoryListN(); + __pPresentationModel->SetCurrentAlbumInfo(pAlbumInfo->GetAlbumName(), *pDirectoryList); + + if (pDirectoryList != null) + { + delete pDirectoryList; + } + delete pArgs; + + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + } + } + else + { + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->RequestRedraw(true); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + __pFileListEditorForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturnVoid(__pFileListEditorForm != null, "[%s] fail to get FileListEditorForm.", GetErrorMessage(GetLastResult())); + + String titleText = __pPresentationModel->GetCurrentAlbumName(); + + if (titleText == ALL_ALBUMS_REAL_NAME) + { + String text = ResourceManager::GetString(L"IDS_MEDIABR_BODY_ALL_ALBUMS"); + __pFileListEditorForm->SetTitleText(text); + } + else + { + __pFileListEditorForm->SetTitleText(titleText); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +ImageListEditorPanel::GetItemCheckedCount(void) const +{ + AppLogDebug("ENTER"); + int count = 0; + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + ++count; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return count; +} + +IList* +ImageListEditorPanel::GetItemCheckedIndexListN(void) const +{ + AppLogDebug("ENTER"); + IList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + Integer* pIndex = null; + + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + AppLogDebug("ENTER loopCount(%d)", loopCount); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + pIndex = new (std::nothrow) Integer(i); + AppLogDebug("ENTER loopCount(%d)", loopCount); + AppLogDebug("ENTER loopCount(%d)", pIndex->ToInt()); + pList->Add(pIndex); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pList; +} + +void ImageListEditorPanel::OnFileOpInvalidate(enum FileActionMode actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + FileListEditorForm* pFileListEditorForm = + dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturnVoid(pFileListEditorForm != null, "[%s] fail to get SceneManager.", + GetErrorMessage(GetLastResult())); + pFileListEditorForm->Invalidate(true); +} + +void ImageListEditorPanel::OnFileOpComplete(enum FileActionMode actionId, enum FileActionCompleteRes res) +{ +} + +void +ImageListEditorPanel::OnRequestAppExitWithMultipleSelectionAppControlResult(void) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + + if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + int loopCount = pIndexList->GetCount(); + Integer* pTemp = null; + for (int i = 0; i < loopCount; ++i) + { + pTemp = static_cast(pIndexList->GetAt(i)); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(pTemp->ToInt()))); + } + + HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter); + pMap->Construct(); + pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_DATA_SELECTED), pArrayList); + + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap); + pApp->Terminate(); + } + + delete pIndexList; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::OnSelectAllPressed(void) +{ + bool needToSelectAll = true; + int checkedCount = GetItemCheckedCount(); + int totalFileCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + if (checkedCount == totalFileCount) + { + needToSelectAll = false; + } + + if (needToSelectAll == true) + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == false) + { + __pContentIconListView->SetItemChecked(i, true); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + if (__pFileListEditorForm != null) + { + __pFileListEditorForm->SetFooterButtonsState(true); + } + } + } + else + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + __pContentIconListView->SetItemChecked(i, false); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + if (__pFileListEditorForm != null) + { + __pFileListEditorForm->SetFooterButtonsState(false); + } + } + } + + String tempString; + if (needToSelectAll == true) + { + tempString.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), totalFileCount); + } + else + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + + __pLabelSelectCnt->SetText(tempString); + __pLabelSelectCnt->RequestRedraw(true); +} + +void +ImageListEditorPanel::SetButtonState(void) +{ + AppLogDebug("ENTER"); + + TryReturnVoid(__pFileListEditorForm != null, "[%s] __pFileListEditorForm is null", GetErrorMessage(GetLastResult())); + + if (GetItemCheckedCount() > 0) + { + AppLogDebug("BUTTONSTATE : Request Enable"); + __pFileListEditorForm->SetFooterButtonsState(true); + } + else + { + AppLogDebug("BUTTONSTATE : Request disable"); + __pFileListEditorForm->SetFooterButtonsState(false); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListEditorPanel::ChangeOrientation(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + const Form* pForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturn(pForm != null,, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + FloatRectangle clientAreaBounds = pForm->GetClientAreaBoundsF(); + SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height); + if (__pLabelSelectCnt != NULL) + { + __pLabelSelectCnt->SetBounds(0.0f, clientAreaBounds.height - H_COUNT_LABEL, clientAreaBounds.width, H_COUNT_LABEL); + } + __pContentIconListView->SetBounds(0.0f, 0.0f, clientAreaBounds.width, clientAreaBounds.height -H_COUNT_LABEL); +} diff --git a/src/GlImageListPanel.cpp b/src/GlImageListPanel.cpp new file mode 100644 index 0000000..c63a939 --- /dev/null +++ b/src/GlImageListPanel.cpp @@ -0,0 +1,268 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlImageListPanel.cpp + * @brief This is the implementation file for ImageListPanel class. + */ + +#include +#include +#include "GlAlbumInfo.h" +#include "GlCommonUtil.h" +#include "GlFileListForm.h" +#include "GlFileListPresentationModel.h" +#include "GlImageListPanel.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const Rectangle RECT_INITIAL (0, 0, 10, 10); +static const int W_CLIENT = 720; +static const int H_CONTENT_MARGIN = 24; +static const int W_CONTENT_MARGIN = 14; +static const int W_CONTENT_SPACE = 20; +static const int H_CONTENT_SPACE = 24; + +ImageListPanel::ImageListPanel(void) + : __itemCount(0) + , __pContentIconListView(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ImageListPanel::~ImageListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +ImageListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +ImageListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + clientAreaBounds.x = clientAreaBounds.y = 0; + SetBounds(clientAreaBounds); + __pContentIconListView = new (std::nothrow) IconListView(); + __pContentIconListView->Construct(Rectangle(0, 0, W_CLIENT, clientAreaBounds.height), + DIMENSION_DEFAULT_THUMBNAIL, ICON_LIST_VIEW_STYLE_NORMAL, ICON_LIST_VIEW_SCROLL_DIRECTION_VERTICAL); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetMargin(MARGIN_TYPE_LEFT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_RIGHT, W_CONTENT_MARGIN); + __pContentIconListView->SetMargin(MARGIN_TYPE_TOP, H_CONTENT_MARGIN); + __pContentIconListView->SetItemSpacing(W_CONTENT_SPACE, H_CONTENT_SPACE); + __pContentIconListView->SetItemBorderStyle(ICON_LIST_VIEW_ITEM_BORDER_STYLE_NONE); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->SetCheckBoxPosition(ICON_LIST_VIEW_CHECK_BOX_POSITION_TOP_RIGHT); + __pContentIconListView->AddIconListViewItemEventListener(*this); + __pContentIconListView->SetTouchAnimationEnabled(false); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + __itemCount = 0; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +ImageListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +int +ImageListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +IconListViewItem* +ImageListPanel::CreateItem(int index) +{ + AppLogDebug("ENTER"); + IconListViewItem* pIconListviewItem = new (std::nothrow) IconListViewItem(); + Bitmap* pBitmap = null; + String* pItemText = null; + result r = __pPresentationModel->GetThumbnailInSyncCacheN(index, pItemText, pBitmap); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + else if ((*pItemText) != ResourceManager::GetString(L"EMPTY_SPACE")) + { + delete pItemText; + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + pIconListviewItem->Construct(*pBitmap, pItemText); + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pIconListviewItem; +} + +bool +ImageListPanel::DeleteItem(int index, IconListViewItem* pItem) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +ImageListPanel::OnIconListViewItemStateChanged(IconListView& view, int index, IconListViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == ICON_LIST_VIEW_ITEM_SELECTED) + { + ArrayList* pArrayList = new (std::nothrow) ArrayList(); + pArrayList->Construct(); + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + + for (int i = 0; i < loopCount; ++i) + { + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(i))); + } + String listIndex; + listIndex.Format(10, L"%d", index); + + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_IMAGE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pArrayList); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_INDEX), new (std::nothrow) String(listIndex)); + + __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_IMAGE) + { + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + __pPresentationModel = FileListPresentationModel::GetInstance(); + + if (currentSceneId == IDSCN_IMAGE_LIST) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_IMAGE); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (pSceneManager->GetCurrentSceneId() == IDSCN_IMAGE_LIST) + { + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + if (pFileListForm != null) + { + pFileListForm->SetTitleText(__pPresentationModel->GetCurrentAlbumName()); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ImageListPanel::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlMainFrame.cpp b/src/GlMainFrame.cpp new file mode 100644 index 0000000..975b73f --- /dev/null +++ b/src/GlMainFrame.cpp @@ -0,0 +1,127 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlMainFrame.cpp + * @brief This is the implementation file for MainFrame class. + */ + +#include +#include "GlGalleryApp.h" +#include "GlFormFactory.h" +#include "GlMainFrame.h" +#include "GlPanelFactory.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +MainFrame::MainFrame(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +MainFrame::~MainFrame(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +MainFrame::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + static FormFactory formFactory; + static PanelFactory panelFactory; + + AddFrameEventListener(*this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + + r = pSceneManager->RegisterFormFactory(formFactory); + r = pSceneManager->RegisterPanelFactory(panelFactory); + + r = pSceneManager->RegisterScene(IDSCN_ALBUM_LIST, IDC_FORM_ALBUM_LIST, IDC_PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_ALBUM_LIST_EDITOR, IDC_FORM_ALBUM_LIST_EDITOR, IDC_PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_ALBUM_NAME_EDITOR, IDC_FORM_ALBUM_NAME_EDITOR, IDC_PANEL_BLANK); + + r = pSceneManager->RegisterScene(IDSCN_ALL_LIST, IDC_FORM_FILE_LIST, IDC_PANEL_ALL_LIST); + r = pSceneManager->RegisterScene(IDSCN_IMAGE_LIST, IDC_FORM_FILE_LIST, IDC_PANEL_IMAGE_LIST); + r = pSceneManager->RegisterScene(IDSCN_VIDEO_LIST, IDC_FORM_FILE_LIST, IDC_PANEL_VIDEO_LIST); + + r = pSceneManager->RegisterScene(IDSCN_ALL_LIST_EDITOR, IDC_FORM_FILE_LIST_EDITOR, IDC_PANEL_ALL_LIST_EDITOR); + r = pSceneManager->RegisterScene(IDSCN_IMAGE_LIST_EDITOR, IDC_FORM_FILE_LIST_EDITOR, IDC_PANEL_IMAGE_LIST_EDITOR); + r = pSceneManager->RegisterScene(IDSCN_VIDEO_LIST_EDITOR, IDC_FORM_FILE_LIST_EDITOR, IDC_PANEL_VIDEO_LIST_EDITOR); + + r = pSceneManager->RegisterScene(IDSCN_ALL_LIST_SELECTION, IDC_FORM_FILE_LIST_EDITOR, + IDC_PANEL_ALL_LIST_SELECTION); + + r = pSceneManager->RegisterScene(IDSCN_SETTING_MAIN, IDC_FORM_SETTING_MAIN, IDC_PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_SETTING_INTERVAL, IDC_FORM_SETTING_INTERVAL, IDC_PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_SETTING_TRANSITION, IDC_FORM_SETTING_TRANSITION, IDC_PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_IMAGE_CROP, IDC_FORM_IMAGE_CROP, IDC_PANEL_BLANK); + + SceneId sceneId; + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + + String operationID = pGalleryApp->GetAppControlOperationId(); + + if (operationID.CompareTo(APPCONTROL_OPERATION_ID_MAIN) == 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST), null); + } + else if (operationID.CompareTo(APPCONTROL_OPERATION_ID_PICK) == 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST), null); + } + else if (operationID.CompareTo(APPCONTROL_OPERATION_ID_CONFIGURE) == 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SETTING_MAIN), null); + } + else + { + pGalleryApp->Terminate(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +MainFrame::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +MainFrame::OnFrameActivated(const Frame& source) +{ + AppLogDebug("OnFrameActivated"); + + GalleryApp* pGalleryApp = static_cast(GalleryApp::GetInstance()); + if (pGalleryApp != null) + { + pGalleryApp->SetFrameActivated(true); + } +} diff --git a/src/GlPanelFactory.cpp b/src/GlPanelFactory.cpp new file mode 100644 index 0000000..580c3e1 --- /dev/null +++ b/src/GlPanelFactory.cpp @@ -0,0 +1,108 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlPanelFactory.cpp + * @brief This is the implementation file for PanelFactory class. + */ + +#include "GlAllListEditorPanel.h" +#include "GlAllListPanel.h" +#include "GlAllListSelectionPanel.h" +#include "GlImageListEditorPanel.h" +#include "GlImageListPanel.h" +#include "GlPanelFactory.h" +#include "GlVideoListEditorPanel.h" +#include "GlVideoListPanel.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +PanelFactory::PanelFactory() +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +PanelFactory::~PanelFactory() +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +Panel* +PanelFactory::CreatePanelN(const String& panelId, const SceneId& sceneId) +{ + AppLogDebug("ENTER"); + Panel* pNewPanel = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (panelId == IDC_PANEL_ALL_LIST) + { + AllListPanel* pPanel = new (std::nothrow) AllListPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_IMAGE_LIST) + { + ImageListPanel* pPanel = new (std::nothrow) ImageListPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_VIDEO_LIST) + { + VideoListPanel* pPanel = new (std::nothrow) VideoListPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_ALL_LIST_EDITOR) + { + AllListEditorPanel* pPanel = new (std::nothrow) AllListEditorPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_IMAGE_LIST_EDITOR) + { + ImageListEditorPanel* pPanel = new (std::nothrow) ImageListEditorPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_VIDEO_LIST_EDITOR) + { + VideoListEditorPanel* pPanel = new (std::nothrow) VideoListEditorPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PANEL_ALL_LIST_SELECTION) + { + AllListSelectionPanel* pPanel = new (std::nothrow) AllListSelectionPanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pNewPanel; +} diff --git a/src/GlProgressAnimation.cpp b/src/GlProgressAnimation.cpp new file mode 100644 index 0000000..73352bc --- /dev/null +++ b/src/GlProgressAnimation.cpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlProgressAnimation.cpp + * @brief This is the implementation file for GlProgressAnimation class. + */ + +#include +#include "GlProgressAnimation.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +ProgressAnimation::ProgressAnimation(void) + : __pAnimation(null) + , __pAnimationFrameList(null) +{ +} + +ProgressAnimation::~ProgressAnimation(void) +{ + if (__pAnimationFrameList != null) + { + delete __pAnimationFrameList; + } +} + +result +ProgressAnimation::Construct(Tizen::Graphics::Rectangle rect) +{ + Panel::Construct(rect); + + AppResource *pAppResource = Application::GetInstance()->GetAppResource(); + if (pAppResource != null) + { + Bitmap *pBitmap0 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS1); + Bitmap *pBitmap1 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS2); + Bitmap *pBitmap2 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS3); + Bitmap *pBitmap3 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS4); + Bitmap *pBitmap4 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS5); + Bitmap *pBitmap5 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS6); + Bitmap *pBitmap6 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS7); + Bitmap *pBitmap7 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS8); + Bitmap *pBitmap8 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS9); + Bitmap *pBitmap9 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS10); + Bitmap *pBitmap10 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS11); + Bitmap *pBitmap11 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS12); + Bitmap *pBitmap12 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS13); + Bitmap *pBitmap13 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS14); + Bitmap *pBitmap14 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS15); + Bitmap *pBitmap15 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS16); + Bitmap *pBitmap16 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS17); + Bitmap *pBitmap17 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS18); + Bitmap *pBitmap18 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS19); + Bitmap *pBitmap19 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS20); + Bitmap *pBitmap20 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS21); + Bitmap *pBitmap21 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS22); + Bitmap *pBitmap22 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS23); + Bitmap *pBitmap23 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS24); + Bitmap *pBitmap24 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS25); + Bitmap *pBitmap25 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS26); + Bitmap *pBitmap26 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS27); + Bitmap *pBitmap27 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS28); + Bitmap *pBitmap28 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS29); + Bitmap *pBitmap29 = pAppResource->GetBitmapN(IDB_ALBUM_RENAME_PROGRESS30); + + // Create AnimationFrames + long duration = DURATION / PROGRESS_COUNT; + AnimationFrame *pAniFrame1 = new (std::nothrow) AnimationFrame(*pBitmap0, duration); + AnimationFrame *pAniFrame2 = new (std::nothrow) AnimationFrame(*pBitmap1, duration); + AnimationFrame *pAniFrame3 = new (std::nothrow) AnimationFrame(*pBitmap2, duration); + AnimationFrame *pAniFrame4 = new (std::nothrow) AnimationFrame(*pBitmap3, duration); + AnimationFrame *pAniFrame5 = new (std::nothrow) AnimationFrame(*pBitmap4, duration); + AnimationFrame *pAniFrame6 = new (std::nothrow) AnimationFrame(*pBitmap5, duration); + AnimationFrame *pAniFrame7 = new (std::nothrow) AnimationFrame(*pBitmap6, duration); + AnimationFrame *pAniFrame8 = new (std::nothrow) AnimationFrame(*pBitmap7, duration); + AnimationFrame *pAniFrame9 = new (std::nothrow) AnimationFrame(*pBitmap8, duration); + AnimationFrame *pAniFrame10 = new (std::nothrow) AnimationFrame(*pBitmap9, duration); + AnimationFrame *pAniFrame11 = new (std::nothrow) AnimationFrame(*pBitmap10, duration); + AnimationFrame *pAniFrame12 = new (std::nothrow) AnimationFrame(*pBitmap11, duration); + AnimationFrame *pAniFrame13 = new (std::nothrow) AnimationFrame(*pBitmap12, duration); + AnimationFrame *pAniFrame14 = new (std::nothrow) AnimationFrame(*pBitmap13, duration); + AnimationFrame *pAniFrame15 = new (std::nothrow) AnimationFrame(*pBitmap14, duration); + AnimationFrame *pAniFrame16 = new (std::nothrow) AnimationFrame(*pBitmap15, duration); + AnimationFrame *pAniFrame17 = new (std::nothrow) AnimationFrame(*pBitmap16, duration); + AnimationFrame *pAniFrame18 = new (std::nothrow) AnimationFrame(*pBitmap17, duration); + AnimationFrame *pAniFrame19 = new (std::nothrow) AnimationFrame(*pBitmap18, duration); + AnimationFrame *pAniFrame20 = new (std::nothrow) AnimationFrame(*pBitmap19, duration); + AnimationFrame *pAniFrame21 = new (std::nothrow) AnimationFrame(*pBitmap20, duration); + AnimationFrame *pAniFrame22 = new (std::nothrow) AnimationFrame(*pBitmap21, duration); + AnimationFrame *pAniFrame23 = new (std::nothrow) AnimationFrame(*pBitmap22, duration); + AnimationFrame *pAniFrame24 = new (std::nothrow) AnimationFrame(*pBitmap23, duration); + AnimationFrame *pAniFrame25 = new (std::nothrow) AnimationFrame(*pBitmap24, duration); + AnimationFrame *pAniFrame26 = new (std::nothrow) AnimationFrame(*pBitmap25, duration); + AnimationFrame *pAniFrame27 = new (std::nothrow) AnimationFrame(*pBitmap26, duration); + AnimationFrame *pAniFrame28 = new (std::nothrow) AnimationFrame(*pBitmap27, duration); + AnimationFrame *pAniFrame29 = new (std::nothrow) AnimationFrame(*pBitmap28, duration); + AnimationFrame *pAniFrame30 = new (std::nothrow) AnimationFrame(*pBitmap29, duration); + + // Create AnimationList + __pAnimationFrameList = new (std::nothrow) ArrayList(SingleObjectDeleter); + __pAnimationFrameList->Construct(); + __pAnimationFrameList->Add(*pAniFrame1); + __pAnimationFrameList->Add(*pAniFrame2); + __pAnimationFrameList->Add(*pAniFrame3); + __pAnimationFrameList->Add(*pAniFrame4); + __pAnimationFrameList->Add(*pAniFrame5); + __pAnimationFrameList->Add(*pAniFrame6); + __pAnimationFrameList->Add(*pAniFrame7); + __pAnimationFrameList->Add(*pAniFrame8); + __pAnimationFrameList->Add(*pAniFrame9); + __pAnimationFrameList->Add(*pAniFrame10); + __pAnimationFrameList->Add(*pAniFrame11); + __pAnimationFrameList->Add(*pAniFrame12); + __pAnimationFrameList->Add(*pAniFrame13); + __pAnimationFrameList->Add(*pAniFrame14); + __pAnimationFrameList->Add(*pAniFrame15); + __pAnimationFrameList->Add(*pAniFrame16); + __pAnimationFrameList->Add(*pAniFrame17); + __pAnimationFrameList->Add(*pAniFrame18); + __pAnimationFrameList->Add(*pAniFrame19); + __pAnimationFrameList->Add(*pAniFrame20); + __pAnimationFrameList->Add(*pAniFrame21); + __pAnimationFrameList->Add(*pAniFrame22); + __pAnimationFrameList->Add(*pAniFrame23); + __pAnimationFrameList->Add(*pAniFrame24); + __pAnimationFrameList->Add(*pAniFrame25); + __pAnimationFrameList->Add(*pAniFrame26); + __pAnimationFrameList->Add(*pAniFrame27); + __pAnimationFrameList->Add(*pAniFrame28); + __pAnimationFrameList->Add(*pAniFrame29); + __pAnimationFrameList->Add(*pAniFrame30); + + // Deallocate a Bitmap. + delete pBitmap0; + delete pBitmap1; + delete pBitmap2; + delete pBitmap3; + delete pBitmap4; + delete pBitmap5; + delete pBitmap6; + delete pBitmap7; + delete pBitmap8; + delete pBitmap9; + delete pBitmap10; + delete pBitmap11; + delete pBitmap12; + delete pBitmap13; + delete pBitmap14; + delete pBitmap15; + delete pBitmap16; + delete pBitmap17; + delete pBitmap18; + delete pBitmap19; + delete pBitmap20; + delete pBitmap21; + delete pBitmap22; + delete pBitmap23; + delete pBitmap24; + delete pBitmap25; + delete pBitmap26; + delete pBitmap27; + delete pBitmap28; + delete pBitmap29; + + // Create Animation + __pAnimation = new (std::nothrow) Animation(); + __pAnimation->Construct(Rectangle((rect.width / 2 - 60 / 2), (rect.height / 2 - 30), 60, 60), *__pAnimationFrameList); + __pAnimation->SetRepeatCount(10000); + AddControl(__pAnimation); + } + + return E_SUCCESS; +} + +void +ProgressAnimation::AnimationStart(void) +{ + __pAnimation->SetShowState(true); + __pAnimation->Play(); +} + +void +ProgressAnimation::AnimationStop(void) +{ + __pAnimation->Stop(); + __pAnimation->SetShowState(false); +} + +void +ProgressAnimation::ChangeOrientation(Tizen::Graphics::Rectangle rect) +{ + Panel::SetBounds(rect); + __pAnimation->SetBounds((rect.width / 2 - 60 / 2), (rect.height / 2 - 30), 60, 60); + __pAnimation->Invalidate(true); +} diff --git a/src/GlProgressBar.cpp b/src/GlProgressBar.cpp new file mode 100644 index 0000000..0e40399 --- /dev/null +++ b/src/GlProgressBar.cpp @@ -0,0 +1,207 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlProgressBar.cpp + * @brief This is the implementation file for GlProgressBar class. + */ + +#include +#include + +#include "GlProgressBar.h" +#include "GlResourceManager.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +GlProgressBar::GlProgressBar(IActionEventListener* listener, IPropagatedKeyEventListener* propagatedListener) + : __totalVal(1) + , __curVal(1) + , __pFileProgressingPopup(null) + , __pFileProgressingProgress(null) + , __pFileProgressingHeaderLabel(null) + , __pFileProgressingLabel(null) + , __pFileCounterLabel(null) + , __pFileProgressingCancelButton(null) + , __pActionListener(listener) + , __pPropagatedListener(propagatedListener) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +GlProgressBar::~GlProgressBar(void) +{ + AppLogDebug("ENTER"); + if (__pFileProgressingPopup != null) + { + delete __pFileProgressingPopup; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GlProgressBar::HideFileProgressingPopup(void) +{ + AppLogDebug("ENTER"); + if (__pFileProgressingPopup != null && __pFileProgressingPopup->IsVisible()) + { + __pFileProgressingPopup->SetShowState(false); + + delete __pFileProgressingPopup; + __pFileProgressingPopup = null; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +GlProgressBar::CreateFileProgressingPopup(void) +{ + AppLogDebug("ENTER"); + __pFileProgressingPopup = new (std::nothrow) Popup(); + result r = __pFileProgressingPopup->Construct(L"IDL_DEL_PROGRESSING_POPUP"); + + if (__pFileProgressingPopup != null && r == E_SUCCESS) + { + + __pFileProgressingPopup->SetPropagatedKeyEventListener(__pPropagatedListener); + + __pFileProgressingCancelButton = static_cast(__pFileProgressingPopup->GetControl(L"IDC_CANCEL_BUTTON", true)); + + if (__pFileProgressingCancelButton != null) + { + __pFileProgressingCancelButton->SetActionId(IDA_PROGRESSBAR_CANCEL); + __pFileProgressingCancelButton->AddActionEventListener(*__pActionListener); + __pFileProgressingCancelButton->SetShowState(true); + } + + __pFileProgressingProgress = static_cast(__pFileProgressingPopup->GetControl(L"IDC_PROGRESS_BAR", true)); + + if (__pFileProgressingProgress != null) + { + __pFileProgressingProgress->SetName(L"IDC_ANIMATION_PROGRESS"); + __pFileProgressingProgress->SetValue(0); + } + + __pFileProgressingHeaderLabel = static_cast(__pFileProgressingPopup->GetControl(L"IDC_ANIMATION_HEADER", true)); + + if (__pFileProgressingHeaderLabel != null) + { + __pFileProgressingHeaderLabel->SetName(L"IDC_ANIMATION_HEADER"); + __pFileProgressingHeaderLabel->SetShowState(true); + } + + __pFileProgressingLabel = static_cast(__pFileProgressingPopup->GetControl(L"IDC_ANIMATION_LABEL", true)); + + if (__pFileProgressingLabel != null) + { + __pFileProgressingLabel->SetName(L"IDC_FILE_COUNT_LABEL"); + __pFileProgressingLabel->SetShowState(true); + } + + __pFileCounterLabel = static_cast(__pFileProgressingPopup->GetControl(L"IDC_COUNTER_LABEL", true)); + + if (__pFileCounterLabel != null) + { + __pFileCounterLabel->SetText(L""); + __pFileCounterLabel->SetTextColor(CUSTOM_COLOR_GREY); + __pFileCounterLabel->SetShowState(true); + } + + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return r; +} + +void +GlProgressBar::ShowFileProgressingPopup(const int val, enum FileActionMode action) +{ + AppLogDebug("ENTER"); + CreateFileProgressingPopup(); + + if (val > 0) + { + __totalVal = val; + } + else + { + __totalVal = 1; + } + __pFileProgressingProgress->SetRange(1, val); + + if (__pFileProgressingPopup != null) + { + if (__pFileProgressingHeaderLabel != null) + { + switch (action) + { + case FILE_ACTION_MOVE: + __pFileProgressingHeaderLabel->SetText(ResourceManager::GetString(L"IDS_COM_POP_MOVING")); + break; + + case FILE_ACTION_DELETE: + __pFileProgressingHeaderLabel->SetText(ResourceManager::GetString(L"IDS_COM_POP_DELETING")); + break; + + case FILE_ACTION_COPY: + __pFileProgressingHeaderLabel->SetText(ResourceManager::GetString(L"IDS_COM_POP_COPYING_ING")); + break; + + case FILE_ACTION_ROTATE: + __pFileProgressingHeaderLabel->SetText(ResourceManager::GetString(L"IDS_COM_POP_PROCESSING")); + break; + + default: + break; + } + + __pFileProgressingHeaderLabel->Invalidate(true); + } + + __pFileProgressingPopup->SetShowState(true); + __pFileProgressingPopup->Show(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GlProgressBar::IncProgress(const int count) +{ + AppLogDebug("ENTER"); + String counter; + __curVal = count; + __pFileProgressingProgress->SetValue(count); + + counter.Append(count); + counter.Append(L"/"); + counter.Append(__totalVal); + + if (__pFileCounterLabel != null) + { + __pFileCounterLabel->SetText(counter); + __pFileCounterLabel->Invalidate(true); + } + + __pFileProgressingPopup->SetShowState(true); + __pFileProgressingPopup->Show(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlRadioCustomItem.cpp b/src/GlRadioCustomItem.cpp new file mode 100644 index 0000000..ce63003 --- /dev/null +++ b/src/GlRadioCustomItem.cpp @@ -0,0 +1,85 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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: RadioCustomItem.cpp + *@brief: The RadioCustomItem + */ + +#include +#include + +#include "GlRadioCustomItem.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + + +const int RadioCustomItem::IDA_FORMAT_STRING = 500; + + +RadioCustomItem::RadioCustomItem(void) + : __isSelected(false) + , __width(0) + , __height(0) +{ +} + +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_RADIO); + + return r; +} + +void +RadioCustomItem::SetText(const Tizen::Base::String& text) +{ + __text = text; +} + +String +RadioCustomItem::GetText(void) const +{ + return __text; +} + +result +RadioCustomItem::Make(int fontSize) +{ + result r = E_FAILURE; + Color textColor = CUSTOM_COLOR_LISTVIEW_TEXT2; + Color pressedTextColor = CUSTOM_COLOR_LISTVIEW_TEXT; + + AppLogDebug("RadioCustomItem::the text is %ls",__text.GetPointer()); + r = AddElement(Rectangle(16, 5, __width - 85 - 16, __height), IDA_FORMAT_STRING, __text, fontSize, textColor, textColor, textColor, true); + TryCatch(!IsFailed(r),,"RadioCustomItem::the value is %s",GetErrorMessage(r)); + + CATCH: + return r; +} + diff --git a/src/GlResourceManager.cpp b/src/GlResourceManager.cpp new file mode 100644 index 0000000..d947425 --- /dev/null +++ b/src/GlResourceManager.cpp @@ -0,0 +1,58 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlResourceManager.cpp + * @brief This is the implementation file for ResourceManager class. + */ + +#include +#include "GlResourceManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; + +Bitmap* +ResourceManager::GetBitmapN(const String& id) +{ + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + if (pAppResource == null) + { + return null; + } + + return pAppResource->GetBitmapN(id); +} + +String +ResourceManager::GetString(const String& id) +{ + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + if (pAppResource == null) + { + return L""; + } + + String str; + result r = pAppResource->GetString(id, str); + + if (r != E_SUCCESS) + { + return L""; + } + return str; +} diff --git a/src/GlSettingMainForm.cpp b/src/GlSettingMainForm.cpp new file mode 100644 index 0000000..d0d079a --- /dev/null +++ b/src/GlSettingMainForm.cpp @@ -0,0 +1,793 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSettingMainForm.cpp + * @brief This is the implementation file for SettingMainForm class. + */ + +#include "GlDropDownCustomItem.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlRadioCustomItem.h" +#include "GlResourceManager.h" +#include "GlSettingMainForm.h" +#include "GlSettingPresentationModel.h" +#include "GlSettingToggleCustomItem.h" +#include "GlTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +SettingMainForm::SettingMainForm(void) + : __pList(null) + , __pPresentationModel(null) + , __contentUpdated(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +SettingMainForm::~SettingMainForm(void) +{ + AppLogDebug("ENTER"); + if (pGroupItemCount) + { + delete[] pGroupItemCount; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +SettingMainForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(IDL_FORM_SETTING_MAIN); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +SettingMainForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = SettingPresentationModel::GetInstance(); + SettingInfo::AddSettingEventListener(*this); + + Header* pHeader = GetHeader(); + AppAssert(pHeader); + pHeader->SetStyle(HEADER_STYLE_TITLE); + pHeader->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_GALLERY")); + + __pList = static_cast(GetControl(L"IDC_SETTING_LIST")); + + if (__pList != null) + { + __pList->SetItemProvider(*this); + __pList->AddGroupedListViewItemEventListener(*this); + } + + SetFormBackEventListener(this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +SettingMainForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + SettingInfo::RemoveSettingEventListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +void +SettingMainForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + default: + { + break; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingMainForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null) + { + if (pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_CONFIGURE) + { + if (pApp->GetFrameActivated() == true) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_TERMINATED, null); + pApp->Terminate(); + } + } + else + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (__contentUpdated) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST)); + } + else + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + } + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingMainForm::OnContentUpdated(void) +{ + AppLogDebug("ENTER"); + __contentUpdated = true; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingMainForm::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + FileListPresentationModel::GetInstance()->AddContentEventListener(this); + __pPresentationModel->CreateDefaultRegistry(); + InitializeSettingValues(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingMainForm::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + __contentUpdated = false; + __pPresentationModel->DeleteRegistry(); + FileListPresentationModel::GetInstance()->RemoveContentEventListener(this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingMainForm::OnGroupedListViewItemStateChanged(GroupedListView& listView, int groupIndex, int itemIndex, int elementId, ListItemStatus status) +{ + int effectiveIndex = 0; + int inputValue = 0; + + 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; + } + } + + Invalidate(true); + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_TOGGLE) + { + if (settingInfo[effectiveIndex].isSelected == true) + { + settingInfo[effectiveIndex].isSelected = false; + } + else + { + settingInfo[effectiveIndex].isSelected = true; + } + if (__pList != null) + { + __pList->SetItemChecked(groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); + } + } + + switch (effectiveIndex) + { + case SETTING_INTERVAL_2: + { + inputValue = 2; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, + inputValue); + listView.UpdateList(); + } + break; + + case SETTING_INTERVAL_3: + { + inputValue = 3; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_INTERVAL_5: + { + inputValue = 5; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_INTERVAL_10: + { + inputValue = 10; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_INTERVAL_20: + { + inputValue = 20; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_TRANSITION_PAGE: + { + inputValue = 0; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_TRANSITION_DISSOLVE: + { + inputValue = 1; + result r = __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT, inputValue); + if (r == E_SUCCESS) + { + AppLogDebug(" Passed"); + } + + listView.UpdateList(); + } + break; + + case SETTING_TRANSITION_ZOOM: + { + inputValue = 2; + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT, inputValue); + listView.UpdateList(); + } + break; + + case SETTING_REPEAT: + { + int repeatValue = 0; + + __pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_REPEAT_VALUE, repeatValue); + + if (repeatValue == 0) + { + inputValue = 1; + } + else + { + inputValue = 0; + } + + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_REPEAT_VALUE, inputValue); + } + break; + + case SETTING_SHUFFLE: + { + int shuffleValue = 0; + + __pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SHUFFLE_VALUE, shuffleValue); + + if (shuffleValue == 0) + { + inputValue = 1; + } + else + { + inputValue = 0; + } + + __pPresentationModel->SetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SHUFFLE_VALUE, inputValue); + } + break; + + default: + break; + } +} + +GroupItem* +SettingMainForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + GroupItem* pItem = new (std::nothrow) GroupItem(); + if (pItem == null) + { + return null; + } + result r = pItem->Construct(Dimension(itemWidth, 46)); + if (IsFailed(r)) + { + delete pItem; + return null; + } + + String text; + switch (groupIndex) + { + case 0: + text = ResourceManager::GetString(L"IDS_MEDIABR_OPT_SLIDESHOW"); + break; + + default: + break; + } + + pItem->SetElement(text, null); + + AppLogDebug("background color set result %s", GetErrorMessage(r)); + + pItem->SetTextColor(CUSTOM_COLOR_SETTINGS_GROUPTITLE); + return pItem; +} + +ListItemBase* +SettingMainForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLog("SettingMainForm::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; + const Color ITEM_BACKGROUND_COLOR_HIGHLIGHTED = CUSTOM_BACKGROUND_COLOR_LISTVIEW_PRESSED_HIGHLIGHTED; + + effectiveIndex = effectiveIndex + itemIndex; + AppLogDebug("SettingMainForm::CreateItem --> groupIndex : %d, itemIndex: %d itemWidth: %d effectiveIndex %d", groupIndex, itemIndex, itemWidth, effectiveIndex); + + String fontSizeStr; + int fontSize = 0; + int itemHeight = 0; + int defaultHeight = 112; + int defaultFontSize = 44; + + SettingInfo::GetValue("http://tizen.org/setting/font.size", fontSizeStr); + AppLog("the font value is %S",fontSizeStr.GetPointer()); + + if(fontSizeStr == "medium") + { + fontSize = 44; + itemHeight = defaultHeight + (fontSize - defaultFontSize); + } + else if(fontSizeStr == "huge") + { + fontSize = 81; + itemHeight = defaultHeight + (fontSize - defaultFontSize); + } + else if(fontSizeStr == "giant") + { + fontSize = 98; + itemHeight = defaultHeight + (fontSize - defaultFontSize); + } + else if(fontSizeStr == "small") + { + fontSize = 36; + itemHeight = defaultHeight + (fontSize - defaultFontSize); + } + else if(fontSizeStr == "large") + { + fontSize = 64; + itemHeight = defaultHeight + (fontSize - defaultFontSize); + } + else + { + fontSize = 44; + itemHeight = defaultHeight; + } + + + if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_TOGGLE) + { + SettingToggleCustomItem* pItem = new (std::nothrow) SettingToggleCustomItem(); + r = pItem->Construct(itemWidth, itemHeight); + + if (IsFailed(r)) + { + delete pItem; + return null; + } + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, ITEM_BACKGROUND_COLOR_HIGHLIGHTED); + + if (__pList != null) + { + __pList->SetItemChecked(groupIndex, itemIndex, settingInfo[effectiveIndex].isSelected); + } + + pItem->SetText(settingInfo[effectiveIndex].titleText); + pItem->Make(fontSize); + + return pItem; + } + else if (settingInfo[effectiveIndex].itemType == ITEM_TYPE_DROPDOWN) + { + DropDownCustomItem* pItem = new (std::nothrow) DropDownCustomItem(); + r = pItem->Construct(itemWidth,itemHeight); + if (IsFailed(r)) + { + delete pItem; + return null; + } + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, ITEM_BACKGROUND_COLOR_HIGHLIGHTED); + + 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(fontSize,itemHeight); + + 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) + { + r = pItem->Construct(itemWidth, 0); + __pList->SetItemEnabled(groupIndex, itemIndex,false); + AppLogDebug("construct with height 0 %s", GetErrorMessage(r)); + return pItem; + } + else + { + pItem->Construct(itemWidth, itemHeight); + __pList->SetItemEnabled(groupIndex, itemIndex, true); + } + + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, ITEM_RADIO_ITEM_BACKGROUND_COLOR); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, ITEM_BACKGROUND_COLOR_HIGHLIGHTED); + + pItem->SetText(settingInfo[effectiveIndex].titleText); + AppLogDebug("effectiveIndex %d SettingInfo[effectiveIndex].isSelected %d", effectiveIndex, settingInfo[effectiveIndex].isSelected); + + __pList->SetItemChecked(groupIndex,itemIndex,settingInfo[effectiveIndex].isSelected); + pItem->Make(fontSize); + + return pItem; + } + else + { + return null; + } +} + +bool +SettingMainForm::DeleteGroupItem(int groupIndex, GroupItem* pItem, int itemWidth) +{ + delete pItem; + return true; +} + +bool +SettingMainForm::DeleteItem(int groupIndex, int itemIndex, ListItemBase* pItem, int itemWidth) +{ + delete pItem; + return true; +} + +int +SettingMainForm::GetGroupCount(void) +{ + int groupCount = 1; + + return groupCount; +} + +int +SettingMainForm::GetItemCount(int groupIndex) +{ + AppLog(" SettingMainForm::GetItemCount --> groupIndex : %d,", groupIndex); + return pGroupItemCount[groupIndex]; +} + +void +SettingMainForm::InitializeSettingValues(void) +{ + pGroupItemCount = new (std::nothrow) int[1]; + pGroupItemCount[0] = 12; + int interval = 0; + int transitionValue = 0; + int repeatValue = 0; + int shuffletValue = 0; + String selectedInterval; + String selectedTransition; + + for (int iter = (int) SETTING_INVALID + 1; iter < (int) SETTING_MAX; ++iter) + { + settingInfo[iter].isSelected = false; + } + + result r =__pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL, + interval); + + if (r == E_SUCCESS) + { + switch (interval) + { + case 2: + { + selectedInterval = ResourceManager::GetString(L"IDS_MEDIABR_OPT_2_SECONDS"); + settingInfo[SETTING_INTERVAL_2].isSelected = true; + } + break; + + case 3: + { + selectedInterval = ResourceManager::GetString(L"IDS_MEDIABR_OPT_3_SECONDS"); + settingInfo[SETTING_INTERVAL_3].isSelected = true; + } + break; + + case 5: + { + selectedInterval = ResourceManager::GetString(L"IDS_MEDIABR_BODY_5_SECONDS"); + settingInfo[SETTING_INTERVAL_5].isSelected = true; + } + break; + + case 10: + { + selectedInterval = ResourceManager::GetString(L"IDS_MEDIABR_BODY_10_SECONDS"); + settingInfo[SETTING_INTERVAL_10].isSelected = true; + } + break; + + case 20: + { + selectedInterval = ResourceManager::GetString(L"IDS_MEDIABR_BODY_20_SECONDS"); + settingInfo[SETTING_INTERVAL_20].isSelected = true; + } + break; + + default: + break; + } + } + + r = __pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT, transitionValue); + + if (r == E_SUCCESS) + { + switch (transitionValue) + { + case 0: + { + selectedTransition = ResourceManager::GetString(L"IDS_EBOOK_BODY_PAGE"); + settingInfo[SETTING_TRANSITION_PAGE].isSelected = true; + } + break; + + case 1: + { + selectedTransition = ResourceManager::GetString(L"IDS_MEDIABR_BODY_DISSOLVE"); + settingInfo[SETTING_TRANSITION_DISSOLVE].isSelected = true; + } + break; + + case 2: + { + selectedTransition = ResourceManager::GetString(L"IDS_IV_OPT_ZOOM"); + settingInfo[SETTING_TRANSITION_ZOOM].isSelected = true; + } + break; + + default: + break; + } + } + + settingInfo[SETTING_SLIDESHOW_INTERVAL_TITLE].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_SLIDESHOW_INTERVAL"); + settingInfo[SETTING_SLIDESHOW_INTERVAL_TITLE].subText = selectedInterval; + settingInfo[SETTING_SLIDESHOW_INTERVAL_TITLE].itemType = ITEM_TYPE_DROPDOWN; + + settingInfo[SETTING_INTERVAL_2].titleText = ResourceManager::GetString(L"IDS_MEDIABR_OPT_2_SECONDS"); + settingInfo[SETTING_INTERVAL_2].subText = L""; + settingInfo[SETTING_INTERVAL_2].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_INTERVAL_3].titleText = ResourceManager::GetString(L"IDS_MEDIABR_OPT_3_SECONDS"); + settingInfo[SETTING_INTERVAL_3].subText = L""; + settingInfo[SETTING_INTERVAL_3].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_INTERVAL_5].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_5_SECONDS"); + settingInfo[SETTING_INTERVAL_5].subText = L""; + settingInfo[SETTING_INTERVAL_5].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_INTERVAL_10].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_10_SECONDS"); + settingInfo[SETTING_INTERVAL_10].subText = L""; + settingInfo[SETTING_INTERVAL_10].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_INTERVAL_20].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_20_SECONDS"); + settingInfo[SETTING_INTERVAL_20].subText = L""; + settingInfo[SETTING_INTERVAL_20].itemType = ITEM_TYPE_RADIO; + + r = __pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, ENTRY_NAME_IMAGE_VIEWER_REPEAT_VALUE, repeatValue); + + settingInfo[SETTING_REPEAT].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_REPEAT"); + settingInfo[SETTING_REPEAT].itemType = ITEM_TYPE_TOGGLE; + + if (repeatValue == 0) + { + settingInfo[SETTING_REPEAT].isSelected = false; + } + else + { + settingInfo[SETTING_REPEAT].isSelected = true; + } + + r = __pPresentationModel->GetValue(SECTION_NAME_IMAGE_VIEWER, + ENTRY_NAME_IMAGE_VIEWER_SHUFFLE_VALUE, shuffletValue); + + settingInfo[SETTING_SHUFFLE].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_SHUFFLE"); + settingInfo[SETTING_SHUFFLE].itemType = ITEM_TYPE_TOGGLE; + + if (shuffletValue == 0) + { + settingInfo[SETTING_SHUFFLE].isSelected = false; + } + else + { + settingInfo[SETTING_SHUFFLE].isSelected = true; + } + + settingInfo[SETTING_TRANSITION_EFFECT_TITLE].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_TRANSITION_EFFECT"); + settingInfo[SETTING_TRANSITION_EFFECT_TITLE].subText = selectedTransition; + settingInfo[SETTING_TRANSITION_EFFECT_TITLE].itemType = ITEM_TYPE_DROPDOWN; + + settingInfo[SETTING_TRANSITION_PAGE].titleText = ResourceManager::GetString(L"IDS_EBOOK_BODY_PAGE"); + settingInfo[SETTING_TRANSITION_PAGE].subText = L""; + settingInfo[SETTING_TRANSITION_PAGE].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_TRANSITION_DISSOLVE].titleText = ResourceManager::GetString(L"IDS_MEDIABR_BODY_DISSOLVE"); + settingInfo[SETTING_TRANSITION_DISSOLVE].subText = L""; + settingInfo[SETTING_TRANSITION_DISSOLVE].itemType = ITEM_TYPE_RADIO; + + settingInfo[SETTING_TRANSITION_ZOOM].titleText = ResourceManager::GetString(L"IDS_IV_OPT_ZOOM"); + settingInfo[SETTING_TRANSITION_ZOOM].subText = L""; + settingInfo[SETTING_TRANSITION_ZOOM].itemType = ITEM_TYPE_RADIO; +} + +SettingMainForm::SettingItemInfo::SettingItemInfo(void) + : childCount(0) + , isOpen(false) + , isSelected(false) +{ +} + + +void +SettingMainForm::OnSettingChanged(String& key) +{ + AppLogDebug("ENTER"); + if (key == L"http://tizen.org/setting/font.size") + { + __pList->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/GlSettingPresentationModel.cpp b/src/GlSettingPresentationModel.cpp new file mode 100644 index 0000000..efd01c8 --- /dev/null +++ b/src/GlSettingPresentationModel.cpp @@ -0,0 +1,245 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlSettingPresentationModel.cpp + * @brief This is the implementation file for SettingPresentationModel class. + */ + +#include +#include "GlSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Io; + +static const int DEFAULT_VALUE_EFFECT_SLIDE = 0; +static const int DEFAULT_VALUE_INTERVAL = 3; +static const int DEFAULT_VALUE_REPEAT = 0; +static const int DEFAULT_VALUE_SHUFFLE = 0; + +const wchar_t* GALLERY_APP_ID = L"ijudt7w61q.Gallery"; + +const wchar_t* PATH_DATA_DIRECTORY = L"data/"; +const wchar_t* PATH_GALLERY_DEFAULT_SETTINGS = L"GalleryDefaultSettings.ini"; + +const wchar_t* SECTION_GALLERY = L"GALLRY_SETTING"; +const wchar_t* SECTION_IMAGE_VIEWER = L"IMAGE_VIEWER_SETTING"; +const wchar_t* SECTION_VIDEO_PLAYER = L"VIDEO_PLAYER_SETTING"; + +const wchar_t* SLIDESHOW_INTERVAL_VALUE = L"SLIDESHOW_INTERVAL_VALUE"; +const wchar_t* TRANSITION_EFFECT_VALUE = L"TRANSITION_EFFECT_VALUE"; +const wchar_t* REPEAT_VALUE = L"REPEAT_VALUE"; +const wchar_t* SHUFFLE_VALUE = L"SHUFFLE_VALUE"; + +SettingPresentationModel* SettingPresentationModel::__pPresentationModelInstance = null; + +SettingPresentationModel::SettingPresentationModel(void) + : __pDefaultGalleryRegistry(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +SettingPresentationModel::~SettingPresentationModel(void) +{ + AppLogDebug("ENTER"); + delete __pDefaultGalleryRegistry; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +SettingPresentationModel* +SettingPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModelInstance == null) + { + CreateInstance(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pPresentationModelInstance; +} + +result +SettingPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + return E_SUCCESS; +} + +void +SettingPresentationModel::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pPresentationModelInstance = new (std::nothrow) SettingPresentationModel; + result r = __pPresentationModelInstance->Construct(); + + if (IsFailed(r) == true) + { + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +SettingPresentationModel::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + delete __pPresentationModelInstance; + __pPresentationModelInstance = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +SettingPresentationModel::GetValue(const String& strSectionName, const String& entryName, int& value) const +{ + AppLogDebug("ENTER"); + result r = __pDefaultGalleryRegistry->GetValue(strSectionName, entryName, value); + TryCatch(r == E_SUCCESS,, "Registry::GetValue() failed[%s]", GetErrorMessage(r)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; + +CATCH: + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +SettingPresentationModel::GetValue(const String& strSectionName, const String& entryName, String& value) const +{ + AppLogDebug("ENTER"); + result r = __pDefaultGalleryRegistry->GetValue(strSectionName, entryName, value); + TryCatch(r == E_SUCCESS,, "Registry::GetValue() failed[%s]", GetErrorMessage(r)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; + +CATCH: + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +SettingPresentationModel::SetValue(const String& strSectionName, const String& entryName, const int value) +{ + AppLogDebug("ENTER"); + result r= __pDefaultGalleryRegistry->SetValue(strSectionName, entryName, value); + TryCatch(r == E_SUCCESS,, "Registry::SetValue() failed[%s]", GetErrorMessage(r)); + r = __pDefaultGalleryRegistry->Flush(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; + +CATCH: + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +SettingPresentationModel::SetValue(const String& strSectionName, const String& entryName, const String& value) +{ + AppLogDebug("ENTER"); + result r = __pDefaultGalleryRegistry->SetValue(strSectionName, entryName, value); + TryCatch(r == E_SUCCESS,, "Registry::SetValue() failed[%s]", GetErrorMessage(r)); + r = __pDefaultGalleryRegistry->Flush(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; + +CATCH: + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +SettingPresentationModel::CreateDefaultRegistry(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppManager* pAppManager = AppManager::GetInstance(); + TryReturn(pAppManager != null, E_FAILURE, "Failed to get AppManager"); + String pathGalleryDefaultSetting = + pAppManager->GetAppSharedPath(GALLERY_APP_ID) + PATH_DATA_DIRECTORY + PATH_GALLERY_DEFAULT_SETTINGS; + AppLogDebug("pathGalleryDefaultSetting(%ls)", pathGalleryDefaultSetting.GetPointer()); + + __pDefaultGalleryRegistry = new (std::nothrow) Registry(); + if (File::IsFileExist(pathGalleryDefaultSetting)) + { + AppLogDebug("Already exist default settings file"); + + __pDefaultGalleryRegistry->Construct(pathGalleryDefaultSetting, "r+"); + } + else + { + AppLogDebug("Creating default settings file"); + + __pDefaultGalleryRegistry->Construct(pathGalleryDefaultSetting, "w+"); + r = __pDefaultGalleryRegistry->AddSection(SECTION_IMAGE_VIEWER); + TryCatch(r == E_SUCCESS,, "Registry::AddSection() failed[%s]", GetErrorMessage(r)); + + r = __pDefaultGalleryRegistry->AddValue(SECTION_IMAGE_VIEWER, SLIDESHOW_INTERVAL_VALUE, + DEFAULT_VALUE_INTERVAL); + TryCatch(r == E_SUCCESS,, "Registry::AddValue() failed[%s]", GetErrorMessage(r)); + + r = __pDefaultGalleryRegistry->AddValue(SECTION_IMAGE_VIEWER, TRANSITION_EFFECT_VALUE, + DEFAULT_VALUE_EFFECT_SLIDE); + TryCatch(r == E_SUCCESS,, "Registry::AddValue() failed[%s]", GetErrorMessage(r)); + + r = __pDefaultGalleryRegistry->AddValue(SECTION_IMAGE_VIEWER, REPEAT_VALUE, + DEFAULT_VALUE_REPEAT); + TryCatch(r == E_SUCCESS,, "Registry::AddValue() failed[%s]", GetErrorMessage(r)); + + r = __pDefaultGalleryRegistry->AddValue(SECTION_IMAGE_VIEWER, SHUFFLE_VALUE, + DEFAULT_VALUE_SHUFFLE); + TryCatch(r == E_SUCCESS,, "Registry::AddValue() failed[%s]", GetErrorMessage(r)); + + r = __pDefaultGalleryRegistry->Flush(); + TryCatch(r == E_SUCCESS,, "Registry::Flush() failed[%s]", GetErrorMessage(r)); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; + +CATCH: + delete __pDefaultGalleryRegistry; + __pDefaultGalleryRegistry = null; + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +void +SettingPresentationModel::DeleteRegistry(void) +{ + if (__pDefaultGalleryRegistry != null ) + { + delete __pDefaultGalleryRegistry; + __pDefaultGalleryRegistry = null; + } +} diff --git a/src/GlSettingToggleCustomItem.cpp b/src/GlSettingToggleCustomItem.cpp new file mode 100644 index 0000000..d631b17 --- /dev/null +++ b/src/GlSettingToggleCustomItem.cpp @@ -0,0 +1,81 @@ +// + +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 "GlSettingToggleCustomItem.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) + : __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(const Tizen::Base::String& text) +{ + __text = text; +} + +String +SettingToggleCustomItem::GetText(void) const +{ + return __text; +} + +result +SettingToggleCustomItem::Make(int fontSize) +{ + const Color textColor = CUSTOM_COLOR_TRANSPARENT; + const Color pressedTextColor = CUSTOM_COLOR_TRANSPARENT; + const int X_Margin = 26; + const int Y_Margin = 26; + + AddElement(Rectangle(X_Margin, Y_Margin, __width - 200, __height - 2* Y_Margin), IDA_FORMAT_STRING, __text, fontSize, textColor, pressedTextColor, pressedTextColor, true); + + return E_SUCCESS; +} diff --git a/src/GlSlideShowPopUp.cpp b/src/GlSlideShowPopUp.cpp new file mode 100644 index 0000000..2a5a10e --- /dev/null +++ b/src/GlSlideShowPopUp.cpp @@ -0,0 +1,181 @@ +// +// Tizen Native SDK +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 SlideShowPopUp.cpp + * @brief This file contains the definitions of the SlideShowPopUp class. + */ + +#include + +#include "GlResourceManager.h" +#include "GlSlideSettingListener.h" +#include "GlSlideShowPopUp.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 ID_FORMAT_START = 501; +static const int ID_FORMAT_SETTING = 502; +static const int ID_CANCEL_BUTTON = 503; + +SlideShowPopUp::SlideShowPopUp(void) + : __pList(null) + , __pListener(null) +{ +} + +SlideShowPopUp::~SlideShowPopUp(void) +{ +} + +bool +SlideShowPopUp::Initialize(void) +{ + Button* pCancelButton = null; + Popup::Construct(L"IDL_SLIDESHOW_SETTING_POPUP"); + Popup::SetPropagatedKeyEventListener(this); + + __pList = static_cast(GetControl(L"IDC_POPUP_LIST")); + + if (__pList == null) + { + return false; + } + + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + + pCancelButton = static_cast(GetControl(L"IDC_BUTTON", true)); + + if (pCancelButton != null) + { + pCancelButton->AddActionEventListener(*this); + pCancelButton->SetActionId(ID_CANCEL_BUTTON); + } + + return true; +} + +result +SlideShowPopUp::OnTerminating(void) +{ + return E_SUCCESS; +} + +void +SlideShowPopUp::OnActionPerformed(const Control& source, int actionId) +{ + switch (actionId) + { + case ID_CANCEL_BUTTON: + { + Popup::SetShowState(false); + Popup::Show(); + } + break; + + default: + break; + } + return; +} + +void +SlideShowPopUp::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status) +{ + if (__pListener != null) + { + __pListener->OnSlideSettingPopUpItemSelected(index); + } +} + +bool +SlideShowPopUp::OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if(keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + Popup::SetShowState(false); + Popup::Show(); + } + return false; +} + +ListItemBase* +SlideShowPopUp::CreateItem(int index, int itemWidth) +{ + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + int listItemHeight = 112; + + CustomItem* pItem = new (std::nothrow) CustomItem(); + result r = pItem->Construct(Dimension(GetClientAreaBounds().width, listItemHeight), style); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, Color::GetColor(COLOR_ID_WHITE)); + + if (IsFailed(r)) + { + AppLogDebug("Create Item Failed with error %s", GetErrorMessage(r)); + return null; + } + + switch (index) + { + case 0: + { + pItem->AddElement(Rectangle(25, 0, GetClientAreaBounds().width -50, listItemHeight), ID_FORMAT_START, + ResourceManager::GetString(L"IDS_MEDIABR_OPT_START_SLIDESHOW"), true); + } + break; + + case 1: + { + pItem->AddElement(Rectangle(25, 0, GetClientAreaBounds().width -50, listItemHeight), ID_FORMAT_SETTING, + ResourceManager::GetString(L"IDS_MEDIABR_BODY_SLIDESHOW_SETTINGS"), true); + } + break; + + break; + default: + break; + } + + return pItem; +} + +bool +SlideShowPopUp::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + return true; +} + +int +SlideShowPopUp::GetItemCount(void) +{ + return 2; +} + +void +SlideShowPopUp::SetEventListner(ISlideSettingListener* listner) +{ + __pListener = listner; +} diff --git a/src/GlThumbnailEvent.cpp b/src/GlThumbnailEvent.cpp new file mode 100644 index 0000000..afed0c2 --- /dev/null +++ b/src/GlThumbnailEvent.cpp @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailEvent.cpp + * @brief This is the implementation file for ThumbnailEvent class. + */ + +#include +#include "GlThumbnailEvent.h" +#include "GlThumbnailEventListener.h" + +using namespace Tizen::Base::Runtime; + +ThumbnailEvent::~ThumbnailEvent(void) +{ +} + +void +ThumbnailEvent::FireImpl(IEventListener& listener, const IEventArg& eventArg) +{ + IThumbnailEventListener* plistener = static_cast (&listener); + if (plistener != null) + { + plistener->OnThumbnailReceivedN(*(const_cast(&eventArg))); + } +} diff --git a/src/GlThumbnailEventArg.cpp b/src/GlThumbnailEventArg.cpp new file mode 100644 index 0000000..7e1f347 --- /dev/null +++ b/src/GlThumbnailEventArg.cpp @@ -0,0 +1,58 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailEventArg.cpp + * @brief This is the implementation file for ThumbnailEventArg class. + */ + +#include +#include "GlThumbnailEventArg.h" +#include "GlThumbnailInfo.h" + +using namespace std; +using namespace Tizen::Graphics; + +ThumbnailEventArg::ThumbnailEventArg(ThumbnailInfo* pThumbnailInfo) + : _pThumbnailInfo(pThumbnailInfo) +{ +} + +ThumbnailEventArg::~ThumbnailEventArg(void) +{ + if (_pThumbnailInfo != null) + { + delete _pThumbnailInfo; + } +} + +ThumbnailInfo* +ThumbnailEventArg::GetThumbnailInfoN(void) +{ + if (_pThumbnailInfo == null) + { + return null; + } + + Bitmap* pBitmap = _pThumbnailInfo->GetBitmapN(); + ThumbnailInfo* pThumbnailInfo = new (std::nothrow) ThumbnailInfo(); + pThumbnailInfo->Construct(_pThumbnailInfo->GetContentId(), _pThumbnailInfo->GetFilePath(), + *pBitmap, _pThumbnailInfo->GetContentType(), _pThumbnailInfo->GetDuration()); + + delete pBitmap; + + return pThumbnailInfo; +} diff --git a/src/GlThumbnailInfo.cpp b/src/GlThumbnailInfo.cpp new file mode 100755 index 0000000..87c3cd9 --- /dev/null +++ b/src/GlThumbnailInfo.cpp @@ -0,0 +1,140 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailInfo.cpp + * @brief This is the implementation file for ThumbnailInfo class. + */ + +#include +#include "GlThumbnailInfo.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Content; +using namespace Tizen::Graphics; + +ThumbnailInfo::ThumbnailInfo(void) + : __pBitmap(null) + , __contentType(CONTENT_TYPE_IMAGE) + , __duration(0) +{ +} + +ThumbnailInfo::~ThumbnailInfo(void) +{ + delete __pBitmap; +} + +void +ThumbnailInfo::Construct(const ContentId& contentId, const String& filePath, + const Bitmap& bitmap, const ContentType contentType, const long duration) +{ + __contentId = contentId; + __filePath = filePath; + __pBitmap = CloneBitmapN(bitmap); + __contentType = contentType; + __duration = duration; +} + +ContentId +ThumbnailInfo::GetContentId(void) const +{ + return __contentId; +} + +String +ThumbnailInfo::GetFilePath(void) const +{ + return __filePath; +} + +void +ThumbnailInfo::SetFilePath(const String& filePath) +{ + if (&filePath == null) + { + __filePath = EMPTY_SPACE; + } + else + { + __filePath = filePath; + } +} + +Bitmap* +ThumbnailInfo::GetBitmapN(void) const +{ + return CloneBitmapN(*__pBitmap); +} + +void +ThumbnailInfo::SetBitmap(const Bitmap& bitmap) +{ + if (__pBitmap) + { + delete __pBitmap; + } + __pBitmap = CloneBitmapN(bitmap); +} + +ContentType +ThumbnailInfo::GetContentType(void) const +{ + return __contentType; +} + +void +ThumbnailInfo::SetContentType(ContentType contentType) +{ + __contentType = contentType; +} + +long +ThumbnailInfo::GetDuration(void) const +{ + return __duration; +} + +void +ThumbnailInfo::SetDuration(long duration) +{ + __duration = duration; +} + +Bitmap* +ThumbnailInfo::CloneBitmapN(const Bitmap& bitmap) const +{ + Bitmap* pResultBitmap = null; + if (&bitmap != null) + { + Rectangle mainRect(0, 0, bitmap.GetWidth(), bitmap.GetHeight()); + Canvas mainCanvas; + mainCanvas.Construct(mainRect); + mainCanvas.DrawBitmap(mainRect, bitmap); + pResultBitmap = new (std::nothrow) Bitmap(); + result r = pResultBitmap->Construct(mainCanvas, mainRect); + TryCatch(r == E_SUCCESS,, "pResultBitmap->Construct Failed:%s", GetErrorMessage(r)); + } + return pResultBitmap; + +CATCH: + delete pResultBitmap; + pResultBitmap = null; + + return null; + +} diff --git a/src/GlThumbnailJob.cpp b/src/GlThumbnailJob.cpp new file mode 100644 index 0000000..96dbccd --- /dev/null +++ b/src/GlThumbnailJob.cpp @@ -0,0 +1,70 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailJob.cpp + * @brief This is the implementation file for ThumbnailJob class. + */ + +#include +#include "GlThumbnailEvent.h" +#include "GlThumbnailJob.h" + +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; + +ThumbnailJob::ThumbnailJob(void) + : __requestId(0) + , __pRequestEvent(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ThumbnailJob::~ThumbnailJob(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ThumbnailJob::Construct(const ContentId& contentId, const unsigned long requestId, + const ThumbnailEvent* pRequestEvent) +{ + AppLogDebug("ENTER"); + __contentId = contentId; + __requestId = requestId; + __pRequestEvent = pRequestEvent; + AppLogDebug("EXIT"); +} + +ContentId +ThumbnailJob::GetContentId(void) const +{ + return __contentId; +} + +unsigned long +ThumbnailJob::GetRequestId(void) const +{ + return __requestId; +} + +const ThumbnailEvent* +ThumbnailJob::GetEvent(void) const +{ + return __pRequestEvent; +} diff --git a/src/GlThumbnailProvider.cpp b/src/GlThumbnailProvider.cpp new file mode 100644 index 0000000..3d24a20 --- /dev/null +++ b/src/GlThumbnailProvider.cpp @@ -0,0 +1,448 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlThumbnailProvider.cpp + * @brief This is the implementation file for ThumbnailProvider class. + */ + +#include +#include +#include +#include "GlResourceManager.h" +#include "GlThumbnailEvent.h" +#include "GlThumbnailEventArg.h" +#include "GlThumbnailJob.h" +#include "GlThumbnailProvider.h" +#include "GlTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; + +ThumbnailProvider* ThumbnailProvider::__pThumbnailProviderInstance = null; +ArrayList* ThumbnailProvider::__pThumbnailEventListener = null; + +ThumbnailProvider::ThumbnailProvider(void) + : __pMutexCmd(null) + , __pCmdQueue(null) + , __requestId(0) + , __isAppTerminating(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailProvider::~ThumbnailProvider(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance != null) + { + __pThumbnailProviderInstance->Stop(); + __pThumbnailProviderInstance->Join(); + } + + if (__pThumbnailEventListener != null) + { + delete __pThumbnailEventListener; + } + + if (__pMutexCmd != null) + { + delete __pMutexCmd; + } + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailProvider* +ThumbnailProvider::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance == null) + { + CreateInstance(); + __pThumbnailProviderInstance->Start(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __pThumbnailProviderInstance; +} + +result +ThumbnailProvider::Construct(void) +{ + AppLogDebug("ENTER"); + + __pThumbnailEventListener = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = __pThumbnailEventListener->Construct(); + TryCatch(r == E_SUCCESS,, "[%s] Unable to set event listener", GetErrorMessage(r)); + + __pMutexCmd = new (std::nothrow) Mutex(); + r = __pMutexCmd->Create(); + TryCatch(r == E_SUCCESS,, "[%s] Unable to create mutex", GetErrorMessage(r)); + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + } + __pCmdQueue = new (std::nothrow) ArrayList(SingleObjectDeleter); + r = __pCmdQueue->Construct(); + TryCatch(r == E_SUCCESS,, "[%s] Unable to construct queue", GetErrorMessage(r)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return EventDrivenThread::Construct(); + +CATCH: + if (__pThumbnailEventListener != null) + { + delete __pThumbnailEventListener; + __pThumbnailEventListener = null; + } + + if (__pMutexCmd != null) + { + delete __pMutexCmd; + __pMutexCmd = null; + } + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + __pCmdQueue = null; + } + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + + return E_FAILURE; +} + +void +ThumbnailProvider::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pThumbnailProviderInstance = new (std::nothrow) ThumbnailProvider(); + result r = __pThumbnailProviderInstance->Construct(); + + if (IsFailed(r) == true) + { + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::Release(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance != null) + { + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::RequestThumbnail(const ContentId& contentId, const ThumbnailEvent* event) +{ + AppLogDebug("ENTER"); + AppLogDebug("[THREAD] Request Job - (MainThread)"); + + if (contentId.ToString().IsEmpty() == true || event == null + || __pMutexCmd == null || __pCmdQueue == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + __pMutexCmd->Acquire(); + + AppLogDebug("__pMutexCmd: %x", __pMutexCmd); + + ThumbnailJob* pThumbnailJob = new (std::nothrow) ThumbnailJob(); + AppLogDebug("pThumbnailJob: %x", pThumbnailJob); + pThumbnailJob->Construct(contentId, ++__requestId, event); + __pCmdQueue->Add(pThumbnailJob); + + __pMutexCmd->Release(); + + SendUserEvent(null, null); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::ClearThumbnailRequests(const bool appTerminating) +{ + AppLogDebug("ENTER"); + if (__pMutexCmd != null) + { + __pMutexCmd->Acquire(); + if (__pCmdQueue != null && __pCmdQueue->GetCount() > 0) + { + __pCmdQueue->RemoveAll(true); + } + + if (appTerminating == true) + { + __isAppTerminating = true; + } + __pMutexCmd->Release(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +bool +ThumbnailProvider::OnStart(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +ThumbnailProvider::OnStop(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::OnUserEventReceivedN(RequestId requestId, IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("[THREAD] Receive Job Message - (SubThread)"); + ThumbnailJob* pThumbnailJob = null; + ThumbnailInfo* pThumbnailInfo = null; + ContentId contentId; + + if (__pMutexCmd == null || __pCmdQueue == null) + { + delete pArgs; + AppLogDebug("EXIT1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + __pMutexCmd->Acquire(); + if (__pCmdQueue->GetCount() > 0) + { + pThumbnailJob = static_cast(__pCmdQueue->GetAt(0)); + if (pThumbnailJob == null) + { + __pCmdQueue->RemoveAt(0); + __pMutexCmd->Release(); + return; + } + + unsigned long requestId = pThumbnailJob->GetRequestId(); + ContentId contentId = pThumbnailJob->GetContentId(); + __pMutexCmd->Release(); + + pThumbnailInfo = GetThumbnailInfoN(contentId); + + __pMutexCmd->Acquire(); + pThumbnailJob = static_cast(__pCmdQueue->GetAt(0)); + + if (pThumbnailJob != null && pThumbnailInfo != null && requestId == pThumbnailJob->GetRequestId()) + { + ContentType contentType = pThumbnailInfo->GetContentType(); + if (contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO) + { + ThumbnailEvent* pThumbnailEvent = const_cast(pThumbnailJob->GetEvent()); + if (pThumbnailEvent != null) + { + if (__isAppTerminating != true) + { + ThumbnailEventArg* pSendingArg = new (std::nothrow)ThumbnailEventArg(pThumbnailInfo); + pThumbnailEvent->Fire(*pSendingArg); + } + } + } + else + { + delete pThumbnailInfo; + } + __pCmdQueue->RemoveAt(0, true); + } + else + { + delete pThumbnailInfo; + } + } + __pMutexCmd->Release(); + + delete pArgs; + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailInfo* +ThumbnailProvider::GetThumbnailInfoN(const ContentId& contentId) const +{ + AppLogDebug("ENTER"); + ThumbnailInfo* pNewThumbnailInfo = null; + + ContentManager contentManager; + result r = contentManager.Construct(); + if (r == E_SUCCESS) + { + Bitmap* pBitmap = null; + long duration = 0; + + ContentInfo* pContentInfo = contentManager.GetContentInfoN(contentId); + + if (pContentInfo != null) + { + String path = pContentInfo->GetContentPath(); + if (path.EndsWith(L"tif") != true + && path.EndsWith(L"tiff") != true + && path.EndsWith(L"wbmp") != true + && path.EndsWith(L"TIF") != true + && path.EndsWith(L"TIFF") != true + && path.EndsWith(L"WBMP") != true) + { + pBitmap = pContentInfo->GetThumbnailN(); + } + + if (pBitmap == null) + { + pBitmap = GetThumbnailByDecodeN(pContentInfo->GetContentPath(), pContentInfo->GetContentType()); + if (pBitmap == null) + { + pBitmap = ResourceManager::GetBitmapN(IDB_NO_CONTENTS_BROKEN); + } + } + pBitmap->Scale(DIMENSION_DEFAULT_THUMBNAIL); + + ContentType contentType = pContentInfo->GetContentType(); + + if (contentType == CONTENT_TYPE_VIDEO) + { + VideoContentInfo* pVideoContentInfo = static_cast(pContentInfo); + duration = pVideoContentInfo->GetDuration(); + } + + pNewThumbnailInfo = new (std::nothrow) ThumbnailInfo(); + pNewThumbnailInfo->Construct(contentId, pContentInfo->GetContentPath(), *pBitmap, contentType, duration); + delete pBitmap; + delete pContentInfo; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pNewThumbnailInfo; +} + +Bitmap* +ThumbnailProvider::GetThumbnailByDecodeN(const String& filePath, const ContentType contentType) const +{ + AppLogDebug("ENTER"); + Bitmap* pBitmap = null; + if (&filePath == null || filePath.GetLength() <= 0) + { + pBitmap = new (std::nothrow) Bitmap(); + pBitmap->Construct(DIMENSION_DEFAULT_THUMBNAIL, BITMAP_PIXEL_FORMAT_RGB565); + } + else + { + if (contentType == CONTENT_TYPE_IMAGE) + { + ImageBuffer pImageBuffer; + result r = pImageBuffer.Construct(filePath); + if (r == E_SUCCESS) + { + pBitmap = pImageBuffer.GetBitmapN(BITMAP_PIXEL_FORMAT_ARGB8888, BUFFER_SCALING_AUTO); + } + } + else if (contentType == CONTENT_TYPE_VIDEO) + { + VideoFrameExtractor extractor; + result r = extractor.Construct(filePath, MEDIA_PIXEL_FORMAT_RGB565LE); + if (r == E_SUCCESS) + { + ImageBuffer* pImageBuffer = extractor.GetFrameN(0); + if (pImageBuffer != null) + { + pBitmap = pImageBuffer->GetBitmapN(BITMAP_PIXEL_FORMAT_RGB565, BUFFER_SCALING_AUTO); + delete pImageBuffer; + } + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pBitmap; +} + +String +ThumbnailProvider::GetFileNameFromFullPath(const String& fullPath, bool withExt) const +{ + AppLogDebug("ENTER"); + if (fullPath.CompareTo(EMPTY_SPACE) == 0) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return EMPTY_SPACE; + } + + String delim(DIRECTORY_SEPARATOR); + StringTokenizer st(fullPath,delim); + String token; + while (st.HasMoreTokens()) + { + st.GetNextToken(token); + } + + if (withExt == true) + { + AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult())); + + return token; + } + else + { + String subDelim(FILE_EXT_SEPARATOR); + StringTokenizer subSt(token, subDelim); + String subToken; + subSt.GetNextToken(subToken); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return subToken; + } +} diff --git a/src/GlTimerBase.cpp b/src/GlTimerBase.cpp new file mode 100644 index 0000000..26db9e1 --- /dev/null +++ b/src/GlTimerBase.cpp @@ -0,0 +1,364 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlTimerBase.cpp + * @brief This is the source file for GlTimerBase class. + */ + +#include +#include + +#include "GlAlbumListPresentationModel.h" +#include "GlContentUpdateEventListener.h" +#include "GlFileListPresentationModel.h" +#include "GlProgressBar.h" +#include "GlTimerBase.h" +#include "GlTypes.h" + +using namespace Tizen::Ui; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Ui::Controls; + +GlTimerBase::GlTimerBase(IFileOpInvalidateListener* invalidateListener, enum FileActionMode actionId) + : _actionId(actionId) + , __pContentIdList(null) + , __moveToCount(0) + , __pMoveProBar(null) + , __pInvalidate(invalidateListener) + , __isStarted(false) + , __timerRes(CANCEL_BY_USER) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +GlTimerBase::~GlTimerBase(void) +{ + AppLogDebug("ENTER"); + __pInvalidate = null; + AlbumListPresentationModel::GetInstance()->RemoveTimerScanListener(); + FileListPresentationModel::GetInstance()->StopAnimation(); + AlbumListPresentationModel::GetInstance()->StopAnimation(); + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + pContentListener->ReSetTimerActive(); + + if (__pContentIdList != null && __pContentIdList->GetCount() > 0 && __isStarted) + { + __moveTimer.Cancel(); + __isStarted = false; + } + delete __pContentIdList; + if (__pMoveProBar) + { + __pMoveProBar->HideFileProgressingPopup(); + delete __pMoveProBar; + } + AppLogDebug("EXIT"); +} + +bool +GlTimerBase::StartTimer(void) +{ + AppLogDebug("ENTER"); + __pContentIdList = TimerStart(); + if (__pContentIdList != null && __pContentIdList->GetCount() > 0) + { + AppLogDebug("Starting timer"); + __pMoveProBar = new (std::nothrow) GlProgressBar(static_cast(this), + static_cast(this)); + __pMoveProBar->ShowFileProgressingPopup(__pContentIdList->GetCount(), _actionId); + __moveToCount = 0; + __moveTimer.Construct(*this); + __moveTimer.Start(60); + __isStarted = true; + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + pContentListener->SetTimerActive(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return E_SUCCESS; + } + AppLogDebug("EXIT1(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; +} + +void +GlTimerBase::CancelTimer(void) +{ + AppLogDebug("ENTER"); + __moveTimer.Cancel(); + __pMoveProBar->HideFileProgressingPopup(); + int scanCount = GetDirScanCount(); + if (scanCount > 0) + { + AlbumListPresentationModel::GetInstance()->AddTimerScanListener(this, scanCount); + ScanDirectories(); + __pInvalidate->OnScanDirStart(); + FileListPresentationModel::GetInstance()->ShowAnimation(); + AlbumListPresentationModel::GetInstance()->ShowAnimation(); + } + else + { + OnOpCancelled(CANCEL_USER); + } + __isStarted = false; + __moveToCount = 0; + __timerRes = CANCEL_BY_USER; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GlTimerBase::OnTimerScanDirComplete() +{ + AppLogDebug("OnTimerScanDirComplete ENTER"); + + AlbumListPresentationModel::GetInstance()->RemoveTimerScanListener(); + FileListPresentationModel::GetInstance()->StopAnimation(); + AlbumListPresentationModel::GetInstance()->StopAnimation(); + __pInvalidate->OnScanDirComplete(); + switch(__timerRes) + { + case CANCEL_SYS: + AppLogDebug("CANCEL_SYS"); + OnOpCancelled(CANCEL_SYS_ERROR); + break; + case CANCEL_BY_USER: + AppLogDebug("CANCEL_BY_USER"); + OnOpCancelled(CANCEL_USER); + break; + case TIMER_COMPLETE: + AppLogDebug("TIMER_COMPLETE"); + OnOpComplete(COMPLETE_SUCCESS); + break; + default: + break; + } + AppLogDebug("ENTER"); +} + +void +GlTimerBase::OnTimerExpired(Timer& timer) +{ + AppLogDebug("ENTER"); + if (&timer == &__moveTimer) + { + AppLogDebug("__pContentIdList count is %d", __pContentIdList->GetCount()); + if (__moveToCount < __pContentIdList->GetCount()) + { + AppLogDebug("__pContentIdList count is %d", __pContentIdList->GetCount()); + if (__pContentIdList->GetAt(__moveToCount) != null) + { + result r = TimerExpired(__pContentIdList->GetAt(__moveToCount)); + if (IsFailed(r)) + { + if (r == E_STORAGE_FULL || r == E_IO) + { + __moveTimer.Cancel(); + __isStarted = false; + __timerRes = CANCEL_SYS; + __pMoveProBar->HideFileProgressingPopup(); + int scanCount = GetDirScanCount(); + if ( scanCount > 0) + { + AlbumListPresentationModel::GetInstance()->AddTimerScanListener(this, scanCount); + ScanDirectories(); + __pInvalidate->OnScanDirStart(); + FileListPresentationModel::GetInstance()->ShowAnimation(); + AlbumListPresentationModel::GetInstance()->ShowAnimation(); + } + else + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_OPERATION_FAILED"), + MSGBOX_STYLE_NONE, 3000); + int modalResult; + messageBox.ShowAndWait(modalResult); + OnOpCancelled(CANCEL_SYS_ERROR); + } + AppLogDebug("OnTimerExpired EXIT(%s)", GetErrorMessage(r)); + return; + } + //If the errors are file not found etc, skip this file and move to next. + } + } + ++__moveToCount; + __pMoveProBar->IncProgress(__moveToCount); + if (__pInvalidate) + { + __pInvalidate->OnFileOpInvalidate(_actionId); + } + __moveTimer.Start(1); + __isStarted = true; + } + else + { + __moveTimer.Cancel(); + __pMoveProBar->HideFileProgressingPopup(); + int scanCount = GetDirScanCount(); + if (scanCount == 0) + { + __moveToCount = 0; + __isStarted = false; + __timerRes = TIMER_COMPLETE; + OnOpComplete(COMPLETE_SUCCESS); + return; + } + AlbumListPresentationModel::GetInstance()->AddTimerScanListener(this, scanCount); + ScanDirectories(); + __pInvalidate->OnScanDirStart(); + FileListPresentationModel::GetInstance()->ShowAnimation(); + AlbumListPresentationModel::GetInstance()->ShowAnimation(); + __isStarted = false; + __timerRes = TIMER_COMPLETE; + __moveToCount = 0; + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +GlTimerBase::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + switch (actionId) + { + case IDA_PROGRESSBAR_CANCEL: + { + CancelTimer(); + } + break; + + default: + break; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +GlTimerBase::GetMovedCount() const +{ + return __moveToCount; +} + +void +GlTimerBase::OnOpCancelled(enum FileActionCancelRes res) +{ + AppLogDebug("ENTER"); + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + pContentListener->ReSetTimerActive(); + if (__pInvalidate) + { + __pInvalidate->OnFileOpInvalidate(_actionId); + } + if (__moveToCount > 0) + { + if (__pInvalidate) + { + if (res != CANCEL_USER) + { + __pInvalidate->OnFileOpComplete(_actionId, COMPLETE_SYS_PARTIAL); + } + else + { + __pInvalidate->OnFileOpComplete(_actionId, COMPLETE_SUCCESS); + } + } + } + else + { + if (__pInvalidate) + { + if (res != CANCEL_USER) + { + __pInvalidate->OnFileOpComplete(_actionId, COMPLETE_SYS_FAILURE); + } + else + { + __pInvalidate->OnFileOpComplete(_actionId, COMPLETE_SUCCESS); + } + } + } + TimerCancel(__moveToCount, res); + AppLogDebug("EXIT"); +} + +void +GlTimerBase::OnOpComplete(enum FileActionCompleteRes res) +{ + AppLogDebug("ENTER"); + ContentUpdateEventListener* pContentListener = ContentUpdateEventListener::GetInstance(); + pContentListener->ReSetTimerActive(); + if (__pInvalidate) + { + __pInvalidate->OnFileOpInvalidate(_actionId); + __pInvalidate->OnFileOpComplete(_actionId, res); + } + TimerComplete(__moveToCount, res); + AppLogDebug("EXIT"); +} + +void +GlTimerBase::SetActionMode(const enum FileActionMode actionId) +{ + AppLogDebug("ENTER"); + _actionId = actionId; + AppLogDebug("EXIT"); +} + +bool +GlTimerBase::IsStarted(void) +{ + AppLogDebug("ENTER"); + return __isStarted; +} + +void +GlTimerBase::Cancel(void) +{ + AppLogDebug("ENTER"); + if (__isStarted) + { + __pMoveProBar->HideFileProgressingPopup(); + __moveTimer.Cancel(); + __isStarted = false; + + int scanCount = GetDirScanCount(); + if (scanCount > 0) + { + AlbumListPresentationModel::GetInstance()->AddTimerScanListener(this, scanCount); + ScanDirectories(); + __pInvalidate->OnScanDirStart(); + FileListPresentationModel::GetInstance()->ShowAnimation(); + AlbumListPresentationModel::GetInstance()->ShowAnimation(); + } + else + { + OnOpCancelled(CANCEL_SYS_ERROR); + } + } + AppLogDebug("EXIT"); +} + +bool +GlTimerBase::OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if(keyEventInfo.GetKeyCode() == KEY_BACK) + { + CancelTimer(); + } + return true; +} diff --git a/src/GlTypes.cpp b/src/GlTypes.cpp new file mode 100644 index 0000000..3f4e631 --- /dev/null +++ b/src/GlTypes.cpp @@ -0,0 +1,218 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlTypes.cpp + * @brief This is the implementation file for Types definition + */ + +#include +#include "GlTypes.h" + +using namespace Tizen::Graphics; + +const wchar_t* IDL_FORM_ALBUM_LIST = L"IDL_FORM_ALBUM_LIST"; +const wchar_t* IDL_FORM_ALBUM_LIST_EDITOR = L"IDL_FORM_ALBUM_LIST_EDITOR"; +const wchar_t* IDL_FORM_FILE_LIST = L"IDL_FORM_FILE_LIST"; +const wchar_t* IDL_FORM_SETTING_MAIN = L"IDL_FORM_SETTING_MAIN"; +const wchar_t* IDL_FORM_SETTING_INTERVAL = L"IDL_FORM_SETTING_INTERVAL"; +const wchar_t* IDL_FORM_SETTING_TRANSITION = L"IDL_FORM_SETTING_TRANSITION"; +const wchar_t* IDL_FORM_IMAGE_CROP = L"IDL_FORM_IMAGE_CROP"; + +const wchar_t* IDC_LABEL_ALBUM_LIST_EDITOR_SELECTED = L"IDC_LABEL_ALBUM_LIST_EDITOR_SELECTED"; + +const wchar_t* IDC_FORM_ALBUM_LIST = L"AlbumListForm"; +const wchar_t* IDC_FORM_ALBUM_LIST_EDITOR = L"AlbumListEditorForm"; +const wchar_t* IDC_FORM_ALBUM_NAME_EDITOR = L"AlbumNameEditorForm"; +const wchar_t* IDC_FORM_FILE_LIST = L"FileListForm"; +const wchar_t* IDC_FORM_FILE_LIST_EDITOR = L"FileListEditorForm"; +const wchar_t* IDC_FORM_SETTING_MAIN = L"SettingMainForm"; +const wchar_t* IDC_FORM_SETTING_INTERVAL = L"SettingIntervalForm"; +const wchar_t* IDC_FORM_SETTING_TRANSITION = L"SettingTransitionForm"; +const wchar_t* IDC_FORM_IMAGE_CROP = L"ImageCropForm"; + +const wchar_t* IDC_PANEL_BLANK = L""; +const wchar_t* IDC_PANEL_ALL_LIST = L"AllListPanel"; +const wchar_t* IDC_PANEL_IMAGE_LIST = L"ImageListPanel"; +const wchar_t* IDC_PANEL_VIDEO_LIST = L"VideoListPanel"; +const wchar_t* IDC_PANEL_ALL_LIST_EDITOR = L"AllListEditorPanel"; +const wchar_t* IDC_PANEL_IMAGE_LIST_EDITOR = L"ImageListEditorPanel"; +const wchar_t* IDC_PANEL_VIDEO_LIST_EDITOR = L"VideoListEditorPanel"; +const wchar_t* IDC_PANEL_ALL_LIST_SELECTION = L"AllListSelectionPanel"; + +const wchar_t* IDSCN_ALBUM_LIST = L"SceneAlbumList"; +const wchar_t* IDSCN_ALBUM_LIST_EDITOR = L"SceneAlbumListEditor"; +const wchar_t* IDSCN_ALBUM_NAME_EDITOR = L"SceneAlbumNameEditor"; +const wchar_t* IDSCN_ALL_LIST = L"SceneFileAllList"; +const wchar_t* IDSCN_IMAGE_LIST = L"SceneFileImageList"; +const wchar_t* IDSCN_VIDEO_LIST = L"SceneFileVideoList"; +const wchar_t* IDSCN_ALL_LIST_EDITOR = L"SceneFileAllListEditor"; +const wchar_t* IDSCN_IMAGE_LIST_EDITOR = L"SceneFileImageListEditor"; +const wchar_t* IDSCN_VIDEO_LIST_EDITOR = L"SceneFileVideoListEditor"; +const wchar_t* IDSCN_ALL_LIST_SELECTION = L"SceneFileAllListSelection"; +const wchar_t* IDSCN_SETTING_MAIN = L"SceneMainSetting"; +const wchar_t* IDSCN_SETTING_INTERVAL = L"SceneInvervalSetting"; +const wchar_t* IDSCN_SETTING_TRANSITION = L"SceneTransitionSetting"; +const wchar_t* IDSCN_IMAGE_CROP = L"SceneImageCrop"; + +const wchar_t* APPCONTROL_PROVIDER_ID_CAMERA = L"tizen.camera"; +const wchar_t* APPCONTROL_PROVIDER_ID_MESSAGE = L"tizen.messages"; +const wchar_t* APPCONTROL_PROVIDER_ID_EMAIL = L"tizen.email"; +const wchar_t* APPCONTROL_PROVIDER_ID_IMAGE = L"tizen.imageviewer"; + +const wchar_t* APPCONTROL_OPERATION_ID_PICK = L"http://tizen.org/appcontrol/operation/pick"; +const wchar_t* APPCONTROL_OPERATION_ID_VIEW = L"http://tizen.org/appcontrol/operation/view"; +const wchar_t* APPCONTROL_OPERATION_ID_CREATE_CONTENT = L"http://tizen.org/appcontrol/operation/create_content"; +const wchar_t* APPCONTROL_OPERATION_ID_COMPOSE = L"http://tizen.org/appcontrol/operation/compose"; +const wchar_t* APPCONTROL_OPERATION_ID_CONFIGURE = L"http://tizen.org/appcontrol/operation/configure"; +const wchar_t* APPCONTROL_OPERATION_ID_MAIN = L"http://tizen.org/appcontrol/operation/main"; + +const wchar_t* APPCONTROL_KEY_TYPE = L"http://tizen.org/appcontrol/data/type"; +const wchar_t* APPCONTROL_KEY_PATH = L"http://tizen.org/appcontrol/data/path"; +const wchar_t* APPCONTROL_KEY_INDEX = L"http://tizen.org/appcontrol/data/index"; +const wchar_t* APPCONTROL_KEY_SELECTION_MODE = L"http://tizen.org/appcontrol/data/selection_mode"; +const wchar_t* APPCONTROL_KEY_DATA_SELECTED = L"http://tizen.org/appcontrol/data/selected"; +const wchar_t* APPCONTROL_KEY_MESSAGE_TYPE = L"http://tizen.org/appcontrol/data/message/type"; +const wchar_t* APPCONTROL_KEY_CAMERA_ALLOW_SWITCH = L"http://tizen.org/appcontrol/data/camera/allow_switch"; +const wchar_t* APPCONTROL_KEY_IMAGEVIEWER_MODE = L"http://tizen.org/appcontrol/data/image/crop_mode"; + +const wchar_t* APPCONTROL_URI_MMS_TO = L"mmsto"; +const wchar_t* APPCONTROL_URI_MAIL_TO = L"mailto"; + +const wchar_t* APPCONTROL_MIME_IMAGE_JPG = L"image/jpg"; +const wchar_t* APPCONTROL_MIME_IMAGE_ALL = L"image/*"; + +const wchar_t* APPCONTROL_DATA_IMAGE = L"image"; +const wchar_t* APPCONTROL_DATA_VIDEO = L"video"; +const wchar_t* APPCONTROL_DATA_SINGLE = L"single"; +const wchar_t* APPCONTROL_DATA_MULTIPLE = L"multiple"; +const wchar_t* APPCONTROL_DATA_SLIDE_SHOW = L"slideshow"; +const wchar_t* APPCONTROL_DATA_SELECTION_MODE = L"http://tizen.org/appcontrol/data/selection/mode"; +const wchar_t* APPCONTROL_DATA_TRUE = L"true"; +const wchar_t* APPCONTROL_DATA_MMS = L"mms"; +const wchar_t* APPCONTROL_DATA_CROP_TYPE_AUTO = L"auto"; +const wchar_t* APPCONTROL_DATA_CROP_TYPE_FIT_TO_SCREEN = L"fit_to_screen"; + +const wchar_t* APPCONTROL_RESULT_KEY_LEGACY_RESULT = L"http://tizen.org/appcontrol/data/legacyresult"; + +const wchar_t* SETTING_KEY_LANGUAGE = L"http://tizen.org/setting/locale.language"; +const wchar_t* SETTING_KEY_FONT_SIZE = L"http://tizen.org/setting/font.size"; + +const Dimension DIMENSION_DEFAULT_THUMBNAIL = Dimension(171,127); +const int FOLDER_BITMAP_MAX = 7; + +const wchar_t* EMPTY_SPACE = L""; +const wchar_t* SINGLE_SPACE = L" "; + +const wchar_t* DIRECTORY_SEPARATOR = L"/"; +const wchar_t* FILE_EXT_SEPARATOR = L"."; +const wchar_t* MULTI_ITEM_SEPARATOR = L";"; + +const wchar_t* CONTENT_EXT_PNG = L".png"; +const wchar_t* CONTENT_EXT_BMP = L".bmp"; +const wchar_t* CONTENT_EXT_JPG = L".jpg"; +const wchar_t* CONTENT_EXT_GIF = L".gif"; +const wchar_t* CONTENT_EXT_TIF = L".tif"; +const wchar_t* CONTENT_EXT_MP4 = L".mp4"; +const wchar_t* CONTENT_EXT_3GP = L".3gp"; +const wchar_t* CONTENT_EXT_AVI = L".avi"; +const wchar_t* CONTENT_EXT_RM = L".rm"; +const wchar_t* CONTENT_EXT_WMV = L".wmv"; +const wchar_t* CONTENT_EXT_ASF = L".asf"; + +const wchar_t* SECTION_NAME_GALLERY = L"GALLRY_SETTING"; +const wchar_t* SECTION_NAME_IMAGE_VIEWER = L"IMAGE_VIEWER_SETTING"; +const wchar_t* SECTION_NAME_VIDEO_PLAYER = L"VIDEO_PLAYER_SETTING"; +const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_INTERVAL = L"SLIDESHOW_INTERVAL_VALUE"; +const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_TRANSITION_EFFECT = L"TRANSITION_EFFECT_VALUE"; +const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SLIDESHOW_MUSIC = L"MUSIC_VALUE"; +const wchar_t* ENTRY_NAME_IMAGE_VIEWER_REPEAT_VALUE = L"REPEAT_VALUE"; +const wchar_t* ENTRY_NAME_IMAGE_VIEWER_SHUFFLE_VALUE = L"SHUFFLE_VALUE"; + +const wchar_t* ALL_ALBUMS_REAL_NAME = L"asdqwezxc%%^^@@$$**"; + +const wchar_t* FONT_SIZE_SETTING_INFO_KEY = L"http://tizen.org/setting/font.size"; + +const wchar_t* IDB_BUTTON_CIRCLE_BACKGROUND = L"T01_button_circle_bg_normal.png"; +const wchar_t* IDB_BUTTON_RENAME = L"T01_button_rename.png"; +const wchar_t* IDB_CONTROLBAR_CAMERA = L"T01_controlbar_icon_camera.png"; +const wchar_t* IDB_CONTROLBAR_DELETE = L"T01_controlbar_icon_delete.png"; +const wchar_t* IDB_CONTROLBAR_DELETE_DIM = L"T01_toolbar_icon_delete_dim_web.png"; +const wchar_t* IDB_CONTROLBAR_MORE = L"T01_controlbar_icon_more.png"; +const wchar_t* IDB_CONTROLBAR_MORE_DISABLED = L"00_icon_more_dim.png"; +const wchar_t* IDB_CONTROLBAR_MORE_PRESSED = L"00_icon_more_press.png"; +const wchar_t* IDB_CONTROLBAR_SHARE = L"T01_controlbar_icon_share02.png"; +const wchar_t* IDB_CONTROLBAR_SHARE_DIM = L"T01_toolbar_icon_share_dim_web.png"; +const wchar_t* IDB_LISTVIEW_EMPTY = L"T01_Nocontents_picture.png"; +const wchar_t* IDB_MAIN_FOLDER_BACKGROUND = L"T01_main_folder_bg.png"; +const wchar_t* IDB_VIDEOTHUMBNAIL_BG = L"T01_places_thumbnail_bg.png"; +const wchar_t* IDB_VIDEOTHUMBNAIL_BOOKMARK = L"T01_icon_thumbnail_bookmark.png"; +const wchar_t* IDB_VIDEOTHUMBNAIL_FAVORITE = L"T01_icon_thumbnail_favorite.png"; +const wchar_t* IDB_VIDEOTHUMBNAIL_PLAY = L"T01_btn_play.png"; +const wchar_t* IDB_BUTTON_MOVE_SELECTION = L"T01_button_reveal.png"; +const wchar_t* IDB_NO_CONTENTS_BROKEN = L"T01_Nocontents_broken.png"; +const wchar_t* IDB_LIST_EXPAND_CLOSED = L"00_list_expand_closed.png"; +const wchar_t* IDB_LIST_EXPAND_CLOSED_PRESS = L"00_list_expand_closed_press.png"; +const wchar_t* IDB_LIST_EXPAND_OPENED = L"00_list_expand_opened.png"; +const wchar_t* IDB_LIST_EXPAND_OPENED_PRESS = L"00_list_expand_opened_press.png"; +const wchar_t* IDB_ICON_SELECT_ALL = L"00_icon_select_all_web.png"; +const wchar_t* IDB_ICON_SELECT_ALL_PRESS = L"00_icon_select_all_press_web.png"; + +const wchar_t* DEVICE_STORAGE_CARD_MOUNTED = L"Mounted"; +const wchar_t* DEVICE_STORAGE_CARD_UNMOUNTED = L"Unmounted"; +const wchar_t* IDB_ALBUM_EDIT_RENAME_BG = L"T01_album_edit_rename_bg.png"; +const wchar_t* IDB_ALBUM_EDIT_RENAME = L"T01_album_edit_rename.png"; +const wchar_t* IDB_ALBUM_ICON_FOLDER = L"T01_album_icon_folder.png"; +const wchar_t* IDB_ALBUM_ICON_DOWNLOAD = L"T01_album_icon_download.png"; +const wchar_t* IDB_ALBUM_ICON_CAMERA = L"T01_album_icon_camera.png"; + +const wchar_t* IDB_ALBUM_RENAME_PROGRESS1 = L"00_list_process_01.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS2 = L"00_list_process_02.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS3 = L"00_list_process_03.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS4 = L"00_list_process_04.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS5 = L"00_list_process_05.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS6 = L"00_list_process_06.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS7 = L"00_list_process_07.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS8 = L"00_list_process_08.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS9 = L"00_list_process_09.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS10 = L"00_list_process_10.png"; + +const wchar_t* IDB_ALBUM_RENAME_PROGRESS11 = L"00_list_process_11.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS12 = L"00_list_process_12.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS13 = L"00_list_process_13.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS14 = L"00_list_process_14.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS15 = L"00_list_process_15.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS16 = L"00_list_process_16.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS17 = L"00_list_process_17.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS18 = L"00_list_process_18.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS19 = L"00_list_process_19.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS20 = L"00_list_process_20.png"; + +const wchar_t* IDB_ALBUM_RENAME_PROGRESS21 = L"00_list_process_21.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS22 = L"00_list_process_22.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS23 = L"00_list_process_23.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS24 = L"00_list_process_24.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS25 = L"00_list_process_25.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS26 = L"00_list_process_26.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS27 = L"00_list_process_27.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS28 = L"00_list_process_28.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS29 = L"00_list_process_29.png"; +const wchar_t* IDB_ALBUM_RENAME_PROGRESS30 = L"00_list_process_30.png"; + +const wchar_t* IDB_IMAGE_CONTEXT_EMAIL_ICON = L"T01_1_face_tag_icon_email.png"; +const wchar_t* IDB_IMAGE_CONTEXT_MESSAGE_ICON = L"T01_1_face_tag_icon_message.png"; + +const wchar_t* IDB_IMAGE_CROP_RECTANGLE = L"T01-1_crop_rectangle.png"; diff --git a/src/GlVideoListEditorPanel.cpp b/src/GlVideoListEditorPanel.cpp new file mode 100644 index 0000000..3b08f4c --- /dev/null +++ b/src/GlVideoListEditorPanel.cpp @@ -0,0 +1,787 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlVideoListEditorPanel.cpp + * @brief This is the implementation file for VideoListEditorPanel class. + */ + +#include +#include +#include "GlAlbumInfo.h" +#include "GlCommonUtil.h" +#include "GlFileListPresentationModel.h" +#include "GlGalleryApp.h" +#include "GlResourceManager.h" +#include "GlTypes.h" +#include "GlVideoListEditorPanel.h" +#include "GlFileListEditorForm.h" +#include "GlFileUpdateTimer.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const unsigned int COLOR_COUNT_LABEL = Color32<68, 68, 68>::Value; +static const unsigned int COLOR_SELECT_COUNT_FONT = Color32<255, 255, 255>::Value; +static const Color COLOR_THUMBNAIL_DIM (Color::GetColor(COLOR_ID_BLACK)); +static const Rectangle RECT_VIDEO_THUMBNAIL(16, 16, 172, 128); +static const Rectangle RECT_INITIAL(0, 0, 10, 10); + +static const int H_SELECTALL_REGION = 112; +static const int ALPHA_THUMBNAIL_DIM = 70; +static const int H_COUNT_LABEL = 48; +static const int COUNT_LABEL_FONT_SIZE = 33; +static const int LENGTH_COUNT_LABEL = 256; +static const int W_CLIENT_REGION = 720; +static const int H_VIDEO_ITEM = 160; +static const int GAP_W_VIDEO_TITLE = 16+172+16; +static const int GAP_H_VIDEO_TITLE = 22; +static const int W_VIDEO_TITLE = (16+172+16)+(16+64+16); +static const int H_VIDEO_TITLE = 64; +static const int FONT_SIZE_TITLE = 36; +static const int GAP_W_VIDEO_DURATION = 16+172+16; +static const int GAP_H_VIDEO_DURATION = 22+64; +static const int W_VIDEO_DURATION = (16+172+16)+(16+64+16); +static const int H_VIDEO_DURATION = 48; +static const int FONT_SIZE_DURATION = 32; + +VideoListEditorPanel::VideoListEditorPanel(void) + : __pContentIconListView(null) + , __pCheckButton(null) + , __pLabelSelectCnt(null) + , __itemCount(0) + , __pPresentationModel(null) + , __pFileDelete(null) + , __pFileListEditorForm(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +VideoListEditorPanel::~VideoListEditorPanel(void) +{ + AppLogDebug("ENTER"); + delete __pFileDelete; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +VideoListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +VideoListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + __itemCount = 0; + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + clientAreaBounds.x = clientAreaBounds.y = 0; + SetBounds(clientAreaBounds); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + __pContentIconListView = new (std::nothrow) ListView(); + + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, clientAreaBounds.height), true, false); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->AddListViewItemEventListener(*this); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __pLabelSelectCnt = new (std::nothrow) Label(); + __pLabelSelectCnt->Construct(Rectangle(0, clientAreaBounds.height - H_COUNT_LABEL, + clientAreaBounds.width, H_COUNT_LABEL), ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED")); + __pLabelSelectCnt->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pLabelSelectCnt->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + __pLabelSelectCnt->SetBackgroundColor(COLOR_COUNT_LABEL); + __pLabelSelectCnt->SetTextColor(Color(COLOR_SELECT_COUNT_FONT)); + __pLabelSelectCnt->SetTextConfig(COUNT_LABEL_FONT_SIZE, LABEL_TEXT_STYLE_BOLD); + AddControl(__pLabelSelectCnt); + } + else + { + __pContentIconListView->Construct(Rectangle(0, 0, clientAreaBounds.width, + clientAreaBounds.height), true, false); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->AddListViewItemEventListener(*this); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + } + } + else + { + __pContentIconListView = new (std::nothrow) ListView(); + __pContentIconListView->Construct( + Rectangle(0, H_SELECTALL_REGION, W_CLIENT_REGION, clientAreaBounds.height - H_SELECTALL_REGION), + true, false); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentIconListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentIconListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentIconListView->SetItemProvider(*this); + __pContentIconListView->AddListViewItemEventListener(*this); + AddControl(__pContentIconListView); + __pContentIconListView->SetShowState(true); + + __pLabelSelectCnt = new (std::nothrow) Label(); + __pLabelSelectCnt->Construct( + Rectangle(0, clientAreaBounds.height - H_COUNT_LABEL, clientAreaBounds.width, H_COUNT_LABEL), + ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED")); + __pLabelSelectCnt->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + __pLabelSelectCnt->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + __pLabelSelectCnt->SetBackgroundColor(COLOR_COUNT_LABEL); + __pLabelSelectCnt->SetTextColor(Color(COLOR_SELECT_COUNT_FONT)); + __pLabelSelectCnt->SetTextConfig(COUNT_LABEL_FONT_SIZE, LABEL_TEXT_STYLE_BOLD); + AddControl(__pLabelSelectCnt); + + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +VideoListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +int +VideoListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +ListItemBase* +VideoListEditorPanel::CreateItem(int index, int itemWidth) +{ + AppLogDebug("ENTER : index(%d)", index); + CustomItem* pItem = new (std::nothrow) CustomItem(); + + Bitmap* pBitmap = null; + String* pItemText = null; + String* pTitle = null; + String* pDuration = null; + + result r = __pPresentationModel->GetThumbnailVideoInSyncCacheN(index, pItemText, pBitmap, pDuration); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + if (pItemText == null) + { + pItemText = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + pTitle = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + + if (pDuration == null) + { + pDuration = new (std::nothrow) String(ResourceManager::GetString(L"EMPTY_SPACE")); + } + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + pItem->Construct(Dimension(itemWidth, H_VIDEO_ITEM), LIST_ANNEX_STYLE_MARK); + + if (__pContentIconListView->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + + Color dimColor(COLOR_THUMBNAIL_DIM); + dimColor.SetAlpha(ALPHA_THUMBNAIL_DIM); + + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap, pSelectedBitmap); + delete pSelectedBitmap; + } + else + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete pTitle; + delete pItemText; + delete pDuration; + return null; + } + } + else + { + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap); + } + + if (pTitle == null) + { + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + else if (pTitle->IsEmpty() == true) + { + delete pTitle; + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + + Rectangle titleRect(GAP_W_VIDEO_TITLE, GAP_H_VIDEO_TITLE, itemWidth-W_VIDEO_TITLE, H_VIDEO_TITLE); + pItem->AddElement(titleRect, IDA_FORMAT_TITLE, *pTitle, FONT_SIZE_TITLE, + Color::GetColor(COLOR_ID_BLACK),null,null,false); + + Rectangle durationRect(GAP_W_VIDEO_DURATION, GAP_H_VIDEO_DURATION, itemWidth-W_VIDEO_DURATION, + H_VIDEO_DURATION); + pItem->AddElement(durationRect, IDA_FORMAT_DURATION, *pDuration, FONT_SIZE_DURATION, + Color::GetColor(COLOR_ID_GREY),null,null,false); + } + else + { + pItem->Construct(Dimension(itemWidth, H_VIDEO_ITEM), LIST_ANNEX_STYLE_NORMAL); + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap); + + if (pTitle == null) + { + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + else if (pTitle->IsEmpty() == true) + { + delete pTitle; + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + + Rectangle titleRect(GAP_W_VIDEO_TITLE, GAP_H_VIDEO_TITLE, itemWidth-W_VIDEO_TITLE, H_VIDEO_TITLE); + pItem->AddElement(titleRect, IDA_FORMAT_TITLE, *pTitle, FONT_SIZE_TITLE, + Color::GetColor(COLOR_ID_BLACK), null, null, false); + + Rectangle durationRect(GAP_W_VIDEO_DURATION, GAP_H_VIDEO_DURATION, itemWidth-W_VIDEO_DURATION, + H_VIDEO_DURATION); + pItem->AddElement(durationRect, IDA_FORMAT_DURATION, *pDuration, FONT_SIZE_DURATION, + Color::GetColor(COLOR_ID_GREY), null, null, false); + } + } + else + { + pItem->Construct(Dimension(itemWidth, H_VIDEO_ITEM), LIST_ANNEX_STYLE_MARK); + if (__pContentIconListView->IsItemChecked(index) == true) + { + if (pBitmap != null) + { + BufferInfo bufferInfo; + pBitmap->Lock(bufferInfo, INFINITE); + pBitmap->Unlock(); + Color dimColor(COLOR_THUMBNAIL_DIM); + dimColor.SetAlpha(ALPHA_THUMBNAIL_DIM); + + Canvas canvas; + canvas.Construct(bufferInfo); + canvas.FillRectangle(dimColor, canvas.GetBounds()); + + Bitmap* pSelectedBitmap = new (std::nothrow) Bitmap(); + pSelectedBitmap->Construct(canvas, canvas.GetBounds()); + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap, pSelectedBitmap); + delete pSelectedBitmap; + } + else + { + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap); + } + } + else + { + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap); + } + + if (pTitle == null) + { + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + else if (pTitle->IsEmpty() == true) + { + delete pTitle; + pTitle = new (std::nothrow) String(SINGLE_SPACE); + } + + Rectangle titleRect(GAP_W_VIDEO_TITLE, GAP_H_VIDEO_TITLE, itemWidth-W_VIDEO_TITLE, H_VIDEO_TITLE); + pItem->AddElement(titleRect, IDA_FORMAT_TITLE, *pTitle, FONT_SIZE_TITLE, + Color::GetColor(COLOR_ID_BLACK), null, null, false); + + Rectangle durationRect(GAP_W_VIDEO_DURATION, GAP_H_VIDEO_DURATION, itemWidth - W_VIDEO_DURATION, + H_VIDEO_DURATION); + pItem->AddElement(durationRect, IDA_FORMAT_DURATION, *pDuration, FONT_SIZE_DURATION, + Color::GetColor(COLOR_ID_GREY), null, null, false); + } + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + if (pTitle != null) + { + delete pTitle; + } + if (pDuration != null) + { + delete pDuration; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pItem; +} + +bool +VideoListEditorPanel::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +VideoListEditorPanel::OnListViewItemStateChanged(ListView& listView, int index, int elementId, + ListItemStatus status) +{ + AppLogDebug("ENTER"); + + if (status == LIST_ITEM_STATUS_CHECKED || status == LIST_ITEM_STATUS_UNCHECKED) + { + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (__pPresentationModel->GetAppControlSelectionMode() == APPCONTROL_SELECTION_MODE_MULTIPLE) + { + int checkedCount = GetItemCheckedCount(); + String strTmp; + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + else + { + int checkedCount = GetItemCheckedCount(); + String strTmp; + if (checkedCount == 0) + { + strTmp = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + else if (checkedCount == 1) + { + strTmp = ResourceManager::GetString(L"IDS_VR_POP_1_ITEM_SELECTED"); + } + else + { + strTmp.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), checkedCount); + } + + __pLabelSelectCnt->SetText(strTmp); + __pLabelSelectCnt->RequestRedraw(true); + if (__pCheckButton->IsSelected()) + { + __pCheckButton->SetSelected(false); + } + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + } + + if ( __pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK + && __pPresentationModel->GetAppControlSelectionMode() != APPCONTROL_SELECTION_MODE_MULTIPLE) + { + if (status == LIST_ITEM_STATUS_SELECTED) + { + HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter); + result r = pMap->Construct(); + if (r == E_SUCCESS) + { + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pArrayList->Construct(); + + if (r == E_SUCCESS) + { + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(index))); + pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_DATA_SELECTED), (Object*)pArrayList); + + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap); + pApp->Terminate(); + } + else + { + delete pMap; + } + } + } + else + { + delete pMap; + } + } + } + SetButtonState(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_VIDEO) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_VIDEO); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + __pContentIconListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + __pFileListEditorForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + + if (__pPresentationModel->GetAppControlMode() == APPCONTROL_MODE_PICK) + { + if (currentSceneId == IDSCN_VIDEO_LIST_EDITOR) + { + if (previousSceneId == IDSCN_ALBUM_LIST) + { + AlbumInfo* pAlbumInfo = static_cast(pArgs->GetAt(0)); + if (pAlbumInfo == null) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return; + } + + IList* pDirectoryList = pAlbumInfo->GetDirectoryListN(); + __pPresentationModel->SetCurrentAlbumInfo(pAlbumInfo->GetAlbumName(), *pDirectoryList); + + if (pDirectoryList != null) + { + delete pDirectoryList; + } + delete pArgs; + + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->UpdateList(); + } + } + } + else + { + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentIconListView->RequestRedraw(true); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +int +VideoListEditorPanel::GetItemCheckedCount(void) const +{ + AppLogDebug("ENTER"); + int count = 0; + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + ++count; + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return count; +} + +IList* +VideoListEditorPanel::GetItemCheckedIndexListN(void) const +{ + AppLogDebug("ENTER"); + IList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter); + Integer* pIndex = null; + + if (__pContentIconListView != null) + { + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + for (int i = 0; i < loopCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i)) + { + pIndex = new (std::nothrow) Integer(i); + pList->Add(pIndex); + } + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pList; +} + +void +VideoListEditorPanel::OnFileOpInvalidate(enum FileActionMode actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + FileListEditorForm* pFileListEditorForm = + dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturnVoid(pFileListEditorForm != null, "[%s] fail to get SceneManager.", + GetErrorMessage(GetLastResult())); + pFileListEditorForm->Invalidate(true); +} + +void +VideoListEditorPanel::OnRequestAppExitWithMultipleSelectionAppControlResult(void) +{ + AppLogDebug("ENTER"); + IList* pIndexList = GetItemCheckedIndexListN(); + + if (pIndexList->GetCount() <= 0) + { + delete pIndexList; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter); + result r = pMap->Construct(); + + if (r == E_SUCCESS) + { + ArrayList* pArrayList = new (std::nothrow) ArrayList(SingleObjectDeleter); + r = pArrayList->Construct(); + + if (r == E_SUCCESS) + { + Integer* pTemp = null; + int loopCount = pIndexList->GetCount(); + + for (int i = 0; i < loopCount; ++i) + { + pTemp = static_cast(pIndexList->GetAt(i)); + pArrayList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(pTemp->ToInt()))); + } + + pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_DATA_SELECTED), (Object*)pArrayList); + + GalleryApp* pApp = dynamic_cast(UiApp::GetInstance()); + if (pApp != null) + { + pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap); + pApp->Terminate(); + } + else + { + delete pMap; + } + } + else + { + delete pMap; + delete pArrayList; + } + } + else + { + delete pMap; + } + + delete pIndexList; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::OnSelectAllPressed(void) +{ + bool needToSelectAll = true; + int checkedCount = GetItemCheckedCount(); + int totalFileCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + if (checkedCount == totalFileCount) + { + needToSelectAll = false; + } + + if (needToSelectAll == true) + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == false) + { + __pContentIconListView->SetItemChecked(i, true); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + __pFileListEditorForm->SetFooterButtonsState(true); + } + } + else + { + for (int i = 0; i < totalFileCount; ++i) + { + if (__pContentIconListView->IsItemChecked(i) == true) + { + __pContentIconListView->SetItemChecked(i, false); + __pContentIconListView->RefreshList(i, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + __pFileListEditorForm->SetFooterButtonsState(false); + } + } + + String tempString; + if (needToSelectAll == true) + { + tempString.Format(LENGTH_COUNT_LABEL, + ResourceManager::GetString(L"IDS_VR_POP_PD_ITEMS_SELECTED").GetPointer(), totalFileCount); + } + else + { + tempString = ResourceManager::GetString(L"IDS_ST_POP_NO_ITEMS_SELECTED"); + } + + __pLabelSelectCnt->SetText(tempString); + __pLabelSelectCnt->RequestRedraw(true); +} + +void +VideoListEditorPanel::SetButtonState(void) +{ + AppLogDebug("ENTER"); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + TryReturnVoid(pSceneManager != null, "[%s] fail to get SceneManager.", GetErrorMessage(GetLastResult())); + + if (GetItemCheckedCount() > 0) + { + __pFileListEditorForm->SetFooterButtonsState(true); + } + else + { + __pFileListEditorForm->SetFooterButtonsState(false); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListEditorPanel::ChangeOrientation(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + const Form* pForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + TryReturn(pForm != null,, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); + __pContentIconListView->SetBounds(0, 0, clientAreaBounds.width, clientAreaBounds.height); +} diff --git a/src/GlVideoListPanel.cpp b/src/GlVideoListPanel.cpp new file mode 100644 index 0000000..cb29cab --- /dev/null +++ b/src/GlVideoListPanel.cpp @@ -0,0 +1,271 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (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 GlVideoListPanel.cpp + * @brief This is the implementation file for VideoListPanel class. + */ + +#include +#include +#include "GlAlbumInfo.h" +#include "GlCommonUtil.h" +#include "GlFileListForm.h" +#include "GlFileListPresentationModel.h" +#include "GlTypes.h" +#include "GlVideoListPanel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_VIDEO_ITEM = 160; +static const int GAP_W_VIDEO_TITLE = 16+172+16; +static const int GAP_H_VIDEO_TITLE = 22; +static const int W_VIDEO_TITLE = (16+172+16)+(16+64+16); +static const int H_VIDEO_TITLE = 64; +static const int FONT_SIZE_TITLE = 36; +static const int GAP_W_VIDEO_DURATION = 16+172+16; +static const int GAP_H_VIDEO_DURATION = 22+64; +static const int W_VIDEO_DURATION = (16+172+16)+(16+64+16); +static const int H_VIDEO_DURATION = 48; +static const int FONT_SIZE_DURATION = 32; +static const int W_CLIENT_REGION = 720; +static const Rectangle RECT_INITIAL (0, 0, 10, 10); +static const Rectangle RECT_VIDEO_THUMBNAIL (16, 16, 172, 128); + +VideoListPanel::VideoListPanel(void) + : __itemCount(0) + , __pContentListView(null) + , __pPresentationModel(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +VideoListPanel::~VideoListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +VideoListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(RECT_INITIAL); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return r; +} + +result +VideoListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + TryReturn(pForm != null, E_FAILURE, "[%s] fail to get the form.", GetErrorMessage(GetLastResult())); + + __pPresentationModel = FileListPresentationModel::GetInstance(); + __pPresentationModel->ClearThumbnailRequests(); + __pPresentationModel->AddPresentationModelListener(this); + + Rectangle clientAreaBounds = pForm->GetClientAreaBounds(); + clientAreaBounds.x = clientAreaBounds.y = 0; + SetBounds(clientAreaBounds); + __pContentListView = new (std::nothrow) ListView(); + __pContentListView->Construct(Rectangle(0, 0, W_CLIENT_REGION, clientAreaBounds.height), true, false); + Bitmap* pBitmapEmpty = ResourceManager::GetBitmapN(IDB_LISTVIEW_EMPTY); + if (pBitmapEmpty != null) + { + __pContentListView->SetBitmapOfEmptyList(pBitmapEmpty); + delete pBitmapEmpty; + } + __pContentListView->SetTextOfEmptyList(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pContentListView->SetItemProvider(*this); + __pContentListView->AddListViewItemEventListener(*this); + AddControl(__pContentListView); + __pContentListView->SetShowState(true); + __itemCount = 0; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +result +VideoListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemovePresentationModelListener(*this); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return E_SUCCESS; +} + +int +VideoListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return __itemCount; +} + +ListItemBase* +VideoListPanel::CreateItem(int index, int itemWidth) +{ + AppLogDebug("ENTER : index(%d)", index); + CustomItem* pItem = new (std::nothrow) CustomItem(); + pItem->Construct(Dimension(itemWidth, H_VIDEO_ITEM), LIST_ANNEX_STYLE_NORMAL); + + Bitmap* pBitmap = null; + String* pItemText = null; + String* pTitle = null; + String* pDuration = null; + + result r = __pPresentationModel->GetThumbnailVideoInSyncCacheN(index, pItemText, pBitmap, pDuration); + if (pBitmap == null || r == E_FAILURE) + { + __pPresentationModel->RequestThumbnail(index); + pBitmap = CommonUtil::GetEmptyThumbnailN(); + } + + pItem->AddElement(RECT_VIDEO_THUMBNAIL, IDA_FORMAT_THUMBNAIL, *pBitmap); + pTitle = new (std::nothrow) String(SINGLE_SPACE); + Rectangle titleRect(GAP_W_VIDEO_TITLE, GAP_H_VIDEO_TITLE, itemWidth-W_VIDEO_TITLE, H_VIDEO_TITLE); + pItem->AddElement(titleRect, IDA_FORMAT_TITLE, *pTitle, FONT_SIZE_TITLE, + Color::GetColor(COLOR_ID_BLACK), null, null, false); + + Rectangle durationRect(GAP_W_VIDEO_DURATION, GAP_H_VIDEO_DURATION, itemWidth-W_VIDEO_DURATION, + H_VIDEO_DURATION); + pItem->AddElement(durationRect, IDA_FORMAT_DURATION, *pDuration, FONT_SIZE_DURATION, + Color::GetColor(COLOR_ID_GREY), null, null, false); + + if (pBitmap != null) + { + delete pBitmap; + } + if (pItemText != null) + { + delete pItemText; + } + if (pTitle != null) + { + delete pTitle; + } + if (pDuration != null) + { + delete pDuration; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return pItem; +} + +bool +VideoListPanel::DeleteItem(int index, ListItemBase* pItem, int itemWidth) +{ + AppLogDebug("ENTER"); + delete pItem; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + + return true; +} + +void +VideoListPanel::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == LIST_ITEM_STATUS_SELECTED) + { + IList* pList = new (std::nothrow) ArrayList(); + int loopCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + + for (int i = 0; i < loopCount; ++i) + { + pList->Add(new (std::nothrow) String(__pPresentationModel->GetContentFilePath(i))); + } + String listIndex; + listIndex.Format(10, L"%d", index); + + const String mimeType = APPCONTROL_MIME_IMAGE_ALL; + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_TYPE), new (std::nothrow) String(APPCONTROL_DATA_IMAGE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), (Object*)pList); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_INDEX), new (std::nothrow) String(listIndex)); + + __pPresentationModel->StartAppControl(APPCONTROL_PROVIDER_ID_IMAGE, APPCONTROL_OPERATION_ID_VIEW, null, + &mimeType, pDataList, null); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListPanel::OnFileInfoChanged(const ContentType contentType) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_VIDEO) + { + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentListView->UpdateList(); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListPanel::OnThumbnailDecoded(const int index) +{ + AppLogDebug("ENTER : index(%d)", index); + if (index >= 0) + { + __pContentListView->RefreshList(index, LIST_REFRESH_TYPE_ITEM_MODIFY); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +VideoListPanel::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, IList* pArgs) +{ + AppLogDebug("ENTER"); + __pPresentationModel = FileListPresentationModel::GetInstance(); + + if (currentSceneId == IDSCN_VIDEO_LIST) + { + __pPresentationModel->RefreshCurrentAlbumContentInfoList(CONTENT_TYPE_VIDEO); + __itemCount = __pPresentationModel->GetCurrentAlbumContentInfoCount(); + __pContentListView->UpdateList(); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (pSceneManager->GetCurrentSceneId() == IDSCN_VIDEO_LIST) + { + FileListForm* pFileListForm = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + if (pFileListForm != null) + { + pFileListForm->SetTitleText(__pPresentationModel->GetCurrentAlbumName()); + } + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} -- 2.7.4