filelist_view.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. /*
  2. * File : filelist_view.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2010, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2010-01-06 Bernard first version
  13. */
  14. #include <rtgui/rtgui_object.h>
  15. #include <rtgui/rtgui_system.h>
  16. #include <rtgui/rtgui_theme.h>
  17. #include <rtgui/list.h>
  18. #include <rtgui/image.h>
  19. #include <rtgui/widgets/view.h>
  20. #include <rtgui/widgets/workbench.h>
  21. #include <rtgui/widgets/filelist_view.h>
  22. #ifdef _WIN32
  23. #include <io.h>
  24. #include <dirent.h>
  25. #include <sys/stat.h>
  26. #define PATH_SEPARATOR '\\'
  27. #define stat _stat
  28. #else
  29. #include <dfs_posix.h>
  30. #define PATH_SEPARATOR '/'
  31. #endif
  32. #include <string.h>
  33. #define RTGUI_FILELIST_MARGIN 5
  34. const static char * file_xpm[] = {
  35. "16 16 21 1",
  36. " c None",
  37. ". c #999999",
  38. "+ c #818181",
  39. "@ c #FFFFFF",
  40. "# c #ECECEC",
  41. "$ c #EAEAEA",
  42. "% c #EBEBEB",
  43. "& c #EDEDED",
  44. "* c #F0F0F0",
  45. "= c #C4C4C4",
  46. "- c #C5C5C5",
  47. "; c #C6C6C6",
  48. "> c #C7C7C7",
  49. ", c #EEEEEE",
  50. "' c #EDEDE5",
  51. ") c #EDEDE6",
  52. "! c #EFEFEF",
  53. "~ c #C8C8C8",
  54. "{ c #F1F1F1",
  55. "] c #F2F2F2",
  56. "^ c #959595",
  57. ".++++++++++++ ",
  58. "+@@@@@@@@@@@@+ ",
  59. "+@#$$%%%##&*@+ ",
  60. "+@$=--;;;;>*@+ ",
  61. "+@$%%###&&,*@+ ",
  62. "+@%-;;;;;;>*@+ ",
  63. "+@%%##&&'#,*@+ ",
  64. "+@%;;;;,,),*@+ ",
  65. "+@##&&,,!!!*@+ ",
  66. "+@#;;;>>~~~*@+ ",
  67. "+@#&,,!!*{{{@+ ",
  68. "+@&;>>~~~{{]@+ ",
  69. "+@&&,!!**{]]@+ ",
  70. "+@@@@@@@@@@@@+ ",
  71. "^++++++++++++^ ",
  72. " "};
  73. const static char * folder_xpm[] = {
  74. "16 16 121 2",
  75. " c None",
  76. ". c #D9B434",
  77. "+ c #E1C25E",
  78. "@ c #E2C360",
  79. "# c #E2C35F",
  80. "$ c #DBB63C",
  81. "% c #DAB336",
  82. "& c #FEFEFD",
  83. "* c #FFFFFE",
  84. "= c #FFFEFE",
  85. "- c #FFFEFD",
  86. "; c #FBF7EA",
  87. "> c #E4C76B",
  88. ", c #E3C76B",
  89. "' c #E6CD79",
  90. ") c #E5CA74",
  91. "! c #DAAF35",
  92. "~ c #FEFCF7",
  93. "{ c #F8E48E",
  94. "] c #F5DE91",
  95. "^ c #F5E09F",
  96. "/ c #F6E1AC",
  97. "( c #FEFBEF",
  98. "_ c #FEFDF4",
  99. ": c #FEFCF3",
  100. "< c #FEFCF1",
  101. "[ c #FEFBEE",
  102. "} c #FFFDFA",
  103. "| c #DAAF36",
  104. "1 c #DAAA36",
  105. "2 c #FDFAF1",
  106. "3 c #F5DE94",
  107. "4 c #F4DC93",
  108. "5 c #F2D581",
  109. "6 c #EDCA6A",
  110. "7 c #EACB6C",
  111. "8 c #EFD385",
  112. "9 c #EFD280",
  113. "0 c #EFD07A",
  114. "a c #EECF76",
  115. "b c #EECF72",
  116. "c c #FBF7E9",
  117. "d c #DAAE34",
  118. "e c #DAAB35",
  119. "f c #FBF6E8",
  120. "g c #EFD494",
  121. "h c #EECE88",
  122. "i c #E9C173",
  123. "j c #F6E9C9",
  124. "k c #FEFCF2",
  125. "l c #FEFCF0",
  126. "m c #DAAB36",
  127. "n c #DAA637",
  128. "o c #FFFDF8",
  129. "p c #FFFDF6",
  130. "q c #FFFCF5",
  131. "r c #FCF6D8",
  132. "s c #F8E694",
  133. "t c #F7E385",
  134. "u c #F6DF76",
  135. "v c #F5DB68",
  136. "w c #F4D85C",
  137. "x c #FCF4D7",
  138. "y c #DAA435",
  139. "z c #DAA136",
  140. "A c #FEFCF6",
  141. "B c #FCF2C8",
  142. "C c #FBEFB9",
  143. "D c #FAECAC",
  144. "E c #F9E89C",
  145. "F c #F7E38B",
  146. "G c #F6E07C",
  147. "H c #F6DC6C",
  148. "I c #F5D95D",
  149. "J c #F4D64F",
  150. "K c #F3D344",
  151. "L c #FCF3D0",
  152. "M c #DA9F35",
  153. "N c #DA9A36",
  154. "O c #FDFAF2",
  155. "P c #FAEDB3",
  156. "Q c #F9E9A4",
  157. "R c #F8E695",
  158. "S c #F7E285",
  159. "T c #F6DE76",
  160. "U c #F5DB65",
  161. "V c #F4D757",
  162. "W c #F3D449",
  163. "X c #F2D13B",
  164. "Y c #F1CE30",
  165. "Z c #FBF2CC",
  166. "` c #DA9835",
  167. " . c #DA9435",
  168. ".. c #FEFAEF",
  169. "+. c #F9E9A1",
  170. "@. c #F8E591",
  171. "#. c #F7E181",
  172. "$. c #F6DE72",
  173. "%. c #F5DA63",
  174. "&. c #F4D754",
  175. "*. c #F3D347",
  176. "=. c #F2D039",
  177. "-. c #F1CD2E",
  178. ";. c #F0CB26",
  179. ">. c #FBF2CA",
  180. ",. c #D98E33",
  181. "'. c #FAF0DC",
  182. "). c #F4DDA7",
  183. "!. c #F4DB9E",
  184. "~. c #F3DA96",
  185. "{. c #F3D88E",
  186. "]. c #F3D786",
  187. "^. c #F2D47F",
  188. "/. c #F2D379",
  189. "(. c #F1D272",
  190. "_. c #F1D06C",
  191. ":. c #F1CF69",
  192. "<. c #F8EAC2",
  193. "[. c #D8882D",
  194. "}. c #D8872D",
  195. "|. c #D8862C",
  196. " ",
  197. " ",
  198. " ",
  199. " . + @ @ @ # $ ",
  200. " % & * = - * ; > , , , ' ) ",
  201. " ! ~ { ] ^ / ( _ : < ( [ } | ",
  202. " 1 2 3 4 5 6 7 8 9 0 a b c d ",
  203. " e f g h i j k : k l ( [ * m ",
  204. " n * o p q : r s t u v w x y ",
  205. " z A B C D E F G H I J K L M ",
  206. " N O P Q R S T U V W X Y Z ` ",
  207. " ...+.@.#.$.%.&.*.=.-.;.>. . ",
  208. " ,.'.).!.~.{.].^./.(._.:.<.,. ",
  209. " [.}.[.[.[.[.[.[.[.[.}.[.|. ",
  210. " ",
  211. " "};
  212. /* image for file and folder */
  213. static rtgui_image_t *file_image, *folder_image;
  214. static struct rtgui_filelist_view *filelist_view = RT_NULL; /* only one view in global */
  215. static void _rtgui_filelist_view_constructor(struct rtgui_filelist_view *view)
  216. {
  217. /* default rect */
  218. struct rtgui_rect rect = {0, 0, 200, 200};
  219. /* set default widget rect and set event handler */
  220. rtgui_widget_set_event_handler(RTGUI_WIDGET(view), rtgui_filelist_view_event_handler);
  221. rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);
  222. RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  223. view->current_item = 0;
  224. view->items_count = 0;
  225. view->page_items = 0;
  226. view->current_directory = RT_NULL;
  227. view->pattern = RT_NULL;
  228. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = white;
  229. RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(view)) = RTGUI_ALIGN_CENTER_VERTICAL;
  230. file_image = rtgui_image_create_from_mem("xpm",
  231. (rt_uint8_t*)file_xpm, sizeof(file_xpm), RT_TRUE);
  232. folder_image = rtgui_image_create_from_mem("xpm",
  233. (rt_uint8_t*)folder_xpm, sizeof(folder_xpm), RT_TRUE);
  234. }
  235. rtgui_type_t *rtgui_filelist_view_type_get(void)
  236. {
  237. static rtgui_type_t *filelist_view_type = RT_NULL;
  238. if (!filelist_view_type)
  239. {
  240. filelist_view_type = rtgui_type_create("flview", RTGUI_VIEW_TYPE,
  241. sizeof(rtgui_filelist_view_t), RTGUI_CONSTRUCTOR(_rtgui_filelist_view_constructor), RT_NULL);
  242. }
  243. return filelist_view_type;
  244. }
  245. void rtgui_filelist_view_ondraw(struct rtgui_filelist_view* view)
  246. {
  247. struct rtgui_dc* dc;
  248. rt_uint16_t page_index, index;
  249. struct rtgui_file_item* item;
  250. struct rtgui_rect rect, item_rect, image_rect;
  251. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
  252. if (dc == RT_NULL) return;
  253. rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect);
  254. rtgui_dc_fill_rect(dc, &rect);
  255. /* get item base rect */
  256. item_rect = rect;
  257. item_rect.y1 += 1;
  258. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  259. /* get image base rect */
  260. image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0;
  261. image_rect.x2 = RTGUI_FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  262. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  263. /* get current page */
  264. page_index = (view->current_item / view->page_items) * view->page_items;
  265. for (index = 0; index < view->page_items; index ++)
  266. {
  267. if (page_index + index >= view->items_count) break;
  268. item = &(view->items[page_index + index]);
  269. if (page_index + index == view->current_item)
  270. {
  271. rtgui_theme_draw_selected(dc, &item_rect);
  272. }
  273. else
  274. {
  275. /* draw background */
  276. rtgui_dc_fill_rect(dc, &item_rect);
  277. }
  278. /* draw item */
  279. if (item->type == RTGUI_FITEM_FILE)
  280. rtgui_image_blit(file_image, dc, &image_rect);
  281. else
  282. rtgui_image_blit(folder_image, dc, &image_rect);
  283. /* draw text */
  284. item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2;
  285. rtgui_dc_draw_text(dc, item->name, &item_rect);
  286. item_rect.x1 -= RTGUI_FILELIST_MARGIN + file_image->w + 2;
  287. /* move to next item position */
  288. item_rect.y1 += (rtgui_theme_get_selected_height() + 1);
  289. item_rect.y2 += (rtgui_theme_get_selected_height() + 1);
  290. image_rect.y1 += (rtgui_theme_get_selected_height() + 1);
  291. image_rect.y2 += (rtgui_theme_get_selected_height() + 1);
  292. }
  293. rtgui_dc_end_drawing(dc);
  294. }
  295. void rtgui_filelist_view_update_current(struct rtgui_filelist_view* view, rt_uint16_t old_item)
  296. {
  297. struct rtgui_dc* dc;
  298. struct rtgui_file_item* item;
  299. rtgui_rect_t rect, item_rect, image_rect;
  300. if (old_item/view->page_items != view->current_item/view->page_items)
  301. {
  302. /* it's not a same page, update all */
  303. rtgui_widget_update(RTGUI_WIDGET(view));
  304. return;
  305. }
  306. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
  307. if (dc == RT_NULL) return;
  308. rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect);
  309. /* get old item rect */
  310. item_rect = rect;
  311. item_rect.y1 += 1;
  312. item_rect.y1 += (old_item % view->page_items) * (1 + rtgui_theme_get_selected_height());
  313. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  314. /* get image rect */
  315. image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0;
  316. image_rect.x2 = RTGUI_FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  317. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  318. /* draw old item */
  319. rtgui_dc_fill_rect(dc, &item_rect);
  320. item = &(view->items[old_item]);
  321. if (item->type == RTGUI_FITEM_FILE) /* draw item image */
  322. rtgui_image_blit(file_image, dc, &image_rect);
  323. else
  324. rtgui_image_blit(folder_image, dc, &image_rect);
  325. item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2;
  326. rtgui_dc_draw_text(dc, item->name, &item_rect);
  327. /* draw current item */
  328. item_rect = rect;
  329. item_rect.y1 += 1;
  330. item_rect.y1 += (view->current_item % view->page_items) * (1 + rtgui_theme_get_selected_height());
  331. item_rect.y2 = item_rect.y1 + (1 + rtgui_theme_get_selected_height());
  332. rtgui_theme_draw_selected(dc, &item_rect);
  333. /* get image base rect */
  334. image_rect.x1 = RTGUI_FILELIST_MARGIN; image_rect.y1 = 0;
  335. image_rect.x2 = RTGUI_FILELIST_MARGIN + file_image->w; image_rect.y2 = file_image->h;
  336. rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  337. item = &(view->items[view->current_item]);
  338. if (item->type == RTGUI_FITEM_FILE) /* draw item image */
  339. rtgui_image_blit(file_image, dc, &image_rect);
  340. else
  341. rtgui_image_blit(folder_image, dc, &image_rect);
  342. item_rect.x1 += RTGUI_FILELIST_MARGIN + file_image->w + 2;
  343. rtgui_dc_draw_text(dc, item->name, &item_rect);
  344. rtgui_dc_end_drawing(dc);
  345. }
  346. rt_bool_t rtgui_filelist_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  347. {
  348. struct rtgui_filelist_view* view = RT_NULL;
  349. view = RTGUI_FILELIST_VIEW(widget);
  350. switch (event->type)
  351. {
  352. case RTGUI_EVENT_PAINT:
  353. rtgui_filelist_view_ondraw(view);
  354. return RT_FALSE;
  355. case RTGUI_EVENT_RESIZE:
  356. {
  357. struct rtgui_event_resize* resize;
  358. resize = (struct rtgui_event_resize*)event;
  359. /* recalculate page items */
  360. if (file_image != RT_NULL)
  361. view->page_items = resize->h / (1 + rtgui_theme_get_selected_height());
  362. else
  363. view->page_items = resize->h / (2 + 14);
  364. }
  365. break;
  366. case RTGUI_EVENT_KBD:
  367. {
  368. struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
  369. if (ekbd->type == RTGUI_KEYDOWN)
  370. {
  371. rt_uint16_t old_item;
  372. old_item = view->current_item;
  373. switch (ekbd->key)
  374. {
  375. case RTGUIK_UP:
  376. if (view->current_item > 0)
  377. view->current_item --;
  378. rtgui_filelist_view_update_current(view, old_item);
  379. return RT_FALSE;
  380. case RTGUIK_DOWN:
  381. if (view->current_item < view->items_count - 1)
  382. view->current_item ++;
  383. rtgui_filelist_view_update_current(view, old_item);
  384. return RT_FALSE;
  385. case RTGUIK_LEFT:
  386. if (view->current_item - view->page_items >= 0)
  387. view->current_item -= view->page_items;
  388. rtgui_filelist_view_update_current(view, old_item);
  389. return RT_FALSE;
  390. case RTGUIK_RIGHT:
  391. if (view->current_item + view->page_items < view->items_count - 1)
  392. view->current_item += view->page_items;
  393. rtgui_filelist_view_update_current(view, old_item);
  394. return RT_FALSE;
  395. case RTGUIK_RETURN:
  396. if (view->items[view->current_item].type == RTGUI_FITEM_DIR)
  397. {
  398. char new_path[64];
  399. if (strcmp(view->items[view->current_item].name, ".") == 0) return RT_FALSE;
  400. if (strcmp(view->items[view->current_item].name, "..") == 0)
  401. {
  402. char *ptr;
  403. ptr = strrchr(view->current_directory, PATH_SEPARATOR);
  404. if (ptr == RT_NULL) return RT_FALSE;
  405. if (ptr == &(view->current_directory[0]))
  406. {
  407. /* it's root directory */
  408. new_path[0] = PATH_SEPARATOR;
  409. new_path[1] = '\0';
  410. }
  411. else
  412. {
  413. strncpy(new_path, view->current_directory, ptr - view->current_directory + 1);
  414. new_path[ptr - view->current_directory] = '\0';
  415. }
  416. }
  417. else if (view->current_item == 0 &&
  418. (view->current_directory[0] == '/') && (view->current_directory[1] == '\0'))
  419. {
  420. if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
  421. {
  422. rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_CANCEL);
  423. }
  424. else
  425. {
  426. rtgui_filelist_view_destroy(view);
  427. }
  428. return RT_FALSE;
  429. }
  430. else
  431. {
  432. if (view->current_directory[strlen(view->current_directory) - 1] != PATH_SEPARATOR)
  433. sprintf(new_path, "%s%c%s",view->current_directory, PATH_SEPARATOR,
  434. view->items[view->current_item].name);
  435. else
  436. sprintf(new_path, "%s%s",view->current_directory,
  437. view->items[view->current_item].name);
  438. }
  439. rtgui_filelist_view_set_directory(view, new_path);
  440. }
  441. else
  442. {
  443. if (RTGUI_VIEW(view)->modal_show == RT_TRUE)
  444. {
  445. rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_OK);
  446. }
  447. }
  448. return RT_FALSE;
  449. default:
  450. break;
  451. }
  452. }
  453. }
  454. return RT_FALSE;
  455. }
  456. /* use view event handler */
  457. return rtgui_view_event_handler(widget, event);
  458. }
  459. rtgui_filelist_view_t* rtgui_filelist_view_create(rtgui_workbench_t* workbench,
  460. const char* directory, const char* pattern, const rtgui_rect_t* rect)
  461. {
  462. struct rtgui_filelist_view* view = RT_NULL;
  463. /* create a new view */
  464. view = (struct rtgui_filelist_view*) rtgui_widget_create(RTGUI_FILELIST_VIEW_TYPE);
  465. if (view != RT_NULL)
  466. {
  467. view->items = RT_NULL;
  468. view->pattern = rt_strdup(pattern);
  469. view->page_items = rtgui_rect_height(*rect) / (1 + rtgui_theme_get_selected_height());
  470. rtgui_filelist_view_set_directory(view, directory);
  471. rtgui_workbench_add_view(workbench, RTGUI_VIEW(view));
  472. }
  473. return view;
  474. }
  475. void rtgui_filelist_view_destroy(rtgui_filelist_view_t* view)
  476. {
  477. /* delete all file items */
  478. rtgui_filelist_view_clear(view);
  479. /* delete current directory and pattern */
  480. rtgui_free(view->current_directory); view->current_directory = RT_NULL;
  481. rtgui_free(view->pattern); view->pattern = RT_NULL;
  482. /* delete image */
  483. rtgui_image_destroy(file_image);
  484. rtgui_image_destroy(folder_image);
  485. /* destroy view */
  486. rtgui_widget_destroy(RTGUI_WIDGET(view));
  487. }
  488. /* clear all file items */
  489. void rtgui_filelist_view_clear(rtgui_filelist_view_t* view)
  490. {
  491. rt_uint32_t index;
  492. struct rtgui_file_item* item;
  493. for (index = 0; index < view->items_count; index ++)
  494. {
  495. item = &(view->items[index]);
  496. /* release item name */
  497. rt_free(item->name);
  498. item->name = RT_NULL;
  499. }
  500. /* release items */
  501. rtgui_free(view->items);
  502. view->items = RT_NULL;
  503. view->items_count = 0;
  504. view->current_item = 0;
  505. }
  506. void rtgui_filelist_view_set_directory(rtgui_filelist_view_t* view, const char* directory)
  507. {
  508. rt_uint8_t fullpath[256];
  509. struct rtgui_file_item *item;
  510. RT_ASSERT(view != RT_NULL);
  511. /* clear file items firstly */
  512. rtgui_filelist_view_clear(view);
  513. if (directory != RT_NULL)
  514. {
  515. DIR* dir;
  516. struct stat s;
  517. rt_uint32_t index;
  518. struct dirent* dirent;
  519. view->items_count = 0;
  520. dir = opendir(directory);
  521. if (dir == RT_NULL) goto __return;
  522. /* current directory exists, set it */
  523. if (view->current_directory != RT_NULL) rt_free(view->current_directory);
  524. view->current_directory = rt_strdup(directory);
  525. do
  526. {
  527. dirent = readdir(dir);
  528. if (dirent == RT_NULL) break;
  529. if (strcmp(dirent->d_name, ".") == 0) continue;
  530. if (strcmp(dirent->d_name, "..") == 0) continue;
  531. view->items_count ++;
  532. } while (dirent != RT_NULL);
  533. closedir(dir);
  534. view->items_count ++; /* root directory for [x] exit, others for .. */
  535. view->items = (struct rtgui_file_item*) rtgui_malloc(sizeof(struct rtgui_file_item) * view->items_count);
  536. if (view->items == RT_NULL) return; /* no memory */
  537. index = 0;
  538. if (directory[0] == '/' && directory[1] != '\0')
  539. {
  540. item = &(view->items[0]);
  541. /* add .. directory */
  542. item->name = rt_strdup("..");
  543. item->type = RTGUI_FITEM_DIR;
  544. item->size = 0;
  545. index ++;
  546. }
  547. else
  548. {
  549. item = &(view->items[0]);
  550. /* add .. directory */
  551. item->name = rt_strdup("Í˳öÎļþä¯ÀÀ");
  552. item->type = RTGUI_FITEM_DIR;
  553. item->size = 0;
  554. index ++;
  555. }
  556. /* reopen directory */
  557. dir = opendir(directory);
  558. for (; index < view->items_count; index ++)
  559. {
  560. dirent = readdir(dir);
  561. if (dirent == RT_NULL) break;
  562. item = &(view->items[index]);
  563. item->name = rt_strdup(dirent->d_name);
  564. rt_memset(&s, 0, sizeof(struct stat));
  565. /* build full path for the file */
  566. if (directory[strlen(directory) - 1] != PATH_SEPARATOR)
  567. sprintf(fullpath, "%s%c%s", directory, PATH_SEPARATOR, dirent->d_name);
  568. else
  569. sprintf(fullpath, "%s%s", directory, dirent->d_name);
  570. stat(fullpath, &s);
  571. if ( s.st_mode & S_IFDIR )
  572. {
  573. item->type = RTGUI_FITEM_DIR;
  574. item->size = 0;
  575. }
  576. else
  577. {
  578. item->type = RTGUI_FITEM_FILE;
  579. item->size = s.st_size;
  580. }
  581. }
  582. closedir(dir);
  583. }
  584. view->current_item = 0;
  585. __return:
  586. /* update view */
  587. rtgui_widget_update(RTGUI_WIDGET(view));
  588. }