Subversion Repositories Kolibri OS

Rev

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(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. ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
  106. extern void (*tl_data_init)(treelist *) __attribute__((__stdcall__));
  107.  
  108.  
  109. ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
  110. extern void (*tl_data_clear)(treelist *) __attribute__((__stdcall__));
  111. static inline void treelist_data_clear(treelist *tl)
  112. {
  113.     (*tl_data_clear)(tl);
  114.     free(tl->p_scroll);
  115. }
  116.  
  117. ///î÷èñòêà ñïèñêà (èíôîðìàöèè)
  118. extern void (*tl_info_clear)(treelist *) __attribute__((__stdcall__));
  119.  
  120. extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
  121. ///ðåàêöèÿ íà êëàâèàòóðó
  122. __attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code)
  123. {
  124.     __asm__ __volatile__ (
  125.              "push %2\n\t"
  126.              "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):);  // indirect call with asterisk *
  127.  
  128. //    (*tl_key_asm)(tl);
  129. }
  130.  
  131. ///îòìåíà äåéñòâèÿ
  132. extern void (*tl_info_undo)(treelist *) __attribute__((__stdcall__));
  133.  
  134. ///ïîâòîð äåéñòâèÿ
  135. extern void (*tl_info_redo)(treelist *) __attribute__((__stdcall__));
  136.  
  137. extern void (*tl_node_add)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__));
  138. ///äîáàâèòü óçåë
  139. ///input:
  140. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  141. /// n_opt - îïöèè äîáàâëåíèÿ
  142. /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå
  143. static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev)
  144. {
  145.     uint32_t    n_opt = (type << 16) | (clos << 8) | lev;
  146.     (*tl_node_add)(tl, n_opt, n_info);
  147. }
  148.  
  149. ///çàïèñàòü â òåêóùèé óçåë
  150. ///input:
  151. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  152. /// n_info - óêàçàòåëü íà äàííûå
  153. extern void (*tl_node_set_data)(treelist *, void *n_info) __attribute__((__stdcall__));
  154.  
  155. ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
  156. extern void* (*tl_node_get_data)(treelist *) __attribute__((__stdcall__));
  157.  
  158. ///óäàëèòü óçåë ïîä êóðñîðîì
  159. extern void (*tl_node_delete)(treelist *) __attribute__((__stdcall__));
  160.  
  161. ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
  162. extern void (*tl_cur_beg)(treelist *) __attribute__((__stdcall__));
  163.  
  164. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
  165. extern void (*tl_cur_next)(treelist *) __attribute__((__stdcall__));
  166.  
  167. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
  168. extern void (*tl_cur_perv)(treelist *) __attribute__((__stdcall__));
  169.  
  170. ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
  171. extern void (*tl_node_close_open)(treelist *) __attribute__((__stdcall__));
  172.  
  173. ///óâåëè÷èòü óðîâåíü
  174. extern void (*tl_node_lev_inc)(treelist *) __attribute__((__stdcall__));
  175.  
  176. ///óìåíüøèòü óðîâåíü
  177. extern void (*tl_node_lev_dec)(treelist *) __attribute__((__stdcall__));
  178.  
  179. ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
  180. ///input:
  181. /// tlist - pointer to 'TreeList' struct
  182. /// node_ind - node index
  183. ///output - pointer to node info or NULL
  184. extern treelist_node* (*tl_node_poi_get_info)(treelist *, int node_ind) __attribute__((__stdcall__));
  185.  
  186. ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
  187. ///input:
  188. /// tlist - pointer to 'TreeList' struct
  189. /// node_p - node param struct
  190. ///output - pointer to next node struct or NULL
  191. extern treelist_node* (*tl_node_poi_get_next_info)(treelist *, treelist_node*) __attribute__((__stdcall__));
  192.  
  193. ///;âçÿòü óêàçàòåëü íà äàííûå óçëà
  194. ///input:
  195. /// tlist - pointer to 'TreeList' struct
  196. /// node_p - node param struct
  197. ///output - pointer
  198. extern void* (*_tl_node_poi_get_data)(treelist *, treelist_node*) __attribute__((__stdcall__));
  199.  
  200. /// tlist - pointer to 'TreeList' struct
  201. /// opt - options: 0 - first element, 1 - add next element
  202. /// h_mem - pointer to memory
  203. /// mem_size - memory size
  204. ///output - error code
  205. extern int (*tl_save_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  206.  
  207. /**input:
  208. ; tlist - pointer to 'TreeList' struct
  209. ; opt   - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add        equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè
  210. ; h_mem - pointer to memory
  211. ; mem_size - memory size
  212. ;   ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ)
  213. ;   äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ
  214. ;output:
  215. ; eax - error code
  216. ;memory header format:
  217. ;  +0 - (4) 'tree'
  218. ;  +4 - (2) info size
  219. ;  +6 - (4) count nodes
  220. ; +10 - (4) tlist style
  221. ; +14 - (4) cursor pos
  222. ; +18 - (2) info capt offs
  223. ; +20 - (2) info capt len
  224. ; +22 - (4) scroll pos
  225. ;memory data format:
  226. ; +26 - (info size + 8) * count nodes */
  227. extern int (*_tl_load_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  228.  
  229. /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ
  230. /// tlist - pointer to 'TreeList' struct
  231. /// h_mem - pointer to saved memory
  232. extern int (*tl_get_mem_size)(treelist *, void *h_mem) __attribute__((__stdcall__));
  233.  
  234. #endif //KOLIBRI_TREELIST_H
  235.