void text_line_subscribe_scrollbar(struct widget* subscriber, struct widget* pulisher, si_t event) { struct text_line* t = TEXT_LINE_POINTER(subscriber); struct scroll_bar* s = SCROLL_BAR_POINTER(pulisher); si_t lineno_cur = text_line_get_line_cur(t); si_t lines_per_page = text_line_get_max_line_shown(t); switch(event) { /** * press up arrow **/ case SCROLL_BAR_EVENT_LINE_UP: text_line_update_ruler_line(t, lineno_cur - 1); break; /** * press down arow **/ case SCROLL_BAR_EVENT_LINE_DOWN: text_line_update_ruler_line(t, lineno_cur + 1); break; /** * press spaces above elevator **/ case SCROLL_BAR_EVENT_PAGE_UP: text_line_update_ruler_line(t, lineno_cur - lines_per_page); break; /** * press spaces below elevator **/ case SCROLL_BAR_EVENT_PAGE_DOWN: text_line_update_ruler_line(t, lineno_cur + lines_per_page); break; /** * move elevator **/ case SCROLL_BAR_EVENT_CHANGE: text_line_update_ruler_line(t, s->cur_offset / s->line_height); break; default: return; break; } text_line_repaint(t); text_line_show(t); }
static si_t text_line_default_show_text(struct text_line* t, si_t x, si_t y) { si_t fontx, fonty, startx, starty, rulerx, rulery1, rulery2, max_line; /** * start axis; * the magic number 6 is: * 2 for outter frame * + 3 for inner frame * + 1 for margin between text and the inner frame **/ max_line = text_line_get_max_line_shown(t); fonty = get_font_height(t->gd); fontx = get_font_width(t->gd); startx = x + 6; starty = y + 6 + (t->area.height - 12 - fonty * max_line) / 2; /** * if there are text in buffer **/ if(strlen(t->buf) != 0) { char* strshow; char* start; si_t i = 0; si_t lines; /** * adjust start index * also, lines refers to the line that current ruler is in **/ lines = lines_between(t->show_start, t->ruler_cur, t->chars_per_line, t->is_enter_enable, t->is_linewrap); if(lines == -1) { start = get_prev_line_start(t->show_start, t->chars_per_line, t->is_enter_enable, t->is_linewrap); if(!start) return -1; t->show_start = start; lines = 0; /** * dispatch page up event to subscriber **/ event_to_be_dispatched = TEXT_LINE_EVENT_PAGE_UP; list_for_each(&t->subscribe_info_list, do_handle_event); } else if(lines == max_line) { start = get_next_line_start(t->show_start, t->chars_per_line, t->is_enter_enable, t->is_linewrap); if(!start) return -1; t->show_start = start; lines = max_line - 1; /** * dispatch page down event to subscriber **/ event_to_be_dispatched = TEXT_LINE_EVENT_PAGE_DOWN; list_for_each(&t->subscribe_info_list, do_handle_event); } /** * show line by line **/ strshow = t->show_start; while(i != max_line && strshow != NULL) { char* next = get_next_line_start(strshow, t->chars_per_line, t->is_enter_enable, t->is_linewrap); si_t showlen; if(next == NULL) { showlen = strlen(strshow); } else { showlen = next - strshow; } /** * locate ruler **/ if(i == lines) { t->ruler_line_start = strshow; rulerx = startx + (t->ruler_cur - strshow) * fontx; rulery1 = starty; rulery2 = starty + fonty; } /** * show text **/ set_color(t->gd, t->fore_color.r, t->fore_color.g, t->fore_color.b, t->fore_color.a); if(text_line_is_keybd_type_password(t)) { char tmpstr[MAXBUF]; si_t left = showlen; while(left > MAXBUF) { memset(tmpstr, '*', MAXBUF); show_text(t->gd, startx, starty, tmpstr, MAXBUF); left -= MAXBUF; startx += MAXBUF * fontx; } memset(tmpstr, '*', left - 1); if(t->keybd_focus) tmpstr[left - 1] = strshow[showlen - 1]; else tmpstr[left - 1] = '*'; show_text(t->gd, startx, starty, tmpstr, left); } else { /** * enter cannot be shown! **/ if(showlen > 0 && strshow[showlen - 1] == '\n') show_text(t->gd, startx, starty, strshow, showlen - 1); else show_text(t->gd, startx, starty, strshow, showlen); } ++ i; strshow = next; starty += fonty; } } /** * else if placeholder need to be displayed **/ else if(t->placeholder != NULL && !t->keybd_focus) { /* FIXME */ set_color(t->gd, t->frame_color.r, t->frame_color.g, t->frame_color.b, t->frame_color.a); show_text(t->gd, startx, starty, t->placeholder, strlen(t->placeholder) + 1); return 0; } /** * no input; just a ruler **/ else { rulerx = startx; rulery1 = starty; rulery2 = starty + fonty; } /** * show ruler **/ if(t->keybd_focus) { set_color(t->gd, t->fore_color.r, t->fore_color.g, t->fore_color.b, t->fore_color.a); draw_line(t->gd, rulerx, rulery1, rulerx, rulery2); } return 0; }
int main(int argc, char* argv[]) { struct scroll_bar* s; struct button* b1 = NULL, *b2 = NULL; char msg[LABEL_MAX]; char file_msg[LABEL_MAX]; si_t video_access_mode = VIDEO_ACCESS_MODE_BUFFER; si_t app_type = APPLICATION_TYPE_NORMAL; char* file_name = NULL; si_t fonty = 0; /** * open with file **/ if(argc == 2) { struct stat st; if(stat(argv[1], &st) == -1) { EGUI_PRINT_ERROR("file %s does not exists", argv[1]); return -1; } if(!S_ISREG(st.st_mode) || access(argv[1], R_OK | W_OK) != 0) { EGUI_PRINT_ERROR("file %s cannot access!", argv[1]); return -1; } /** * file too large **/ if(st.st_size > FILE_MAX) { EGUI_PRINT_ERROR("file %s does not exists\n", argv[1]); return -1; } file_name = argv[1]; } else if(argc != 1) { EGUI_PRINT_ERROR("wrong parameter!\nusage: \nediterbasic\nor:\nediterbasic [filename]"); return -1; } /* 初始化用户应用程序 */ application_init(video_access_mode, app_type, "editerbasic"); /** * window **/ main_window = window_init("editer_basic"); /* 申请失败 */ if(main_window == NULL) { application_exit(); return -1; } window_set_bounds(main_window, 300, 100, 550, 300); window_set_color(main_window, NULL, &light_green); /** * label that show process **/ if(file_name) { sprintf(file_msg, "%s", file_name); } else { sprintf(file_msg, "new file"); } file_label = label_init(file_msg); if(file_label == NULL) { application_exit(); return -1; } label_set_bounds(file_label, 10, 10, 365, 20); label_set_color(file_label, &barely_blue, &light_blue); label_set_font(file_label, FONT_MATRIX_12); /** * save button **/ b1 = button_init("save"); if(b1 == NULL) { application_exit(); return -1; } button_set_bounds(b1, 380, 5, 60, 30); button_set_color(b1, &dark_blue, &barely_blue); button_set_font(b1, FONT_MATRIX_12); b1->callback = save_button_callback; b2 = button_init("save as"); if(b2 == NULL) { application_exit(); return -1; } button_set_bounds(b2, 445, 5, 100, 30); button_set_color(b2, &dark_blue, &barely_blue); button_set_font(b2, FONT_MATRIX_12); b2->callback = save_as_button_callback; /** * text_line that shows file context **/ file_context_text_line = text_line_init(FILE_MAX, 0); if(file_context_text_line == NULL) { application_exit(); return -1; } text_line_set_bounds(file_context_text_line, 5, 40, 520, 230); text_line_set_color(file_context_text_line, &dark_blue, NULL, NULL); text_line_set_multilines(file_context_text_line); fonty = get_font_height(file_context_text_line->gd); if(file_name) { if(load_file(file_name, text_line_get_buf(file_context_text_line)) < 0) { EGUI_PRINT_ERROR("failed to load file %s", file_name); application_exit(); return -1; } s = scroll_bar_init(1, fonty * text_line_get_max_line_shown(file_context_text_line), fonty); } else { s = scroll_bar_init(1, file_context_text_line->area.height, fonty); } if(s == NULL) { application_exit(); return -1; } scroll_bar_set_bounds(s, 525, 40, 20, 230); text_line_register_move_handler(file_context_text_line, WIDGET_POINTER(s), TEXT_LINE_EVENT_ALL, scrollbar_subscribe_text_line); scroll_bar_register_move_handler(s, WIDGET_POINTER(file_context_text_line), SCROLL_BAR_EVENT_ALL, text_line_subscribe_scrollbar); log_label = label_init(msg); if(log_label == NULL) { application_exit(); return -1; } label_set_bounds(log_label, 5, 275, 450, 20); label_set_color(log_label, NULL, &light_green); sprintf(msg, "open file successfully!"); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(file_label)); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(file_context_text_line)); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(log_label)); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(b1)); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(b2)); object_attach_child(OBJECT_POINTER(main_window), OBJECT_POINTER(s)); /* 添加顶层窗口 */ application_add_window(NULL, main_window); /* 设置主窗口 */ application_set_main_window(main_window); /* 运行 */ application_exec(); return 0; }