Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 1353 → Rev 1354

/sved/trunk/sved.c
41,6 → 41,9
 
/* preload the mono scheme (to be overloaded at runtime if color adapter present) */
static unsigned char SCHEME_TEXT = 0x07,
SCHEME_MENU = 0x70,
SCHEME_MENU_CUR= 0x0f,
SCHEME_MENU_SEL= 0x00,
SCHEME_STBAR1 = 0x70,
SCHEME_STBAR2 = 0x70,
SCHEME_STBAR3 = 0xf0,
265,24 → 268,6
}
 
 
static void ui_help(void) {
#define MAXLINLEN 39
unsigned short i, offset;
offset = (screenw - MAXLINLEN) >> 1;
 
for (i = 3; i < 25; i++) {
const char *s = svarlang_str(8, i);
if (s[0] == 0) break;
mdr_cout_char_rep(i, offset, ' ', SCHEME_STBAR1, MAXLINLEN);
if (s[0] == '.') continue;
mdr_cout_locate(i, offset + 2 + mdr_cout_str(i, offset + 2, s, SCHEME_STBAR1, MAXLINLEN - 2));
}
 
keyb_getkey();
#undef MAXLINLEN
}
 
 
static void ui_refresh(const struct file *db) {
unsigned char x;
const struct line far *l;
709,10 → 694,73
}
 
 
enum MENU_ACTION {
MENU_NONE = 0,
MENU_NEW = 1,
MENU_OPEN = 2,
MENU_SAVE = 3,
MENU_SAVEAS = 4,
MENU_CHGEOL = 5,
MENU_QUIT = 6
};
 
