Subversion Repositories SvarDOS

Rev

Rev 1392 | Rev 1394 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1392 Rev 1393
Line 226... Line 226...
226
  }
226
  }
227
 
227
 
228
  /* fill rest of status bar with background */
228
  /* fill rest of status bar with background */
229
  mdr_cout_char_rep(screenh - 1, 3, ' ', SCHEME_STBAR1, screenw - 1);
229
  mdr_cout_char_rep(screenh - 1, 3, ' ', SCHEME_STBAR1, screenw - 1);
230
 
230
 
231
  /* filename */
231
  /* filename and modflag */
232
  {
232
  {
233
    const char *fn = db->fname;
233
    const char *fn = db->fname;
234
    unsigned short x;
234
    unsigned short x;
235
    if (*fn == 0) fn = svarlang_str(0, 1);
235
    if (*fn == 0) fn = svarlang_str(0, 1);
236
    x = mdr_cout_str(screenh - 1, 4, fn, SCHEME_STBAR1, screenw);
236
    x = mdr_cout_str(screenh - 1, 4, fn, SCHEME_STBAR1, screenw);
237
    if (db->modflag) mdr_cout_char(screenh - 1, 5 + x, '*', SCHEME_STBAR1);
237
    if (db->modflag) mdr_cout_char(screenh - 1, 5 + x, '!', SCHEME_STBAR2);
238
  }
238
  }
239
 
239
 
240
  /* eol type */
240
  /* eol type */
