Subversion Repositories Kolibri OS

Rev

Rev 6589 | Rev 6612 | 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(70, 30), 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.  
  93. ///ïåðåìåùàåì óçåë ââåðõ
  94. extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
  95.  
  96. ///ïåðåìåùàåì óçåë âíèç
  97. extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__));
  98.  
  99. extern void (*tl_data_init_asm)(treelist *) __attribute__((__stdcall__));
  100. ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
  101. static inline void treelist_data_init(treelist *tl)
  102. {
  103.     __asm__ __volatile__ (
  104.              "push %%edi \n\t":::);
  105.  
  106.     (*tl_data_init_asm)(tl);
  107.  
  108.     __asm__ __volatile__ (
  109.              "pop %%edi \n\t":::);
  110. }
  111.  
  112. extern void (*tl_data_clear_asm)(treelist *) __attribute__((__stdcall__));
  113. ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
  114. static inline void treelist_data_clear(treelist *tl)
  115. {
  116.     __asm__ __volatile__ (
  117.              "push %%edi \n\t":::);
  118.  
  119.     (*tl_data_clear_asm)(tl);
  120.  
  121.     __asm__ __volatile__ (
  122.              "pop %%edi \n\t":::);
  123. }
  124.  
  125. extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__));
  126. ///î÷èñòêà ñïèñêà (èíôîðìàöèè)
  127. static inline void treelist_info_clear(treelist *tl)
  128. {
  129.     __asm__ __volatile__ (
  130.              "push %%edi \n\t":::);
  131.  
  132.     (*tl_info_clear_asm)(tl);
  133.  
  134.     __asm__ __volatile__ (
  135.              "pop %%edi \n\t":::);
  136. }
  137.  
  138. extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
  139. ///ðåàêöèÿ íà êëàâèàòóðó
  140. static inline void treelist_key(treelist *tl)
  141. {
  142.     __asm__ __volatile__ (
  143.              "push %%ebx \n\t"
  144.              "push %%edi \n\t":::);
  145.  
  146.     (*tl_key_asm)(tl);
  147.  
  148.     __asm__ __volatile__ (
  149.              "pop %%edi \n\t"
  150.              "pop %%ebx \n\t":::);
  151. }
  152.  
  153. extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__));
  154. ///îòìåíà äåéñòâèÿ
  155. static inline void treelist_undo(treelist *tl)
  156. {
  157.     __asm__ __volatile__ (
  158.              "push %%edi \n\t":::);
  159.  
  160.     (*tl_info_undo_asm)(tl);
  161.  
  162.     __asm__ __volatile__ (
  163.              "pop %%edi \n\t":::);
  164. }
  165.  
  166. extern void (*tl_info_redo_asm)(treelist *) __attribute__((__stdcall__));
  167. ///ïîâòîð äåéñòâèÿ
  168. static inline void treelist_redo(treelist *tl)
  169. {
  170.     __asm__ __volatile__ (
  171.              "push %%edi \n\t":::);
  172.  
  173.     (*tl_info_redo_asm)(tl);
  174.  
  175.     __asm__ __volatile__ (
  176.              "pop %%edi \n\t":::);
  177. }
  178.  
  179. extern void (*tl_node_add_asm)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__));
  180. ///äîáàâèòü óçåë
  181. ///input:
  182. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  183. /// n_opt - îïöèè äîáàâëåíèÿ
  184. /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå
  185. static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev)
  186. {
  187.     __asm__ __volatile__ (
  188.              "push %%ebx \n\t"
  189.              "push %%edi \n\t":::);
  190.  
  191.     uint32_t    n_opt = (type << 16) | (clos << 8) | lev;
  192.     (*tl_node_add_asm)(tl, n_opt, n_info);
  193.  
  194.     __asm__ __volatile__ (
  195.              "pop %%edi \n\t"
  196.              "pop %%ebx \n\t":::);
  197. }
  198.  
  199. extern void (*tl_node_set_data_asm)(treelist *, void *n_info) __attribute__((__stdcall__));
  200. ///çàïèñàòü â òåêóùèé óçåë
  201. ///input:
  202. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  203. /// n_info - óêàçàòåëü íà äàííûå
  204. static inline void treelist_node_setdata(treelist *tl, void *n_info)
  205. {
  206.     __asm__ __volatile__ (
  207.              "push %%esi \n\t"
  208.              "push %%edi \n\t":::);
  209.  
  210.     (*tl_node_set_data_asm)(tl, n_info);
  211.  
  212.     __asm__ __volatile__ (
  213.              "pop %%edi \n\t"
  214.              "pop %%esi \n\t":::);
  215. }
  216.  
  217. extern void* (*tl_node_get_data_asm)(treelist *) __attribute__((__stdcall__));
  218. ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
  219. static inline void* treelist_getdata(treelist *tl)
  220. {
  221.     __asm__ __volatile__ (
  222.              "push %%edi \n\t":::);
  223.  
  224.     void *res =
  225.     (*tl_node_get_data_asm)(tl);
  226.  
  227.     __asm__ __volatile__ (
  228.              "pop %%edi \n\t":::);
  229.     return res;
  230. }
  231.  
  232. extern void (*tl_node_delete_asm)(treelist *) __attribute__((__stdcall__));
  233. ///óäàëèòü óçåë ïîä êóðñîðîì
  234. static inline void treelist_node_delete(treelist *tl)
  235. {
  236.     __asm__ __volatile__ (
  237.              "push %%edi \n\t":::);
  238.  
  239.     (*tl_node_delete_asm)(tl);
  240.  
  241.     __asm__ __volatile__ (
  242.              "pop %%edi \n\t":::);
  243. }
  244.  
  245. extern void (*tl_cur_beg_asm)(treelist *) __attribute__((__stdcall__));
  246. ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
  247. static inline void treelist_cursor_begin(treelist *tl)
  248. {
  249.     __asm__ __volatile__ (
  250.              "push %%edi \n\t":::);
  251.  
  252.     (*tl_cur_beg_asm)(tl);
  253.  
  254.     __asm__ __volatile__ (
  255.              "pop %%edi \n\t":::);
  256. }
  257.  
  258. extern void (*tl_cur_next_asm)(treelist *) __attribute__((__stdcall__));
  259. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
  260. static inline void treelist_cursor_next(treelist *tl)
  261. {
  262.     __asm__ __volatile__ (
  263.              "push %%ebx \n\t"
  264.              "push %%esi \n\t"
  265.              "push %%edi \n\t":::);
  266.  
  267.     (*tl_cur_next_asm)(tl);
  268.  
  269.     __asm__ __volatile__ (
  270.              "pop %%edi \n\t"
  271.              "pop %%esi \n\t"
  272.              "pop %%ebx \n\t":::);
  273. }
  274.  
  275. extern void (*tl_cur_perv_asm)(treelist *) __attribute__((__stdcall__));
  276. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
  277. static inline void treelist_cursor_prev(treelist *tl)
  278. {
  279.     __asm__ __volatile__ (
  280.              "push %%ebx \n\t"
  281.              "push %%esi \n\t"
  282.              "push %%edi \n\t":::);
  283.  
  284.     (*tl_cur_perv_asm)(tl);
  285.  
  286.     __asm__ __volatile__ (
  287.              "pop %%edi \n\t"
  288.              "pop %%esi \n\t"
  289.              "pop %%ebx \n\t":::);
  290. }
  291.  
  292. extern void (*tl_node_close_open_asm)(treelist *) __attribute__((__stdcall__));
  293. ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
  294. static inline void treelist_close_open(treelist *tl)
  295. {
  296.     __asm__ __volatile__ (
  297.              "push %%edi \n\t":::);
  298.  
  299.     (*tl_node_close_open_asm)(tl);
  300.  
  301.     __asm__ __volatile__ (
  302.              "pop %%edi \n\t":::);
  303. }
  304.  
  305. extern void (*tl_node_lev_inc_asm)(treelist *) __attribute__((__stdcall__));
  306. ///óâåëè÷èòü óðîâåíü
  307. static inline void treelist_level_inc(treelist *tl)
  308. {
  309.     __asm__ __volatile__ (
  310.              "push %%edi \n\t":::);
  311.  
  312.     (*tl_node_lev_inc_asm)(tl);
  313.  
  314.     __asm__ __volatile__ (
  315.              "pop %%edi \n\t":::);
  316. }
  317.  
  318. extern void (*tl_node_lev_dec_asm)(treelist *) __attribute__((__stdcall__));
  319. ///óìåíüøèòü óðîâåíü
  320. static inline void treelist_level_dec(treelist *tl)
  321. {
  322.     __asm__ __volatile__ (
  323.              "push %%edi \n\t":::);
  324.  
  325.     (*tl_node_lev_dec_asm)(tl);
  326.  
  327.     __asm__ __volatile__ (
  328.              "pop %%edi \n\t":::);
  329. }
  330.  
  331. extern treelist_node* (*tl_node_poi_get_info_asm)(treelist *, int node_ind) __attribute__((__stdcall__));
  332. ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
  333. ///input:
  334. /// tlist - pointer to 'TreeList' struct
  335. /// node_ind - node index
  336. ///output - pointer to node info or NULL
  337. static inline treelist_node* treelist_getnode(treelist *tl, int node_ind)
  338. {
  339.     __asm__ __volatile__ (
  340.              "push %%ebx \n\t"
  341.              "push %%edi \n\t":::);
  342.  
  343.     treelist_node *ret =
  344.     (*tl_node_poi_get_info_asm)(tl, node_ind);
  345.  
  346.     __asm__ __volatile__ (
  347.              "pop %%edi \n\t"
  348.              "pop %%ebx \n\t":::);
  349.     return ret;
  350. }
  351.  
  352. extern treelist_node* (*tl_node_poi_get_next_info_asm)(treelist *, treelist_node*) __attribute__((__stdcall__));
  353. ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
  354. ///input:
  355. /// tlist - pointer to 'TreeList' struct
  356. /// node_p - node param struct
  357. ///output - pointer to next node struct or NULL
  358. static inline treelist_node* treelist_getnode_next(treelist *tl, treelist_node* node)
  359. {
  360.     __asm__ __volatile__ (
  361.              "push %%ebx \n\t"
  362.              "push %%edi \n\t":::);
  363.  
  364.     treelist_node *ret =
  365.     (*tl_node_poi_get_next_info_asm)(tl, node);
  366.  
  367.     __asm__ __volatile__ (
  368.              "pop %%edi \n\t"
  369.              "pop %%ebx \n\t":::);
  370.     return ret;
  371. }
  372.  
  373. extern void* (*_tl_node_poi_get_data_asm)(treelist *, treelist_node*) __attribute__((__stdcall__));
  374. ///;âçÿòü óêàçàòåëü íà äàííûå óçëà
  375. ///input:
  376. /// tlist - pointer to 'TreeList' struct
  377. /// node_p - node param struct
  378. ///output - pointer
  379. static inline void* treelist_getnode_data(treelist *tl, treelist_node *node)
  380. {
  381.     __asm__ __volatile__ (
  382.              "push %%edi \n\t":::);
  383.  
  384.     void *ret =
  385.     (*_tl_node_poi_get_data_asm)(tl, node);
  386.  
  387.     __asm__ __volatile__ (
  388.              "pop %%edi \n\t":::);
  389.     return ret;
  390. }
  391.  
  392. extern int (*tl_save_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  393. /// tlist - pointer to 'TreeList' struct
  394. /// opt - options: 0 - first element, 1 - add next element
  395. /// h_mem - pointer to memory
  396. /// mem_size - memory size
  397. ///output - error code
  398. static inline int treelist_save2mem(treelist *tl, int opt, void *h_mem, int mem_size)
  399. {
  400.     __asm__ __volatile__ (
  401.              "push %%ebx \n\t"
  402.              "push %%esi \n\t"
  403.              "push %%edi \n\t":::);
  404.  
  405.     int ret =
  406.     (*tl_save_mem_asm)(tl, opt, h_mem, mem_size);
  407.  
  408.     __asm__ __volatile__ (
  409.              "pop %%edi \n\t"
  410.              "pop %%esi \n\t"
  411.              "pop %%ebx \n\t":::);
  412.     return ret;
  413. }
  414.  
  415. extern int (*_tl_load_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  416. /**input:
  417. ; tlist - pointer to 'TreeList' struct
  418. ; opt   - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add        equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè
  419. ; h_mem - pointer to memory
  420. ; mem_size - memory size
  421. ;   ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ)
  422. ;   äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ
  423. ;output:
  424. ; eax - error code
  425. ;memory header format:
  426. ;  +0 - (4) 'tree'
  427. ;  +4 - (2) info size
  428. ;  +6 - (4) count nodes
  429. ; +10 - (4) tlist style
  430. ; +14 - (4) cursor pos
  431. ; +18 - (2) info capt offs
  432. ; +20 - (2) info capt len
  433. ; +22 - (4) scroll pos
  434. ;memory data format:
  435. ; +26 - (info size + 8) * count nodes */
  436. static inline int treelist_load4mem(treelist *tl, int opt, void *h_mem, int mem_size)
  437. {
  438.     __asm__ __volatile__ (
  439.              "push %%ebx \n\t"
  440.              "push %%esi \n\t"
  441.              "push %%edi \n\t":::);
  442.  
  443.     int ret =
  444.     (*_tl_load_mem_asm)(tl, opt, h_mem, mem_size);
  445.  
  446.     __asm__ __volatile__ (
  447.              "pop %%edi \n\t"
  448.              "pop %%esi \n\t"
  449.              "pop %%ebx \n\t":::);
  450.     return ret;
  451. }
  452.  
  453. extern int (*tl_get_mem_size_asm)(treelist *, void *h_mem) __attribute__((__stdcall__));
  454. /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ
  455. /// tlist - pointer to 'TreeList' struct
  456. /// h_mem - pointer to saved memory
  457. static inline int treelist_get_memsize(treelist *tl, void *h_mem)
  458. {
  459.     __asm__ __volatile__ (
  460.              "push %%ebx \n\t"
  461.              "push %%edi \n\t":::);
  462.  
  463.     int ret =
  464.     (*tl_get_mem_size_asm)(tl, h_mem);
  465.  
  466.     __asm__ __volatile__ (
  467.              "pop %%edi \n\t"
  468.              "pop %%ebx \n\t":::);
  469.     return ret;
  470. }
  471.  
  472. #endif //KOLIBRI_TREELIST_H
  473.