diff -urN cui57/etext.c cui58/etext.c --- cui57/etext.c Sun Feb 2 22:10:00 2014 +++ cui58/etext.c Sun Feb 2 22:20:00 2014 @@ -1,4 +1,5 @@ #include "etext.h" +#include "menu.h" #include "handler.h" #include "key.h" #include @@ -34,6 +35,9 @@ p->lbf_shadow = cui_lblfix_new(p->view_cursor, 0, 0, CUI_ETEXT_BSIZE, p->buf, CUI_ATTR_REVERSE); cui_hide(p->view_cursor); + p->hist_n = 0; + cui_etext_hist_add(obj); + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_etext_hdr, NULL); } @@ -58,6 +62,88 @@ } void +cui_etext_selall_in(cui obj) +{ + cui_etext p = (cui_etext)obj; + p->cursor = 0; + cui_etext_cursor_update(obj); + cui_w_set(p->view_cursor, p->lbf->w); + cui_show(p->view_cursor); + p->mode = CUI_ETEXT_MODE_SELALL; +} + +char * +cui_etext_hist_rbuf(cui obj, int i) +{ + cui_etext p = (cui_etext)obj; + return p->hist[ i % CUI_ETEXT_HIST_LEN ]; +} + +void +cui_etext_hist_del(cui obj, char *str) +{ + cui_etext p = (cui_etext)obj; + int i, s; + + s = p->hist_n <= CUI_ETEXT_HIST_LEN ? 0 : p->hist_n - CUI_ETEXT_HIST_LEN; + for(i=p->hist_n-1; i>=s; i--){ + if(strcmp(cui_etext_hist_rbuf(obj, i), str) == 0) break; + } + if(i < s) return; /* not found */ + /* del */ + for(p->hist_n--; i < p->hist_n; i++){ + strcpy(cui_etext_hist_rbuf(obj, i), cui_etext_hist_rbuf(obj, i+1)); + } +} + +void +cui_etext_hist_add(cui obj) +{ + cui_etext p = (cui_etext)obj; + if(p->buf[0] == '\0') return; + cui_etext_hist_del(obj, p->buf); + strcpy(cui_etext_hist_rbuf(obj, p->hist_n++), p->buf); +} + +int +cui_etext_hist_menu_hdr(cui pm, int evt, int val, void *prm) +{ + cui obj = (cui)prm; + cui_etext p = (cui_etext)obj; + + strcpy(p->buf, cui_menu_popup_str_get(pm)); + cui_lblfix_str_set(p->lbf, p->buf); + cui_lblfix_str_set(p->lbf_shadow, p->buf); + p->n = strlen(p->buf); + cui_etext_hist_add(obj); + cui_etext_selall_in(obj); + return TRUE; +} + +void +cui_etext_hist_menu(cui obj) +{ + cui_etext p = (cui_etext)obj; + char *lst[ CUI_ETEXT_HIST_LEN + 1 ]; + int i, s, j; + cui pm; + + if(p->hist_n <= 0) return; + + s = p->hist_n <= CUI_ETEXT_HIST_LEN ? 0 : p->hist_n - CUI_ETEXT_HIST_LEN; + j = 0; + for(i=p->hist_n-1; i>=s; i--) lst[j++] = cui_etext_hist_rbuf(obj, i); + lst[j] = NULL; + + pm = cui_menu_popup_new(obj->parent, obj->x+1, obj->y+1, 0, lst, 0); + cui_bind(pm, CUI_EVT_BUTTON, cui_etext_hist_menu_hdr, p); + cui_hide(pm); + cui_handler_call(pm, CUI_EVT_KEY, CUI_KEY_ENTER); + cui_del(pm); + cui_free(pm); +} + +void cui_etext_edit_out(cui obj) { cui_etext p = (cui_etext)obj; @@ -67,7 +153,10 @@ cui_lblfix_attr_set(p->lbf, CUI_ATTR_ULINE); cui_x_set(p->lbf, 0); p->mode = CUI_ETEXT_MODE_NORMAL; - if(strcmp(p->buf, p->bak) != 0) cui_handler_call(obj, CUI_EVT_BUTTON, 0); + if(strcmp(p->buf, p->bak) != 0){ + cui_etext_hist_add(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, 0); + } } void @@ -106,13 +195,7 @@ case CUI_ETEXT_MODE_NORMAL: if(val == CUI_KEY_ENTER){ if(p->buf[0] == '\0') cui_etext_edit_in(obj, val); - else{ - p->cursor = 0; - cui_etext_cursor_update(obj); - cui_w_set(p->view_cursor, p->lbf->w); - cui_show(p->view_cursor); - p->mode = CUI_ETEXT_MODE_SELALL; - } + else cui_etext_selall_in(obj); return TRUE; } return FALSE; @@ -129,6 +212,9 @@ case CUI_KEY_BS: cui_etext_edit_in(obj, val); break; + case CUI_KEY_DOWN: + cui_etext_hist_menu(obj); + break; } return TRUE; case CUI_ETEXT_MODE_EDIT: @@ -149,7 +235,9 @@ cui_etext_cursor_update(obj); break; case CUI_KEY_UP: + break; case CUI_KEY_DOWN: + cui_etext_hist_menu(obj); break; case CUI_KEY_BS: if(p->cursor <= 0) break; diff -urN cui57/etext.h cui58/etext.h --- cui57/etext.h Sun Feb 2 22:10:00 2014 +++ cui58/etext.h Sun Feb 2 22:20:00 2014 @@ -4,6 +4,7 @@ #include "lblfix.h" #define CUI_ETEXT_BSIZE 1024 +#define CUI_ETEXT_HIST_LEN 20 #define CUI_ETEXT_MODE_NORMAL (1<<0) #define CUI_ETEXT_MODE_SELALL (1<<1) @@ -18,10 +19,14 @@ int mode; int n, cursor; cui view_cursor, lbf_shadow; + + char hist[ CUI_ETEXT_HIST_LEN ][ CUI_ETEXT_BSIZE ]; + int hist_n; } *cui_etext; cui cui_etext_new(cui parent, int x, int y, int w, char *init_s); void cui_etext_init(cui obj, cui parent, int x, int y, int w, char *init_s); +void cui_etext_hist_add(cui obj); void cui_etext_cursor_update(cui obj); int cui_etext_hdr(cui obj, int evt, int val, void *prm); char *cui_etext_str_get(cui obj); diff -urN cui57/menu.c cui58/menu.c --- cui57/menu.c Sat Feb 1 02:00:00 2014 +++ cui58/menu.c Sun Feb 2 22:20:00 2014 @@ -190,11 +190,12 @@ if(w >= 0) cui_menu_item_w_set(obj, w); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); cui_hide(p->menu); + cui_draw(p->menu->parent); p->val = val; cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); cui_bind(obj, CUI_EVT_KEY, cui_menu_popup_hdr, NULL); - cui_bind(p->menu, CUI_EVT_BUTTON,cui_menu_popup_hdr, obj); + cui_bind(p->menu, CUI_EVT_BUTTON, cui_menu_popup_hdr, obj); } int @@ -209,7 +210,8 @@ cui_show(menu); cui_main(menu, cui_index_to_child(menu, p->val)); cui_hide(menu); - if(p->val != bak){ + if(p->val < 0) p->val = bak; + else{ char *s = cui_menu_item_str_get(cui_index_to_child(menu, p->val)); cui_menu_item_str_set(obj, s); cui_handler_call(obj, CUI_EVT_BUTTON, p->val); @@ -218,11 +220,17 @@ return TRUE; }else if(evt == CUI_EVT_BUTTON){ /* menu */ cui_menu_popup p = (cui_menu_popup)prm; - if(val >= 0) p->val = val; + p->val = val; cui_quit(); return TRUE; } return FALSE; +} + +char * +cui_menu_popup_str_get(cui obj) +{ + return cui_menu_item_str_get(obj); } /* EOF */ diff -urN cui57/menu.h cui58/menu.h --- cui57/menu.h Sat Feb 1 02:00:00 2014 +++ cui58/menu.h Sun Feb 2 22:20:00 2014 @@ -38,5 +38,6 @@ cui cui_menu_popup_new(cui parent, int x, int y, int w, char **lst, int val); void cui_menu_popup_init(cui obj, cui parent, int x, int y, int w, char **lst, int val); int cui_menu_popup_hdr(cui obj, int evt, int val, void *prm); +char *cui_menu_popup_str_get(cui obj); #endif