📄 editor.c
字号:
o->draw_select(o, o->sel_from, s);
o->show_cursor(o, true); /* show cursor */
};
};
if ( oldpos != o->line_pos || oldline != o->line ) {
if ( o->sel_ok ) {
t_rect s = o->sel_from;
o->show_cursor(o, false); /* hide cursor */
if ( o->sel_ok == 3 ) { /* for mouse */
o->sel_from = rect_assign(o->line_pos, o->line, o->line_pos, o->line);
o->sel_old = point_assign(o->sel_from.a.x, o->sel_from.a.y);
o->sel_ok = 1;
} else
if ( o->sel_ok == 2 ) {
o->sel_from = rect_assign(lmin(oldpos, o->line_pos),
lmin(oldline, o->line),
lmax(oldpos, o->line_pos),
lmax(oldline, o->line));
if ( o->sel_from.a.y != o->sel_from.b.y ) { /* not same lines */
o->sel_from.a.x = oldpos;
o->sel_from.b.x = o->line_pos;
o->sel_old.x = o->sel_from.a.x;
} else
o->sel_old.x = (oldpos<o->line_pos) ? o->sel_from.a.x : o->sel_from.b.x;
o->sel_old.y = (oldline<o->line) ? o->sel_from.a.y : o->sel_from.b.y;
o->sel_ok = 1;
} else {
o->sel_from.b.y = lmax(o->sel_old.y, o->line);
o->sel_from.a.y = lmin(o->sel_old.y, o->line);
if ( o->sel_from.b.y > o->sel_old.y )
o->sel_from.b.x = o->line_pos;
else
if ( o->sel_from.b.y == o->sel_old.y )
if ( o->sel_from.a.y == o->sel_from.b.y )
o->sel_from.b.x = lmax(o->line_pos, o->sel_old.x);
else
o->sel_from.b.x = o->sel_old.x;
if ( o->sel_from.a.y < o->sel_old.y )
o->sel_from.a.x = o->line_pos;
else
if ( o->sel_from.a.y == o->sel_old.y )
if ( o->sel_from.a.y == o->sel_from.b.y )
o->sel_from.a.x = lmin(o->line_pos, o->sel_old.x);
else
o->sel_from.a.x = o->sel_old.x;
};
o->draw_select(o, o->sel_from, s);
o->show_cursor(o, true); /* show cursor */
} else o->show_cursor(o, true); /* show cursor */
};
if ( redraw_text ) {
if ( redraw_text & 0x02 ) o->draw_cursor(o, -1, -1);
};
if ( can_draw_cursor ) o->draw_cursor(o, oldline, oldpos);
};
t_point editor_cursor_mouse_pos ( p_editor o, t_point where )
{
p_view v = VIEW(o);
t_rect s = v->size_limits(v);
l_text ptr;
t_point p;
l_long len = 0;
l_long ln = o->line_from;
l_long ps = 0;
where.y -= s.a.y;
where.x -= s.a.x;
where.x += SCROLLER(o)->scrollx;
p.y = o->ysize_of_line(o, ln, 1, (l_long*)(&p.x));
while ( where.y > 0 && (p.y||p.x) ) {
ln++;
p.y = o->ysize_of_line(o, ln, 1, (l_long*)(&p.x));
where.y -= p.y;
};
ln = lmax(0, lmin(o->line_num, ln-1));
p.y = ln;
ptr = o->lntxtlen(o, ln, &len);
if ( ptr )
while ( where.x > 0 && *ptr && ps < len ) {
ps++;
where.x -= FONT_GETWIDTH(v->font, *ptr);
ptr++;
};
p.x = lmax(0, lmin(len, (where.x<=0?ps-1:ps)));
p.y = lmax(0, lmin(o->line_num, p.y));
return p;
};
l_bool editor_is_in_select_rect ( p_editor o, t_point where ) {
t_point pos = o->cursor_mouse_pos(o, where);
if ( ed_is_sel(o) ) {
if ( pos.y < o->sel_from.a.y ) return false;
if ( pos.y > o->sel_from.b.y ) return false;
if ( pos.y == o->sel_from.a.y && pos.x < o->sel_from.a.x ) return false;
if ( pos.y == o->sel_from.b.y && pos.x >= o->sel_from.b.x ) return false;
return true;
};
return false;
};
void editor_translate_event ( p_object o, t_event *event )
{
RETVIEW(o, event);
view_translate_event(o, event); /* old translate_event function */
if ( event->type & EV_MESSAGE ) {
if ( event->message == MSG_SELECT_ALL ) {
l_long len=0;
EDITOR(o)->lntxtlen(EDITOR(o),EDITOR(o)->line_num,&len);
EDITOR(o)->sel_from = rect_assign(0,0,len,EDITOR(o)->line_num);
VIEW(o)->draw_me(VIEW(o));
clear_event(event);
};
};
if ( event->type & EV_MOUSE ) { /* mouse event */
l_bool in_sel = editor_is_in_select_rect(EDITOR(o),VIEW(o)->get_local_point(VIEW(o), mouse->where));
if ( OBJECT(mouse)->state & MO_SF_MOUSERDOWN ) {
show_edit_menu(o,ed_is_sel(EDITOR(o)));
clear_event(event);
return;
};
if ( OBJECT(mouse)->state & MO_SF_MOUSELDOWN ) { /* select */
if ( !o->is_state(o, OB_SF_SELECTED) ) {
clear_event(event);
o->select(o);
return;
};
};
if ( in_sel && OBJECT(mouse)->state & MO_SF_MOUSEDOWN ) {
p_editor ed = EDITOR(o);
t_point oldp = point_assign(ed->line_pos,ed->line);
ed->sel_ok = 0;
ed->cursor_visible = 0;
while ( event->type & EV_MOUSE && OBJECT(mouse)->state & MO_SF_MOUSELPRESS ) {
t_point np = ed->cursor_mouse_pos(ed, VIEW(o)->get_local_point(VIEW(o), mouse->where));
if ( oldp.x != np.x || oldp.y != np.y ) {
ed->draw_cursor_ex ( ed, oldp.y, oldp.x, 0);
ed->draw_cursor_ex ( ed, np.y, np.x, 1);
ed->line = np.y;
ed->line_pos = np.x;
};
oldp = np;
o->get_event(o, event);
};
if ( ed->sel_from.a.y >= ed->line &&
( ed->sel_from.a.y == ed->line ? ed->sel_from.a.x > ed->line_pos : true ) ) {
// before selection
l_text pp = ed->posptr(ed,ed->sel_from.a.y,ed->sel_from.a.x);
l_text t = ed->posptr(ed,ed->sel_from.b.y,ed->sel_from.b.x);
l_text toinsert = stridup(pp, strsize(pp, t));
ed->delstr(ed,(pp-ed->text), strsize(pp, t));
if ( toinsert ) {
l_text ltxt = ed->posptr(ed, ed->line, ed->line_pos);
l_long pos = strsize(ed->text, ltxt);
ed->insstr(ed, pos, toinsert);
_free(toinsert);
};
clear_event(event);
};
if ( ed->sel_from.b.y <= ed->line &&
( ed->sel_from.b.y == ed->line ? ed->sel_from.b.x < ed->line_pos : true ) ) {
// after selection
l_text pp = ed->posptr(ed,ed->sel_from.a.y,ed->sel_from.a.x);
l_text t = ed->posptr(ed,ed->sel_from.b.y,ed->sel_from.b.x);
l_text toinsert = stridup(pp, strsize(pp, t));
ed->delstr(ed,(pp-ed->text), strsize(pp, t));
if ( ed->line == ed->sel_from.b.y ) ed->line_pos -= ed->sel_from.b.x;
ed->line -= ed->sel_from.b.y-ed->sel_from.a.y;
if ( toinsert ) {
l_text ltxt = ed->posptr(ed, ed->line, ed->line_pos);
l_long pos = strsize(ed->text, ltxt);
ed->insstr(ed, pos, toinsert);
_free(toinsert);
};
clear_event(event);
};
EDITOR(o)->cursor_visible = 1;
};
if ( (in_sel && OBJECT(mouse)->state & MO_SF_MOUSEUP) ||
(!in_sel && OBJECT(mouse)->state & MO_SF_MOUSELDOWN) ) {
EDITOR(o)->sel_ok = 0;
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos, 0);
clear_event(event);
};
if ( o->is_state(o, OB_SF_FOCUSED) ) {
if ( OBJECT(mouse)->state & MO_SF_MOUSELAUTO && !EDITOR(o)->sel_ok )
EDITOR(o)->sel_ok = 3;
while ( event->type & EV_MOUSE && OBJECT(mouse)->state & MO_SF_MOUSELAUTO ) {
t_point p = EDITOR(o)->cursor_mouse_pos(EDITOR(o),
VIEW(o)->get_local_point(VIEW(o), mouse->where));
EDITOR(o)->redraw_text(EDITOR(o), p.y, p.x, 0);
EDITOR(o)->sel_ok = 1;
o->get_event(o, event);
};
EDITOR(o)->sel_ok = 0;
clear_event(event);
};
};
if ( o->is_state(o, OB_SF_FOCUSED) )
/* keyboard events */
if ( event->type & EV_KEYBOARD ) {
if ( !(keyb->shifts & KB_SHIFT_FLAG) ) EDITOR(o)->sel_ok = 0;
else if ( !EDITOR(o)->sel_ok ) EDITOR(o)->sel_ok = 2;
if ( OBJECT(keyb)->state & KB_SF_KEYDOWN )
switch ( KEY_TO(keyb->code) ) {
case KB_RIGHT : { /* arrow RIGHT was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos+1, 0);
clear_event(event);
}; break;
case KB_LEFT : { /* arrow LEFT was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos-1, 0);
clear_event(event);
}; break;
case KB_DOWN : { /* arrow DOWN was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line+1, EDITOR(o)->line_pos, 0);
clear_event(event);
}; break;
case KB_UP : { /* arrow UP was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line-1, EDITOR(o)->line_pos, 0);
clear_event(event);
}; break;
case KB_PGDN : { /* PAGE DOWN was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line+EDITOR(o)->linesin(EDITOR(o), EDITOR(o)->line, 1), EDITOR(o)->line_pos, 0);
clear_event(event);
}; break;
case KB_PGUP : { /* PAGE UP was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line-EDITOR(o)->linesin(EDITOR(o), EDITOR(o)->line, -1), EDITOR(o)->line_pos, 0);
clear_event(event);
}; break;
case KB_HOME : { /* key HOME was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, 0, 0);
clear_event(event);
}; break;
case KB_END : { /* key END was pressed */
l_long len;
EDITOR(o)->lntxtlen(EDITOR(o), EDITOR(o)->line, &len);
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, len, 0);
clear_event(event);
}; break;
case KB_DEL : { /* key DEL was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos, TO_KEY(KB_DEL));
clear_event(event);
}; break;
case KB_BACKSPACE : { /* key BACKSPACE was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos-1, TO_KEY(KB_BACKSPACE));
clear_event(event);
}; break;
case KB_ENTER : { /* key ENTER was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line+1, 0, TO_KEY(KB_ENTER));
clear_event(event);
}; break;
case KB_TAB : { /* key TAB was pressed */
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos+EDITOR_TAB_SIZE, TO_KEY(KB_TAB));
clear_event(event);
}; break;
default :
if ( (l_byte)TO_CHAR(keyb->code) >= 32 &&
(l_byte)TO_CHAR(keyb->code) <= 255 ) {
EDITOR(o)->redraw_text(EDITOR(o), EDITOR(o)->line, EDITOR(o)->line_pos+1, keyb->code);
clear_event(event);
}; break;
};
};
};
p_editor _editor_init ( p_editor o, t_rect r, l_int flags )
{
if ( !o ) return NULL;
clear_type(o, sizeof(t_editor));
scroller_init(SCROLLER(o), r, SF_HORSCROLLBAR+SF_VERSCROLLBAR);
/* object's declarations */
OBJECT(o)->done = &editor_done;
OBJECT(o)->translate_event = &editor_translate_event;
OBJECT(o)->set_state = &editor_set_state;
OBJECT(o)->set_options = &editor_set_options;
OBJECT(o)->set_data = &editor_set_data;
OBJECT(o)->get_data = &editor_get_data;
OBJECT(o)->func_callback = &editor_timer;
OBJECT(o)->process_tick = 500;
OBJECT(o)->set_options(OBJECT(o), OB_OF_STILLPROCESS, true);
l_tag_cpy(OBJECT(o)->data_type, DAT_TEXT);
/* view's declarations */
if ( !(flags & EF_REWRITEUNABLE) )
VIEW(o)->cursor = CUR_TEXT;
VIEW(o)->draw = &editor_draw;
VIEW(o)->size_limits = &editor_size_limits;
VIEW(o)->drag_where = &editor_drag_where;
/* scroller's declarations */
SCROLLER(o)->scroll_size = &editor_scroll_size;
SCROLLER(o)->recalc_positions = &editor_recalc_positions;
SCROLLER(o)->scroll_limits = &editor_scroll_limits;
/* editor's declarations */
o->flags = flags|EF_FIXEDFONT;
o->text = strdup("");
ed_sel_clear(o);
o->sel_old = point_assign(o->sel_from.a.x, o->sel_from.a.y);
o->lntxtlen = &editor_lntxtlen;
o->lnmax = &editor_lnmax;
o->lnptr = &editor_lnptr;
o->posptr = &editor_posptr;
o->sizeto = &editor_sizeto;
o->lnlen = &editor_lnlen;
o->lnlenptr = &editor_lnlenptr;
o->xsize_of_line = &editor_xsize_of_line;
o->ysize_of_line = &editor_ysize_of_line;
o->draw_cursor = &editor_draw_cursor;
o->draw_cursor_ex = &editor_draw_cursor_ex;
o->show_cursor = &editor_show_cursor;
o->get_cursor_rect = &editor_get_cursor_rect;
o->charsin_size = &editor_charsin_size;
o->charsin = &editor_charsin;
o->linesin = &editor_linesin;
o->linesin_size = &editor_linesin_size;
o->lines_inpage = &editor_lines_inpage;
o->draw_select = &editor_draw_select;
o->insstr = &editor_insstr;
o->delstr = &editor_delstr;
o->delchr = &editor_delchr;
o->inschr = &editor_inschr;
o->draw_box_ex = &editor_draw_box_ex;
o->draw_box = &editor_draw_box;
o->draw_line = &editor_draw_line;
o->realpos = &editor_realpos;
o->redraw_text = &editor_redraw_text;
o->cursor_mouse_pos = &editor_cursor_mouse_pos;
o->set_text = &editor_set_text;
o->line_rect = &editor_line_rect;
VIEW(o)->brush.color = color_flat_face;
VIEW(o)->font = get_font_in_size ("ARIAL", 10, 10);
return o;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -