Subversion Repositories Kolibri OS

Rev

Rev 6615 | 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,    // ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè ñòðåëêàìè, óäàëÿòü DEL)
  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. // capt_cy may be 0 = no caption
  59. // if icon_size is 16x16, and data_img id NULL, no icons - useful in list mode
  60. 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,
  61.                                              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)
  62. {
  63.     treelist *tl = (treelist *)calloc(1, sizeof(treelist));
  64.     tl->left= x_w >> 16;
  65.     tl->width = x_w & 0xFFFF;
  66.     tl->top = y_h >> 16;
  67.     tl->height = y_h & 0xFFFF;
  68.     tl->info_size = info_size;
  69.     tl->info_max_count = info_max_count;
  70.     tl->style = style;
  71.     tl->img_cx = icon_size_xy >> 16;
  72.     tl->img_cy = icon_size_xy & 0xFFFF;
  73.     tl->col_bkg = back;
  74.     tl->col_zag = title;
  75.     tl->col_txt = txt;
  76.     tl->info_capt_len = info_capt_len;
  77.     tl->info_capt_offs = info_capt_offs;
  78.     tl->el_focus = el_focus;
  79.     tl->capt_cy = capt_cy;
  80.     tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0);
  81.     return tl;
  82. }
  83.  
  84. static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl)
  85. {
  86.     kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl);
  87. }
  88.  
  89.  
  90. ///ðåàêöèÿ íà ìûøü
  91. extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__));
  92.  
  93. ///âûâîä ñïèñêà íà ýêðàí
  94. extern void (*tl_draw)(treelist *) __attribute__((__stdcall__));
  95. __attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl)
  96. {
  97.     tl->p_scroll->all_redraw = 1;
  98.     (*tl_draw)(tl);
  99. }
  100.  
  101.  
  102. ///ïåðåìåùàåì óçåë ââåðõ
  103. extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
  104.  
  105. ///ïåðåìåùàåì óçåë âíèç
  106. extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__));
  107.  
  108. ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
  109. extern void (*tl_data_init)(treelist *) __attribute__((__stdcall__));
  110.  
  111.  
  112. ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
  113. extern void (*tl_data_clear)(treelist *) __attribute__((__stdcall__));
  114. static inline void treelist_data_clear(treelist *tl)
  115. {
  116.     (*tl_data_clear)(tl);
  117.     free(tl->p_scroll);
  118. }
  119.  
  120. ///î÷èñòêà ñïèñêà (èíôîðìàöèè)
  121. extern void (*tl_info_clear)(treelist *) __attribute__((__stdcall__));
  122.  
  123. extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
  124. ///ðåàêöèÿ íà êëàâèàòóðó
  125. __attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code)
  126. {
  127.     __asm__ __volatile__ (
  128.              "push %2\n\t"
  129.              "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):);  // indirect call with asterisk *
  130.  
  131. //    (*tl_key_asm)(tl);
  132. }
  133.  
  134. ///îòìåíà äåéñòâèÿ
  135. extern void (*tl_info_undo)(treelist *) __attribute__((__stdcall__));
  136.  
  137. ///ïîâòîð äåéñòâèÿ
  138. extern void (*tl_info_redo)(treelist *) __attribute__((__stdcall__));
  139.  
  140. extern void (*tl_node_add)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__));
  141. ///äîáàâèòü óçåë
  142. ///input:
  143. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  144. /// n_opt - îïöèè äîáàâëåíèÿ
  145. /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå
  146. static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev)
  147. {
  148.     uint32_t    n_opt = (type << 16) | (clos << 8) | lev;
  149.     (*tl_node_add)(tl, n_opt, n_info);
  150. }
  151.  
  152. ///çàïèñàòü â òåêóùèé óçåë
  153. ///input:
  154. /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
  155. /// n_info - óêàçàòåëü íà äàííûå
  156. extern void (*tl_node_set_data)(treelist *, void *n_info) __attribute__((__stdcall__));
  157.  
  158. ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
  159. extern void* (*tl_node_get_data)(treelist *) __attribute__((__stdcall__));
  160.  
  161. ///óäàëèòü óçåë ïîä êóðñîðîì
  162. extern void (*tl_node_delete)(treelist *) __attribute__((__stdcall__));
  163.  
  164. ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
  165. extern void (*tl_cur_beg)(treelist *) __attribute__((__stdcall__));
  166.  
  167. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
  168. extern void (*tl_cur_next)(treelist *) __attribute__((__stdcall__));
  169.  
  170. ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
  171. extern void (*tl_cur_perv)(treelist *) __attribute__((__stdcall__));
  172.  
  173. ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
  174. extern void (*tl_node_close_open)(treelist *) __attribute__((__stdcall__));
  175.  
  176. ///óâåëè÷èòü óðîâåíü
  177. extern void (*tl_node_lev_inc)(treelist *) __attribute__((__stdcall__));
  178.  
  179. ///óìåíüøèòü óðîâåíü
  180. extern void (*tl_node_lev_dec)(treelist *) __attribute__((__stdcall__));
  181.  
  182. ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
  183. ///input:
  184. /// tlist - pointer to 'TreeList' struct
  185. /// node_ind - node index
  186. ///output - pointer to node info or NULL
  187. extern treelist_node* (*tl_node_poi_get_info)(treelist *, int node_ind) __attribute__((__stdcall__));
  188.  
  189. ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
  190. ///input:
  191. /// tlist - pointer to 'TreeList' struct
  192. /// node_p - node param struct
  193. ///output - pointer to next node struct or NULL
  194. extern treelist_node* (*tl_node_poi_get_next_info)(treelist *, treelist_node*) __attribute__((__stdcall__));
  195.  
  196. ///;âçÿòü óêàçàòåëü íà äàííûå óçëà
  197. ///input:
  198. /// tlist - pointer to 'TreeList' struct
  199. /// node_p - node param struct
  200. ///output - pointer
  201. extern void* (*_tl_node_poi_get_data)(treelist *, treelist_node*) __attribute__((__stdcall__));
  202.  
  203. /// tlist - pointer to 'TreeList' struct
  204. /// opt - options: 0 - first element, 1 - add next element
  205. /// h_mem - pointer to memory
  206. /// mem_size - memory size
  207. ///output - error code
  208. extern int (*tl_save_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  209.  
  210. /**input:
  211. ; tlist - pointer to 'TreeList' struct
  212. ; opt   - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add        equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè
  213. ; h_mem - pointer to memory
  214. ; mem_size - memory size
  215. ;   ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ)
  216. ;   äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ
  217. ;output:
  218. ; eax - error code
  219. ;memory header format:
  220. ;  +0 - (4) 'tree'
  221. ;  +4 - (2) info size
  222. ;  +6 - (4) count nodes
  223. ; +10 - (4) tlist style
  224. ; +14 - (4) cursor pos
  225. ; +18 - (2) info capt offs
  226. ; +20 - (2) info capt len
  227. ; +22 - (4) scroll pos
  228. ;memory data format:
  229. ; +26 - (info size + 8) * count nodes */
  230. extern int (*_tl_load_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
  231.  
  232. /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ
  233. /// tlist - pointer to 'TreeList' struct
  234. /// h_mem - pointer to saved memory
  235. extern int (*tl_get_mem_size)(treelist *, void *h_mem) __attribute__((__stdcall__));
  236.  
  237. #endif //KOLIBRI_TREELIST_H
  238.