static enum MENU_ACTION ui_menu(void) {
unsigned short i, curchoice, attr, x, slen;
uidirty.from = 0;
uidirty.to = 0xff;
uidirty.statusbar = 1;
 
/* find out the longest string */
slen = 0;
for (i = MENU_NEW; i <= MENU_QUIT; i++) {
x = strlen(svarlang_str(8, i));
if (x > slen) slen = x;
}
 
curchoice = MENU_NEW;
for (;;) {
/* render menu */
for (i = MENU_NONE; i <= MENU_QUIT + 1; i++) {
mdr_cout_char_rep(i, 0, ' ', SCHEME_MENU, slen+4);
if (i == curchoice) {
attr = SCHEME_MENU_CUR;
mdr_cout_char(i, 1, '>', SCHEME_MENU_SEL);
} else {
attr = SCHEME_MENU;
}
x = mdr_cout_str(i, 2, svarlang_str(8, i), attr, slen);
if (i == curchoice) {
mdr_cout_char_rep(i, x + 2, ' ', SCHEME_MENU_SEL, slen - x + 1);
mdr_cout_locate(i, x + 2);
}
}
/* wait for key */
switch (keyb_getkey()) {
case '\r': return(curchoice); /* ENTER */
case 0x150: /* down */
if (curchoice == MENU_QUIT) {
curchoice = MENU_NEW;
} else {
curchoice++;
}
break;
case 0x148: /* up */
if (curchoice == MENU_NEW) {
curchoice = MENU_QUIT;
} else {
curchoice--;
}
break;
default: return(MENU_NONE);
}
}
}
 
 
/* main returns nothing, ie. sved always exits with a zero exit code
* (this saves 20 bytes of executable footprint) */
void main(void) {
static struct file dbarr[1];
static struct file dbarr[12];
const char *fname;
struct file *db = dbarr;
 
743,6 → 791,9
if (mdr_cout_init(&screenw, &screenh)) {
/* load color scheme if mdr_cout_init returns a color flag */
SCHEME_TEXT = 0x17;
SCHEME_MENU = 0x70;
SCHEME_MENU_CUR = 0x2f;
SCHEME_MENU_SEL = 0x22;
SCHEME_STBAR1 = 0x70;
SCHEME_STBAR2 = 0x78;
SCHEME_STBAR3 = 0xf0;
838,8 → 889,81
cursor_eol(db);
 
} else if (k == 0x1B) { /* ESC */
if (ui_confirm_if_unsaved(db) == 0) break;
int quitnow = 0;
char fname[25];
int saveflag = 0;
 
switch (ui_menu()) {
 
case MENU_NONE:
break;
 
case MENU_NEW:
if (ui_confirm_if_unsaved(db) == 0) {
clear_file(db);
/* add a single empty line */
line_add(db, NULL, 0);
}
uidirty.statusbar = 1;
break;
 
case MENU_OPEN:
/* display a warning if unsaved changes are pending */
if (db->modflag != 0) ui_msg(svarlang_str(0,4), svarlang_str(0,8), SCHEME_MSG);
 
/* ask for filename */
ui_getstring(svarlang_str(0,7), fname, sizeof(fname));
if (fname[0] != 0) {
unsigned char err;
clear_file(db);
err = loadfile(db, fname);
if (err != 0) {
if (err == 1) {
ui_msg(svarlang_str(0,11), NULL, SCHEME_ERR); /* file not found */
} else {
ui_msg(svarlang_str(0,10), NULL, SCHEME_ERR); /* ERROR */
}
mdr_bios_tickswait(44); /* 3s */
clear_file(db);
}
}
break;
 
case MENU_SAVEAS:
saveflag = 1;
/* FALLTHRU */
case MENU_SAVE:
if ((saveflag != 0) || (db->fname[0] == 0)) { /* save as... */
ui_getstring(svarlang_str(0,6), fname, sizeof(fname));
if (*fname == 0) break;
saveflag = savefile(db, fname);
if (saveflag == 0) memcpy(db->fname, fname, sizeof(fname));
} else {
saveflag = savefile(db, NULL);
}
 
if (saveflag == 0) {
db->modflag = 0;
ui_msg(svarlang_str(0, 2), NULL, SCHEME_MSG);
mdr_bios_tickswait(11); /* 11 ticks is about 600 ms */
} else {
ui_msg(svarlang_str(0, 3), NULL, SCHEME_ERR);
mdr_bios_tickswait(36); /* 2s */
}
break;
 
case MENU_CHGEOL:
db->modflag = '*';
db->lfonly ^= 1;
break;
 
case MENU_QUIT:
if (ui_confirm_if_unsaved(db) == 0) quitnow = 1;
break;
}
 
if (quitnow) break;
 
} else if (k == 0x0D) { /* ENTER */
unsigned short off = db->xoffset + db->cursorposx;
/* add a new line */
871,79 → 995,10
} else if (k == 0x009) { /* TAB */
insert_in_line(db, " ", 8);
 
} else if (k == 0x13b) { /* F1 */
ui_help();
} else if ((k >= 0x13b) && (k <= 0x146)) { /* F1..F12 */
uidirty.from = 0;
uidirty.to = 0xff;
 
} else if (k == 0x13c) { /* F2 (new file) */
if (ui_confirm_if_unsaved(db) == 0) {
clear_file(db);
/* add a single empty line */
line_add(db, NULL, 0);
}
uidirty.from = 0;
uidirty.to = 0xff;
uidirty.statusbar = 1;
 
} else if (k == 0x13d) { /* F3 (load file) */
char fname[25];
 
/* display a warning if unsaved changes are pending */
if (db->modflag != 0) ui_msg(svarlang_str(0,4), svarlang_str(0,8), SCHEME_MSG);
 
/* ask for filename */
ui_getstring(svarlang_str(0,7), fname, sizeof(fname));
if (fname[0] != 0) {
unsigned char err;
clear_file(db);
err = loadfile(db, fname);
if (err != 0) {
if (err == 1) {
ui_msg(svarlang_str(0,11), NULL, SCHEME_ERR); /* file not found */
} else {
ui_msg(svarlang_str(0,10), NULL, SCHEME_ERR); /* ERROR */
}
mdr_bios_tickswait(44); /* 3s */
clear_file(db);
}
}
uidirty.from = 0;
uidirty.to = 0xff;
uidirty.statusbar = 1;
 
} else if ((k == 0x13f) || (k == 0x140)) { /* F5 or F6 */
int saveres;
 
if ((k == 0x140) || (db->fname[0] == 0)) { /* save as... */
char fname[25];
ui_getstring(svarlang_str(0,6), fname, sizeof(fname));
if (*fname == 0) continue;
saveres = savefile(db, fname);
if (saveres == 0) memcpy(db->fname, fname, sizeof(fname));
} else {
saveres = savefile(db, NULL);
}
 
if (saveres == 0) {
db->modflag = 0;
ui_msg(svarlang_str(0, 2), NULL, SCHEME_MSG);
mdr_bios_tickswait(11); /* 11 ticks is about 600 ms */
} else {
ui_msg(svarlang_str(0, 3), NULL, SCHEME_ERR);
mdr_bios_tickswait(36); /* 2s */
}
 
ui_refresh(db);
uidirty.statusbar = 1;
 
} else if (k == 0x144) { /* F10 */
db->modflag = '*';
db->lfonly ^= 1;
uidirty.statusbar = 1;
uidirty.from = 0;
uidirty.to = 0;
 
} else if (k == 0x174) { /* CTRL+ArrRight - jump to next word */
/* if currently cursor is on a non-space, then fast-forward to nearest space or EOL */
for (;;) {