OSDN Git Service

avoid having multiple connections to a single host.
[ntch/develop.git] / src / ui / disp_reslist.c
index e011745..4475838 100644 (file)
 #define NT_CMD_ID 4
 #define NT_CMD_SEARCH_THREAD 5
 #define NT_CMD_FAVORITE 6
+#define NT_CMD_AUTO_SCROLL 7
+
+#define AUTO_SCROLL_NONE 0
+#define AUTO_SCROLL_UP  -1
+#define AUTO_SCROLL_DOWN 1
 
 typedef struct tag_ctx_reslist_t *ctx_reslist_tp;
 typedef struct tag_ctx_reslist_t
@@ -59,6 +64,8 @@ typedef struct tag_ctx_reslist_t
        BOOL regex_init;
        int sel_res_no;
        int sel_res_line;
+       
+       int auto_scroll;
 
        nt_link_tp res_disp_list;
        
@@ -82,7 +89,7 @@ static ctx_reslist_tp init_context(nt_2ch_selected_item_handle h_select,
                        nt_usr_db_handle usr_db_handle);
 static BOOL reslist_clone(nt_thread_handle h_thread, ctx_reslist_tp ctxp);
 static void int_ptr_free(void *ptr);
-static int parse_cmd1(const char *param, int *statep, const char **end);
+static int parse_cmd1(const char *param, const char **end);
 static BOOL search_line_asc(regex_t *regexp, nt_link_tp reslistp, 
                        int *sel_res_no, int *sel_res_line, int column);
 static BOOL search_line_desc(regex_t *regexp, ctx_reslist_tp ctxp,
@@ -122,7 +129,6 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
        wchar_t buf[1024*3+1];
        wchar_t *cptr;
        nt_link_tp link_curp;
-       int state;
        BOOL search_asc;
        BOOL adjust;
        BOOL set_value;
@@ -130,7 +136,9 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
        int  cmd;
        attr_t new_res_attr;
        const char *endp;
-
+       int result_state;
+       int auto_scroll_state;
+       
        ctxp = (ctx_reslist_tp)wp->data;
        if(!ctxp){
                ctxp = init_context(h_select, usr_db_handle);
@@ -150,7 +158,7 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                ctxp->prev_state = prev_state;
 
        ch = wp->key;
-
+       result_state = DISP_STATE_RESLIST;
 
        if(ctxp->max_cur_res < 0 || ctxp->max_cur_offset < 0){
                wlines = wp->lines;
@@ -211,8 +219,27 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                        clistp = clistp->prev;
                }
        }
+       
+       auto_scroll_state = ctxp->auto_scroll;
+       if(ch == NT_KEY_CMD_AUTO_SCROLL){
+               result_state |= DISP_CMD_AUTO_SCROLL;
+               if(ctxp->auto_scroll == AUTO_SCROLL_UP){
+                       ch = NT_KEY_UP;
+               }else{
+                       ch = NT_KEY_DOWN;
+                       ctxp->auto_scroll = AUTO_SCROLL_DOWN;
+               }
+       }else{
+               ctxp->auto_scroll = AUTO_SCROLL_NONE;
+       }
 
        switch(ch){
+       case NT_KEY_CMD_BOARD_UPDATE:
+               if(auto_scroll_state != AUTO_SCROLL_NONE){
+                       result_state |= DISP_CMD_AUTO_SCROLL;
+                       ctxp->auto_scroll = auto_scroll_state;
+               }
+               break;
        case NT_KEY_REFRESH:
                return DISP_STATE_REFRESH; 
        case NT_KEY_CLOSE:
@@ -395,14 +422,16 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                break;
        case NT_KEY_COMMAND1:
                assert(wp->cmd_param);
-               cmd = parse_cmd1(wp->cmd_param, &state, &endp);
+               cmd = parse_cmd1(wp->cmd_param, &endp);
                switch(cmd){
+               case NT_CMD_AUTO_SCROLL:
+                       return DISP_CMD_AUTO_SCROLL | DISP_STATE_RESLIST;
                case NT_CMD_SEARCH_THREAD:
                        return DISP_STATE_SEARCH_THREAD;
                case NT_CMD_FAVORITE:
                        return DISP_STATE_FAVORITE;
                case NT_CMD_WRITE:
-                       return state;
+                       return DISP_STATE_EDITOR;
                case NT_CMD_JMP_NEW:
                        if(ctxp->prev_read_cnt <= 0)
                                ctxp->cur_res = 0;
@@ -458,6 +487,10 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                break;
        case NT_KEY_UP:
        case KEY_UP:
+               if(auto_scroll_state != AUTO_SCROLL_NONE){
+                       result_state |= DISP_CMD_AUTO_SCROLL;
+                       ctxp->auto_scroll = AUTO_SCROLL_UP;
+               }
                ctxp->cur_res_offset--;
                if(0 <= ctxp->cur_res_offset){
                        break;
@@ -504,6 +537,10 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                break;
        case NT_KEY_DOWN:
        case KEY_DOWN:
+               if(auto_scroll_state != AUTO_SCROLL_NONE){
+                       result_state |= DISP_CMD_AUTO_SCROLL;
+                       ctxp->auto_scroll = AUTO_SCROLL_DOWN;
+               }
                ctxp->cur_res_offset++;
                clistp = ctxp->res_disp_list;
                for(i = 0; i < ctxp->res_num; i++){
@@ -544,6 +581,10 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                break;
        case NT_KEY_PAGEUP:
        case KEY_PPAGE:
+               if(auto_scroll_state != AUTO_SCROLL_NONE){
+                       result_state |= DISP_CMD_AUTO_SCROLL;
+                       ctxp->auto_scroll = AUTO_SCROLL_UP;
+               }
                ctxp->cur_res_offset -= wp->lines;
                if(ctxp->cur_res_offset >= 0){
                        break;
@@ -600,6 +641,10 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
                break;
        case NT_KEY_PAGEDOWN:
        case KEY_NPAGE:
+               if(auto_scroll_state != AUTO_SCROLL_NONE){
+                       result_state |= DISP_CMD_AUTO_SCROLL;
+                       ctxp->auto_scroll = AUTO_SCROLL_DOWN;
+               }
                clistp = ctxp->res_disp_list;
                if(0 > ctxp->cur_res)
                        ctxp->cur_res = 0;
@@ -773,7 +818,7 @@ int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_
        }/* end for */
 END_FOR:
        
-       return DISP_STATE_RESLIST
+       return result_state
 }
 
 static int get_id_num(ctx_reslist_tp ctxp, const wchar_t *misc)
@@ -839,7 +884,7 @@ static BOOL set_res_header(ctx_reslist_tp ctxp, res_data_tp res_datap,
        return TRUE;
 }
 
-static int parse_cmd1(const char *param, int *statep, const char **end)
+static int parse_cmd1(const char *param, const char **end)
 {
        int len;
        const char *start;
@@ -855,7 +900,6 @@ static int parse_cmd1(const char *param, int *statep, const char **end)
        
        if(0 == strncmp(NT_COMMAND1_WRITE_MSG_1, start,len) ||
                0 == strncmp(NT_COMMAND1_WRITE_MSG_2, start,len)){
-               *statep = DISP_STATE_EDITOR;
                return NT_CMD_WRITE;
        }else if(0 == strncmp(NT_COMMAND1_JMP_NEW_1,start,len) ||
                0 == strncmp(NT_COMMAND1_JMP_NEW_2, start,len)){
@@ -876,6 +920,11 @@ static int parse_cmd1(const char *param, int *statep, const char **end)
                0 == strncmp(NT_COMMAND1_FAVORITE_2,param,
                        strlen(NT_COMMAND1_FAVORITE_2))){
                return NT_CMD_FAVORITE;
+       }else if(0 == strncmp(NT_COMMAND1_AUTOSCROLL_1,param,
+                       strlen(NT_COMMAND1_AUTOSCROLL_1)) ||
+               0 == strncmp(NT_COMMAND1_AUTOSCROLL_2,param,
+                       strlen(NT_COMMAND1_AUTOSCROLL_2))){
+               return NT_CMD_AUTO_SCROLL;
        }
        return NT_CMD_NONE;
 }
@@ -912,6 +961,7 @@ static ctx_reslist_tp init_context(nt_2ch_selected_item_handle h_select,
        ctxp->sel_res_line = -1;
        ctxp->child_ctx_stackp = NULL;
        ctxp->prev_state = DISP_STATE_THREADTITLE;
+       ctxp->auto_scroll = AUTO_SCROLL_NONE;
 
        b_result = reslist_clone(h_thread, ctxp);
        nt_thread_release_ref(h_thread);