コード例 #1
0
ファイル: editerbasic.c プロジェクト: FangKuangKuang/egui
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);
}
コード例 #2
0
ファイル: text_line.c プロジェクト: virajs/egui
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;
}
コード例 #3
0
ファイル: editerbasic.c プロジェクト: FangKuangKuang/egui
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;
}