241
  {
241
  {
242
    const char *eoltype = "CRLF";
242
    const char *eoltype = "CRLF";
Line 467... Line 467...
467
  if (db->cursorposx + db->xoffset < db->cursor->len) {
467
  if (db->cursorposx + db->xoffset < db->cursor->len) {
468
    _fmemmove(db->cursor->payload + db->cursorposx + db->xoffset, db->cursor->payload + db->cursorposx + db->xoffset + 1, db->cursor->len - db->cursorposx - db->xoffset);
468
    _fmemmove(db->cursor->payload + db->cursorposx + db->xoffset, db->cursor->payload + db->cursorposx + db->xoffset + 1, db->cursor->len - db->cursorposx - db->xoffset);
469
    db->cursor->len -= 1; /* do this AFTER memmove so the copy includes the nul terminator */
469
    db->cursor->len -= 1; /* do this AFTER memmove so the copy includes the nul terminator */
470
    uidirty.from = db->cursorposy;
470
    uidirty.from = db->cursorposy;
471
    uidirty.to = db->cursorposy;
471
    uidirty.to = db->cursorposy;
472
    db->modflag = '*';
472
    db->modflag = 1;
473
  } else if (db->cursor->next != NULL) { /* cursor is at end of line: merge current line with next one (if there is a next one) */
473
  } else if (db->cursor->next != NULL) { /* cursor is at end of line: merge current line with next one (if there is a next one) */
474
    struct line far *nextline = db->cursor->next;
474
    struct line far *nextline = db->cursor->next;
475
    if (db->cursor->next->len > 0) {
475
    if (db->cursor->next->len > 0) {
476
      if (curline_resize(db, db->cursor->len + db->cursor->next->len + 1) == 0) {
476
      if (curline_resize(db, db->cursor->len + db->cursor->next->len + 1) == 0) {
477
        _fmemmove(db->cursor->payload + db->cursor->len, db->cursor->next->payload, db->cursor->next->len + 1);
477
        _fmemmove(db->cursor->payload + db->cursor->len, db->cursor->next->payload, db->cursor->next->len + 1);
Line 484... Line 484...
484
 
484
 
485
    line_free(nextline);
485
    line_free(nextline);
486
    uidirty.from = db->cursorposy;
486
    uidirty.from = db->cursorposy;
487
    uidirty.to = 0xff;
487
    uidirty.to = 0xff;
488
    db->totlines -= 1;
488
    db->totlines -= 1;
489
    db->modflag = '*';
489
    db->modflag = 1;
490
  }
490
  }
491
}
491
}
492
 
492
 
493
 
493
 
494
static void bkspc(struct file *db) {
494
static void bkspc(struct file *db) {
Line 753... Line 753...
753
 
753
 
754
 
754
 
755
static void insert_in_line(struct file *db, const char *databuf, unsigned short len) {
755
static void insert_in_line(struct file *db, const char *databuf, unsigned short len) {
756
  if (curline_resize(db, db->cursor->len + len) == 0) {
756
  if (curline_resize(db, db->cursor->len + len) == 0) {
757
    unsigned short off = db->xoffset + db->cursorposx;
757
    unsigned short off = db->xoffset + db->cursorposx;
758
    db->modflag = '*';
758
    db->modflag = 1;
759
    _fmemmove(db->cursor->payload + off + len, db->cursor->payload + off, db->cursor->len - off + 1);
759
    _fmemmove(db->cursor->payload + off + len, db->cursor->payload + off, db->cursor->len - off + 1);
760
    db->cursor->len += len;
760
    db->cursor->len += len;
761
    uidirty.from = db->cursorposy;
761
    uidirty.from = db->cursorposy;
762
    uidirty.to = db->cursorposy;
762
    uidirty.to = db->cursorposy;
763
    while (len--) {
763
    while (len--) {
Line 780... Line 780...
780
  }
780
  }
781
}
781
}
782
 
782
 
783
 
783
 
784
enum MENU_ACTION {
784
enum MENU_ACTION {
785
  MENU_OPEN   = 0,
785
  MENU_NONE   = 0,
786
  MENU_SAVE   = 1,
786
  MENU_OPEN   = 1,
787
  MENU_SAVEAS = 2,
787
  MENU_SAVE   = 2,
788
  MENU_CLOSE  = 3,
788
  MENU_SAVEAS = 3,
789
  MENU_CHGEOL = 4,
789
  MENU_CLOSE  = 4,
790
  MENU_QUIT   = 5,
790
  MENU_CHGEOL = 5,
791
  MENU_NONE   = 0xff
791
  MENU_QUIT   = 6,
792
};
792
};
793
 
793
 
794
static enum MENU_ACTION ui_menu(void) {
794
static enum MENU_ACTION ui_menu(void) {
795
  unsigned short i, curchoice, attr, x, slen;
795
  unsigned short i, curchoice, attr, x, slen;
-
 
796
  unsigned short xorigin, yorigin;
796
  uidirty.from = 0;
797
  uidirty.from = 0;
797
  uidirty.to = 0xff;
798
  uidirty.to = 0xff;
798
  uidirty.statusbar = 1;
799
  uidirty.statusbar = 1;
799
 
800
 
800
  /* find out the longest string */
801
  /* find out the longest string */
Line 802... Line 803...
802
  for (i = MENU_OPEN; i <= MENU_QUIT; i++) {
803
  for (i = MENU_OPEN; i <= MENU_QUIT; i++) {
803
    x = strlen(svarlang_str(8, i));
804
    x = strlen(svarlang_str(8, i));
804
    if (x > slen) slen = x;
805
    if (x > slen) slen = x;
805
  }
806
  }
806
 
807
 
-
 
808
  /* calculate where to draw the menu on screen */
-
 
809
  xorigin = (screenw - (slen + 5)) / 2;
-
 
810
  yorigin = (screenh - (MENU_QUIT - MENU_OPEN + 5)) / 2;
-
 
811
 
807
  curchoice = MENU_OPEN;
812
  curchoice = MENU_OPEN;
808
  for (;;) {
813
  for (;;) {
809
    /* render menu */
814
    /* render menu */
810
    for (i = MENU_OPEN; i <= MENU_QUIT + 1; i++) {
815
    for (i = MENU_NONE; i <= MENU_QUIT + 1; i++) {
811
      mdr_cout_char_rep(i, 0, ' ', SCHEME_MENU, slen+3);
816
      mdr_cout_char_rep(yorigin + i, xorigin, ' ', SCHEME_MENU, slen+4);
812
      if (i == curchoice) {
817
      if (i == curchoice) {
813
        attr = SCHEME_MENU_CUR;
818
        attr = SCHEME_MENU_CUR;
814
        mdr_cout_char(i, 0, '>', SCHEME_MENU_SEL);
819
        mdr_cout_char(yorigin + i, xorigin + 1, '>', SCHEME_MENU_SEL);
815
      } else {
820
      } else {
816
        attr = SCHEME_MENU;
821
        attr = SCHEME_MENU;
817
      }
822
      }
818
      x = mdr_cout_str(i, 1, svarlang_str(8, i), attr, slen);
823
      x = mdr_cout_str(yorigin + i, xorigin + 2, svarlang_str(8, i), attr, slen);
819
      if (i == curchoice) {
824
      if (i == curchoice) {
820
        mdr_cout_char_rep(i, x + 1, ' ', SCHEME_MENU_SEL, slen - x + 1);
825
        mdr_cout_char_rep(yorigin + i, xorigin + x + 2, ' ', SCHEME_MENU_SEL, slen - x + 1);
821
        mdr_cout_locate(i, x + 1);
826
        mdr_cout_locate(yorigin + i, xorigin + x + 2);
822
      }
827
      }
823
    }
828
    }
824
    /* wait for key */
829
    /* wait for key */
825
    switch (keyb_getkey()) {
830
    switch (keyb_getkey()) {
826
      case '\r': return(curchoice); /* ENTER */
831
      case '\r': return(curchoice); /* ENTER */
Line 993... Line 998...
993
 
998
 
994
    } else if (k == 0x1B) { /* ESC */
999
    } else if (k == 0x1B) { /* ESC */
995
      int quitnow = 0;
1000
      int quitnow = 0;
996
      char fname[25];
1001
      char fname[25];
997
      int saveflag = 0;
1002
      int saveflag = 0;
998
      unsigned short ui_action;
1003
      enum MENU_ACTION ui_action;
999
 
1004
 
1000
      /* collect the exact menu action and clear the screen */
1005
      /* collect the exact menu action and clear the screen */
1001
      ui_action = ui_menu();
1006
      ui_action = ui_menu();
1002
      ui_refresh(db);
1007
      ui_refresh(db);
1003
 
1008
 
Line 1023... Line 1028...
1023
              }
1028
              }
1024
              mdr_bios_tickswait(44); /* 3s */
1029
              mdr_bios_tickswait(44); /* 3s */
1025
              loadfile(db, "");
1030
              loadfile(db, "");
1026
            }
1031
            }
1027
          }
1032
          }
-
 
1033
          uidirty.from = 0;
-
 
1034
          uidirty.to = 0xff;
-
 
1035
          uidirty.statusbar = 1;
1028
          break;
1036
          break;
1029
 
1037
 
1030
        case MENU_SAVEAS:
1038
        case MENU_SAVEAS:
1031
          saveflag = 1;
1039
          saveflag = 1;
1032
          /* FALLTHRU */
1040
          /* FALLTHRU */
Line 1058... Line 1066...
1058
          uidirty.to = 0xff;
1066
          uidirty.to = 0xff;
1059
          uidirty.statusbar = 1;
1067
          uidirty.statusbar = 1;
1060
          break;
1068
          break;
1061
 
1069
 
1062
        case MENU_CHGEOL:
1070
        case MENU_CHGEOL:
1063
          db->modflag = '*';
1071
          db->modflag = 1;
1064
          db->lfonly ^= 1;
1072
          db->lfonly ^= 1;
1065
          break;
1073
          break;
1066
 
1074
 
1067
        case MENU_QUIT:
1075
        case MENU_QUIT:
1068
          quitnow = 1;
1076
          quitnow = 1;
Line 1079... Line 1087...
1079
 
1087
 
1080
    } else if (k == 0x0D) { /* ENTER */
1088
    } else if (k == 0x0D) { /* ENTER */
1081
      unsigned short off = db->xoffset + db->cursorposx;
1089
      unsigned short off = db->xoffset + db->cursorposx;
1082
      /* add a new line */
1090
      /* add a new line */
1083
      if (line_add(db, db->cursor->payload + off, db->cursor->len - off) == 0) {
1091
      if (line_add(db, db->cursor->payload + off, db->cursor->len - off) == 0) {
1084
        db->modflag = '*';
1092
        db->modflag = 1;
1085
        db->cursor = db->cursor->prev; /* back to original line */
1093
        db->cursor = db->cursor->prev; /* back to original line */
1086
        /* trim the line above */
1094
        /* trim the line above */
1087
        db->cursor->len = off;
1095
        db->cursor->len = off;
1088
        /* move cursor to the (new) line below */
1096
        /* move cursor to the (new) line below */
1089
        db->curline -= 1;
1097
        db->curline -= 1;