⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editor.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
📖 第 1 页 / 共 4 页
字号:

           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 + -