Subversion Repositories Kolibri OS

Rev

Rev 6601 | Rev 6615 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #ifndef KOLIBRI_TREELIST_H
  2. #define KOLIBRI_TREELIST_H
  3.  
  4.  
  5. /// êîíñòàíòû ñòèëÿ
  6. enum tl_style {
  7.     TL_KEY_NO_EDIT  = 1,    // ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü)
  8.     TL_DRAW_PAR_LINE = 2,   // ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó
  9.     TL_LISTBOX_MODE  = 4    //ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ)
  10. };
  11.  
  12. /// êîíñòàíòû äëÿ ôóíêöèé
  13. enum tl_err {
  14.     TL_ERR_LOAD_CAPTION     = 1, //â ïàìÿòè íåò çàãîëîâêà 'tree'
  15.     TL_ERR_SAVE_MEMOTY_SIZE = 2, //íå õâàòàåò ïàìÿòè äëÿ ñîõðàíåíèÿ ýëåìåíòà
  16.     TL_ERR_LOAD_INFO_SIZE   = 4, //íå ñîâïàäàåò ðàçìåð èíôîðìàöèîííîé ñòðóêòóðû ïðè îòêðûòèè
  17. };
  18.  
  19. typedef struct __attribute__ ((__packed__)) {
  20.     uint16_t    type;   //òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà
  21.     uint8_t     lev;    //óðîâåíü ýëåìåíòà
  22.     uint8_t     clo;    //ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà)
  23.     uint32_t    prev;   //èíäåêñ ïðåäûäóùåãî ýëåìåíòà
  24.     uint32_t    next;   //èíäåêñ ïîñëåäóþùåãî ýëåìåíòà
  25.     uint32_t    tcreat; //âðåì. ñîçäàíèÿ
  26.     uint32_t    tdel;   //âðåì. óäàëåíèÿ
  27. } treelist_node;
  28.  
  29.  
  30. typedef struct __attribute__ ((__packed__)) {
  31.     uint32_t    left;
  32.     uint32_t    top;
  33.     uint32_t    width;
  34.     uint32_t    height;
  35.     void       *data_info;  // óêàçàòåëü íà îñíîâíûå äàíûå
  36.     uint16_t    info_size;  // ðàçìåð äàííûõ âûäåëÿåìûõ äëÿ êàæäîãî óçëà (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè)
  37.     uint32_t    info_max_count; // ìàêñèìàëüíîå êîëè÷åñòâî óçëîâ, êîòîðûå ìîæíî äîáàâèòü â ýëåìåíò
  38.     uint32_t    style;      // ñòèëè ýëåìåíòà
  39.     treelist_node *data_nodes; // óêàçàòåëü íà ñòðóêòóðû óçëîâ
  40.     void       *data_img;   // óêàçàòåëü íà èçîáðàæåíèÿ ñ èêîíêàìè óçëîâ
  41.     uint16_t    img_cx;     // øèðèíà èêîíîê
  42.     uint16_t    img_cy;     // âûñîòà èêîíîê
  43.     void       *data_img_sys;//óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
  44.     uint32_t    ch_tim;     // êîëè÷åñòâî èçìåíåíèé â ôàéëå
  45.     uint32_t    tim_undo;   // êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
  46.     uint32_t    cur_pos;    // ïîçèöèÿ êóðñîðà
  47.     color_t     col_bkg;    // öâåò ôîíà
  48.     color_t     col_zag; // öâåò çàãîëîâêà
  49.     color_t     col_txt; // öâåò òåêñòà
  50.     uint16_t    capt_cy;    // âûñîòà ïîäïèñè
  51.     uint16_t    info_capt_offs;//ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà)
  52.     uint16_t    info_capt_len;//äëèíà òåêñòà ïîäïèñè óçëà (åñëè = 0 òî äî êîíöà ñòðóêòóðû)
  53.     void       *el_focus;   // óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
  54.     scrollbar  *p_scroll;   // óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
  55.     void       *on_press;   // +84 óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ âûçûâàåòñÿ ïðè íàæàòèè Enter
  56. } treelist;
  57.  
  58. static inline treelist* kolibri_new_treelist( uint32_t x_w, uint32_t y_h, uint16_t capt_cy, uint32_t icon_size_xy, uint16_t info_size, uint32_t info_max_count,
  59.                                              uint16_t info_capt_len, uint16_t info_capt_offs, enum tl_style style, void *el_focus, color_t back, color_t title, color_t txt)
  60. {
  61.     treelist *tl = (treelist *)calloc(1, sizeof(treelist));
  62.     tl->left= x_w >> 16;
  63.     tl->width = x_w & 0xFFFF;
  64.     tl->top = y_h >> 16;
  65.     tl->height = y_h & 0xFFFF;
  66.     tl->info_size = info_size;
  67.     tl->info_max_count = info_max_count;
  68.     tl->style = style;
  69.     tl->img_cx = icon_size_xy >> 16;
  70.     tl->img_cy = icon_size_xy & 0xFFFF;
  71.     tl->col_bkg = back;
  72.     tl->col_zag = title;
  73.     tl->col_txt = txt;
  74.     tl->info_capt_len = info_capt_len;
  75.     tl->info_capt_offs = info_capt_offs;
  76.     tl->el_focus = el_focus;
  77.     tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0);
  78.     return tl;
  79. }
  80.  
  81. static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl)
  82. {
  83.     kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl);
  84. }
  85.  
  86.  
  87. ///ðåàêöèÿ íà ìûøü
  88. extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__));
  89.  
  90. ///âûâîä ñïèñêà íà ýêðàí
  91. extern void (*tl_draw)(treelist *) __attribute__((__stdcall__));
  92. __attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl)
  93. {
  94.     tl->p_scroll->all_redraw = 1;
  95.     (*tl_draw)(tl);
  96. }
  97.  
  98.  
  99. ///ïåðåìåùàåì óçåë ââåðõ
  100. extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
  101.  
  102. ///ïåðåìåùàåì óçåë âíèç
  103. extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__));
  104.  
  105. extern void (*tl_data_init_asm)(treelist *) __attribute__((__stdcall__));
  106. ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
  107. static inline void treelist_data_init(treelist *tl)
  108. {
  109.     __asm__ __volatile__ (
  110.              "push %%edi \n\t":::);
  111.  
  112.     (*tl_data_init_asm)(tl);
  113.  
  114.     __asm__ __volatile__ (
  115.              "pop %%edi \n\t":::);
  116. }
  117.  
  118. extern void (*tl_data_clear_asm)(treelist *) __attribute__((__stdcall__));
  119. ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
  120. static inline void treelist_data_clear(treelist *tl)
  121. {
  122.     __asm__ __volatile__ (
  123.              "push %%edi \n\t":::);
  124.  
  125.     (*tl_data_clear_asm)(tl);
  126.  
  127.     __asm__ __volatile__ (
  128.              "pop %%edi \n\t":::);
  129.     free(tl->p_scroll);
  130. }
  131.  
  132. extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__));
  133. ///î÷èñòêà ñïèñêà (èíôîðìàöèè)
  134. static inline void treelist_info_clear(treelist *tl)
  135. {
  136.     __asm__ __volatile__ (
  137.              "push %%edi \n\t":::);
  138.  
  139.     (*tl_info_clear_asm)(tl);
  140.  
  141.     __asm__ __volatile__ (
  142.              "pop %%edi \n\t":::);
  143. }
  144.  
  145. extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
  146. ///ðåàêöèÿ íà êëàâèàòóðó
  147. __attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code)
  148. {
  149.     __asm__ __volatile__ (
  150.              "push %2\n\t"
  151.              "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):);  // indirect call with asterisk *
  152.  
  153. //    (*tl_key_asm)(tl);
  154. }
  155.  
  156. extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__));
  157. ///îòìåíà äåéñòâèÿ
  158. static inline void treelist_undo(treelist *tl)
  159. {
  160.     __asm__ __volatile__ (
  161.              "push %%edi \n\t":::);
  162.  
  163.     (*tl_info_undo_asm)(tl);
  164.  
  165.     __asm__ __volatile__ (
  166.              "pop %%edi \n\t":::);
  167. }
  168.  
  169. extern void (*tl_info_redo_asm)(treelist *) __attribute__((__stdcall__));
  170. ///ïîâòîð äåéñòâèÿ
  171. static inline void treelist_redo(treelist *tl)
  172. {
  173.     __asm__ __volatile__ (
  174.              "push %%edi \n\t":::);
  175.  
  176.     (*tl_info_redo_asm)(tl);
  177.  
  178.     __asm__ __volatile__ (
  179.              "pop %%edi \n\t":::);
  180. }
  181.  
  182. extern void (*tl_node_add_asm)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__));
  183. ///äîáàâèòü óçåë
  184. ///input:
  185. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  186. /// n_opt - îïöèè äîáàâëåíèÿ
  187. /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå
  188. static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev)
  189. {
  190.     __asm__ __volatile__ (
  191.              "push %%ebx \n\t"
  192.              "push %%edi \n\t":::);
  193.  
  194.     uint32_t    n_opt = (type << 16) | (clos << 8) | lev;
  195.     (*tl_node_add_asm)(tl, n_opt, n_info);
  196.  
  197.     __asm__ __volatile__ (
  198.              "pop %%edi \n\t"
  199.              "pop %%ebx \n\t":::);
  200. }
  201.  
  202. extern void (*tl_node_set_data_asm)(treelist *, void *n_info) __attribute__((__stdcall__));
  203. ///çàïèñàòü â òåêóùèé óçåë
  204. ///input:
  205. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  206. /// n_info - óêàçàòåëü íà äàííûå
  207. static inline void treelist_node_setdata(treelist *tl, void *n_info)
  208. {
  209.     __asm__ __volatile__ (
  210.              "push %%esi \n\t"
  211.              "push %%edi \n\t":::);
  212.  
  213.     (*tl_node_set_data_asm)(tl, n_info);
  214.  
  215.     __asm__ __volatile__ (
  216.              "pop %%edi \n\t"
  217.              "pop %%esi \n\t":::);
  218. }
  219.  
  220. extern void* (*tl_node_get_data_asm)(treelist *) __attribute__((__stdcall__));
  221. ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
  222. static inline void* treelist_getdata(treelist *tl)
  223. {
  224.     __asm__ __volatile__ (
  225.              "push %%edi \n\t":::);
  226.  
  227.     void *res =
  228.     (*tl_node_get_data_asm)(tl);
  229.  
  230.     __asm__ __volatile__ (
  231.              "pop %%edi \n\t":::);
  232.     return res;
  233. }
  234.  
  235. extern void (*tl_node_delete_asm)(treelist *) __attribute__((__stdcall__));
  236. ///óäàëèòü óçåë ïîä êóðñîðîì
  237. static inline void treelist_node_delete(treelist *tl)
  238. {
  239.     __asm__ __volatile__ (
  240.              "push %%edi \n\t":::);
  241.  
  242.     (*tl_node_delete_asm)(tl);
  243.  
  244.     __asm__ __volatile__ (
  245.              "pop %%edi \n\t":::);
  246. }
  247.  
  248. extern void (*tl_cur_beg_asm)(treelist *) __attribute__((__stdcall__));
  249. ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
  250. static inline void treelist_cursor_begin(treelist *tl)
  251. {
  252.     __asm__ __volatile__ (
  253.              "push %%edi \n\t":::);
  254.  
  255.     (*tl_cur_beg_asm)(tl);
  256.  
  257.     __asm__ __volatile__ (
  258.              "pop %%edi \n\t":::);
  259. }
  260.  
  261. extern void (*tl_cur_next_asm)(treelist *) __attribute__((__stdcall__));
  262. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
  263. static inline void treelist_cursor_next(treelist *tl)
  264. {
  265.     __asm__ __volatile__ (
  266.              "push %%ebx \n\t"
  267.              "push %%esi \n\t"
  268.              "push %%edi \n\t":::);
  269.  
  270.     (*tl_cur_next_asm)(tl);
  271.  
  272.     __asm__ __volatile__ (
  273.              "pop %%edi \n\t"
  274.              "pop %%esi \n\t"
  275.              "pop %%ebx \n\t":::);
  276. }
  277.  
  278. extern void (*tl_cur_perv_asm)(treelist *) __attribute__((__stdcall__));
  279. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
  280. static inline void treelist_cursor_prev(treelist *tl)
  281. {
  282.     __asm__ __volatile__ (
  283.              "push %%ebx \n\t"
  284.              "push %%esi \n\t"
  285.              "push %%edi \n\t":::);
  286.  
  287.     (*tl_cur_perv_asm)(tl);
  288.  
  289.     __asm__ __volatile__ (
  290.              "pop %%edi \n\t"
  291.              "pop %%esi \n\t"
  292.              "pop %%ebx \n\t":::);
  293. }
  294.  
  295. extern void (*tl_node_close_open_asm)(treelist *) __attribute__((__stdcall__));
  296. ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
  297. static inline void treelist_close_open(treelist *tl)
  298. {
  299.     __asm__ __volatile__ (
  300.              "push %%edi \n\t":::);
  301.  
  302.     (*tl_node_close_open_asm)(tl);
  303.  
  304.     __asm__ __volatile__ (
  305.              "pop %%edi \n\t":::);
  306. }
  307.  
  308. extern void (*tl_node_lev_inc_asm)(treelist *) __attribute__((__stdcall__));
  309. ///óâåëè÷èòü óðîâåíü
  310. static inline void treelist_level_inc(treelist *tl)
  311. {
  312.     __asm__ __volatile__ (
  313.              "push %%edi \n\t":::);
  314.  
  315.     (*tl_node_lev_inc_asm)(tl);
  316.  
  317.     __asm__ __volatile__ (
  318.              "pop %%edi \n\t":::);
  319. }
  320.  
  321. extern void (*tl_node_lev_dec_asm)(treelist *) __attribute__((__stdcall__));
  322. ///óìåíüøèòü óðîâåíü
  323. static inline void treelist_level_dec(treelist *tl)
  324. {
  325.     __asm__ __volatile__ (
  326.              "push %%edi \n\t":::);
  327.  
  328.     (*tl_node_lev_dec_asm)(tl);
  329.  
  330.     __asm__ __volatile__ (
  331.              "pop %%edi \n\t":::);
  332. }
  333.  
  334. extern treelist_node* (*tl_node_poi_get_info_asm)(treelist *, int node_ind) __attribute__((__stdcall__));
  335. ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
  336. ///input:
  337. /// tlist - pointer to 'TreeList' struct
  338. /// node_ind - node index
  339. ///output - pointer to node info or NULL
  340. static inline treelist_node* treelist_getnode(treelist *tl, int node_ind)
  341. {
  342.     __asm__ __volatile__ (
  343.              "push %%ebx \n\t"
  344.              "push %%edi \n\t":::);
  345.  
  346.     treelist_node *ret =
  347.     (*tl_node_poi_get_info_asm)(tl, node_ind);
  348.  
  349.     __asm__ __volatile__ (
  350.              "pop %%edi \n\t"
  351.              "pop %%ebx \n\t":::);
  352.     return ret;
  353. }
  354.  
  355. extern treelist_node* (*tl_node_poi_get_next_info_asm)(treelist *, treelist_node*) __attribute__((__stdcall__));
  356. ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
  357. ///input:
  358. /// tlist - pointer to 'TreeList' struct
  359. /// node_p - node param struct
  360. ///output - pointer to next node struct or NULL
  361. static inline treelist_node* treelist_getnode_next(treelist *tl, treelist_node* node)
  362. {
  363.     __asm__ __volatile__ (
  364.              "push %%ebx \n\t"
  365.              "push %%edi \n\t":::);
  366.  
  367.     treelist_node *ret =
  368.     (*tl_node_poi_get_next_info_asm)(tl, node);
  369.  
  370.     __asm__ __volatile__ (
  371.              "pop %%edi \n\t"
  372.              "pop %%ebx \n\t":::);
  373.     return ret;
  374. }
  375.  
  376. extern void* (*_tl_node_poi_get_data_asm)(treelist *, treelist_node*) __attribute__((__stdcall__));
  377. ///;âçÿòü óêàçàòåëü íà äàííûå óçëà
  378. ///input:
  379. /// tlist - pointer to 'TreeList' struct
  380. /// node_p - node param struct
  381. ///output - pointer
  382. static inline void* treelist_getnode_data(treelist *tl, treelist_node *node)
  383. {
  384.     __asm__ __volatile__ (
  385.              "push %%edi \n\t":::);
  386.  
  387.     void *ret =
  388.     (*_tl_node_poi_get_data_asm)(tl, node);
  389.  
  390.     __asm__ __volatile__ (
  391.              "pop %%edi \n\t":::);
  392.     return ret;
  393. }
  394.  
  395. extern int (*tl_save_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  396. /// tlist - pointer to 'TreeList' struct
  397. /// opt - options: 0 - first element, 1 - add next element
  398. /// h_mem - pointer to memory
  399. /// mem_size - memory size
  400. ///output - error code
  401. static inline int treelist_save2mem(treelist *tl, int opt, void *h_mem, int mem_size)
  402. {
  403.     __asm__ __volatile__ (
  404.              "push %%ebx \n\t"
  405.              "push %%esi \n\t"
  406.              "push %%edi \n\t":::);
  407.  
  408.     int ret =
  409.     (*tl_save_mem_asm)(tl, opt, h_mem, mem_size);
  410.  
  411.     __asm__ __volatile__ (
  412.              "pop %%edi \n\t"
  413.              "pop %%esi \n\t"
  414.              "pop %%ebx \n\t":::);
  415.     return ret;
  416. }
  417.  
  418. extern int (*_tl_load_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  419. /**input:
  420. ; tlist - pointer to 'TreeList' struct
  421. ; opt   - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add        equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè
  422. ; h_mem - pointer to memory
  423. ; mem_size - memory size
  424. ;   ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ)
  425. ;   äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ
  426. ;output:
  427. ; eax - error code
  428. ;memory header format:
  429. ;  +0 - (4) 'tree'
  430. ;  +4 - (2) info size
  431. ;  +6 - (4) count nodes
  432. ; +10 - (4) tlist style
  433. ; +14 - (4) cursor pos
  434. ; +18 - (2) info capt offs
  435. ; +20 - (2) info capt len
  436. ; +22 - (4) scroll pos
  437. ;memory data format:
  438. ; +26 - (info size + 8) * count nodes */
  439. static inline int treelist_load4mem(treelist *tl, int opt, void *h_mem, int mem_size)
  440. {
  441.     __asm__ __volatile__ (
  442.              "push %%ebx \n\t"
  443.              "push %%esi \n\t"
  444.              "push %%edi \n\t":::);
  445.  
  446.     int ret =
  447.     (*_tl_load_mem_asm)(tl, opt, h_mem, mem_size);
  448.  
  449.     __asm__ __volatile__ (
  450.              "pop %%edi \n\t"
  451.              "pop %%esi \n\t"
  452.              "pop %%ebx \n\t":::);
  453.     return ret;
  454. }
  455.  
  456. extern int (*tl_get_mem_size_asm)(treelist *, void *h_mem) __attribute__((__stdcall__));
  457. /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ
  458. /// tlist - pointer to 'TreeList' struct
  459. /// h_mem - pointer to saved memory
  460. static inline int treelist_get_memsize(treelist *tl, void *h_mem)
  461. {
  462.     __asm__ __volatile__ (
  463.              "push %%ebx \n\t"
  464.              "push %%edi \n\t":::);
  465.  
  466.     int ret =
  467.     (*tl_get_mem_size_asm)(tl, h_mem);
  468.  
  469.     __asm__ __volatile__ (
  470.              "pop %%edi \n\t"
  471.              "pop %%ebx \n\t":::);
  472.     return ret;
  473. }
  474.  
  475. #endif //KOLIBRI_TREELIST_H
  476.