/* we_wind.c */
/* Copyright (C) 1993 Fred Kruse */
/* This is free software; you can redistribute it and/or */
/* modify it under the terms of the */
/* GNU General Public License, see the file COPYING. */
#include "messages.h"
#include "edit.h"
#define MAXSVSTR 20
int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw);
/* break string into multiple line to fit into windows
REM: Caller has to free returned vector!!!
*/
char **StringToStringArray(char *str, int *maxLen, int minWidth, int *anzahl)
{
int i, j, k, anz = 0, mxlen = 0, max = 0.8 * MAXSCOL;
char **s = MALLOC(sizeof(char*));
for (k = 0, i = 0; str[i]; i++)
{
if((i-k) == max || str[i] == '\n')
{
j = i-1;
if (str[i] != '\n')
for (; j > 0 && !isspace(str[j]); j--)
;
if(j > k)
i = j;
anz++;
s = REALLOC(s, anz * sizeof(char *));
s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
for (j = k; j <= i; j++)
s[anz-1][j-k] = str[j];
if (isspace(str[j-1]))
j--;
if (mxlen < (j-k))
mxlen = j - k;
s[anz-1][j-k] = '\0';
k = i+1;
}
}
anz++;
s = REALLOC(s, anz * sizeof(char *));
s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
for (j = k; j <= i; j++)
s[anz-1][j-k] = str[j];
if (mxlen < (j-k))
mxlen = j - k;
if (mxlen < minWidth)
mxlen = minWidth;
*maxLen = mxlen;
*anzahl = anz;
return (s);
}
/*
Print error message */
int e_error(char *text, int sw, FARBE *f)
{
PIC *pic = NULL;
int len, i, xa, xe, ya = 8, ye = 14;
char *header = NULL;
fk_cursor(0);
WpeMouseChangeShape(WpeErrorShape);
if ((len = strlen((char *)text)) < 20 ) len = 20;
xa = (80-len)/2 - 2;
xe = 82 - (80-len)/2;
if (sw == -1) header = "Message";
else if (sw == 0) header = "Error";
else if (sw == 1) header = "Serious Error";
else if (sw == 2) header = "Fatal Error";
if (sw < 2) pic = e_std_kst(xa, ya, xe, ye, header, 1, f->nr.fb, f->nt.fb, f->ne.fb);
if (sw == 2 || pic == NULL)
{
pic = e_open_view(xa, ya, xe, ye, 0, 0);
e_std_rahmen(xa, ya, xe, ye, header, 1, 0, 0);
}
if (sw < 2)
{
e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
ya + 2, text, f->nt.fb, 0, 0, 0, 0);
e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", f->nz.fb, 1, -1,
f->ns.fb, f->nt.fb);
}
else
{
e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
ya + 2, text, 112, 0, 0, 0, 0);
e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", 32, 1, -1, 46, 112);
}
do
{
#if MOUSE
if ((i = e_toupper(e_getch())) == -1)
i = e_er_mouse(xa+3, ya,(xe+xa-4)/2, ya+4);
#else
i = e_toupper(e_getch());
#endif
} while (i != WPE_ESC && i != WPE_CR && i != 'O');
WpeMouseRestoreShape();
if (pic != NULL) e_close_view(pic, 1);
else e_cls(0, ' ');
fk_cursor(1);
if (sw == 1) e_quit(WpeEditor->f[WpeEditor->mxedt]);
if (sw > 0) WpeExit(sw);
return(sw);
}
/* message with selection */
int e_message(int sw, char *str, FENSTER *f)
{
int i, ret, mxlen = 0, anz = 0;
char **s;
W_OPTSTR *o = e_init_opt_kst(f);
if (!o)
return(-1);
s = StringToStringArray(str, &mxlen, 22, &anz);
o->ye = MAXSLNS - 6;
o->ya = o->ye - anz - 5;
o->xa = (MAXSCOL - mxlen - 6)/2;
o->xe = o->xa + mxlen + 6;
o->bgsw = 0;
o->name = "Message";
for (i = 0; i < anz; i++)
{
e_add_txtstr((o->xe-o->xa-strlen(s[i]))/2, 2+i, s[i], o);
FREE(s[i]);
}
FREE(s);
if (!sw)
{
o->crsw = AltO;
e_add_bttstr((o->xe-o->xa-4)/2, o->ye-o->ya-2, 0, AltO, "Ok", NULL, o);
}
else
{
o->crsw = AltY;
e_add_bttstr(4, o->ye-o->ya-2, 0, AltY, "Yes", NULL, o);
e_add_bttstr((o->xe-o->xa-2)/2, o->ye-o->ya-2, 0, AltN, "No", NULL, o);
e_add_bttstr(o->xe-o->xa-9, o->ye-o->ya-2, -1, WPE_ESC, "Cancel", NULL, o);
}
ret = e_opt_kst(o);
freeostr(o);
return(ret == WPE_ESC ? WPE_ESC : (ret == AltN ? 'N' : 'Y'));
}
/* First opening of a window */
void e_firstl(FENSTER *f, int sw)
{
f->pic = NULL;
f->pic = e_ed_kst(f, f->pic, sw);
if (f->pic == NULL)
e_error(e_msg[ERR_LOWMEM], 1, f->fb);
}
/* Writing of the file type */
int e_pr_filetype(FENSTER *f)
{
int frb = f->fb->es.fb;
e_pr_char(f->a.x+2, f->e.y, 'A', frb);
if (f->ins == 0 || f->ins == 2)
e_pr_char(f->a.x+16, f->e.y, 'O', frb);
else if (f->ins == 8)
e_pr_char(f->a.x+16, f->e.y, 'R', frb);
else
e_pr_char(f->a.x+16, f->e.y, 'I', frb);
if (f->ins > 1)
e_pr_char(f->a.x+17, f->e.y, 'S', frb);
else
e_pr_char(f->a.x+17, f->e.y, 'L', frb);
return(0);
}
/* open section of screen and save background */
PIC *e_open_view(int xa, int ya, int xe, int ye, int col, int sw)
{
PIC *pic = MALLOC(sizeof(PIC));
int i, j;
if (pic == NULL) return(NULL);
pic->a.x = xa;
pic->a.y = ya;
#ifndef NEWSTYLE
if(!WpeIsXwin())
{
pic->e.x = xe;
pic->e.y = ye;
}
else
{
pic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
pic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
}
#else
pic->e.x = xe;
pic->e.y = ye;
#endif
if (sw!=0)
{
#if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 3 * (pic->e.y - pic->a.y + 1));
#else
pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1));
#endif
if (pic->p == NULL) { FREE(pic); return(NULL); }
for (j = pic->a.y; j <= pic->e.y; ++j)
for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
*( pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) = e_gt_byte(i, j);
#if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
e_get_pic_xrect(xa, ya, xe, ye, pic);
#endif
}
else pic->p = (char *)0;
if (sw < 2)
{
for (j = ya; j <= ye; ++j)
for (i = xa; i <= xe; ++i)
e_pr_char(i, j, ' ', col);
}
#ifndef NO_XWINDOWS
if (WpeIsXwin()) (*e_u_setlastpic)(pic);
#endif
#ifndef NEWSTYLE
if (WpeIsXwin())
{
if (sw != 0)
{
if (xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
e_pt_col(xe+1, i, SHDCOL);
if (xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
e_pt_col(xe+2, i, SHDCOL);
if (ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++) e_pt_col(i, ye+1, SHDCOL);
}
}
#endif
return(pic);
}
/* close screen section - refresh background */
int e_close_view(PIC *pic, int sw)
{
int i, j;
#ifndef NO_XWINDOWS
if (WpeIsXwin()) (*e_u_setlastpic)(NULL);
#endif
if (pic == NULL) return(-1);
if (sw != 0 && pic->p != NULL)
{
for (j = pic->a.y; j <= pic->e.y; ++j)
for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
e_pt_byte(i, j, *(pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x)));
#if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
e_put_pic_xrect(pic);
#endif
}
else if (sw != 0)
{
for (j = pic->a.y; j <= pic->e.y; ++j)
for (i = pic->a.x; i <= pic->e.x; ++i)
e_pr_char(i, j, ' ', 0);
}
if (sw < 2)
{
if (pic->p != NULL) FREE(pic->p);
FREE(pic);
}
e_refresh();
return(sw);
}
/* Frame for edit window */
void e_ed_rahmen(FENSTER *f, int sw)
{
extern char *e_hlp;
extern int nblst;
extern WOPT *blst;
char *header = NULL;
if (!DTMD_ISTEXT(f->dtmd))
{
if (f->datnam[0]) header = f->datnam;
if (f->dtmd == DTMD_FILEDROPDOWN)
e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
f->fb->es.fb);
else
e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->nr.fb,
f->fb->ne.fb);
if (f->winnum < 10 && f->winnum >= 0)
e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->nr.fb);
else if (f->winnum >= 0)
e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->nr.fb);
if (sw > 0 && (f->dtmd == DTMD_FILEMANAGER || f->dtmd == DTMD_DATA))
{
if (f->zoom == 0)
e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->ne.fb);
else
e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->ne.fb);
#ifdef NEWSTYLE
if (!WpeIsXwin())
{
#endif
e_pr_char(f->e.x-4, f->a.y, '[', f->fb->nr.fb);
e_pr_char(f->e.x-2, f->a.y, ']', f->fb->nr.fb);
#ifdef NEWSTYLE
}
else
e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
#endif
blst = f->blst;
nblst = f->nblst;
e_hlp = f->hlp_str;
e_pr_uul(f->fb);
}
#ifdef NEWSTYLE
if (WpeIsXwin())
e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
#endif
return;
}
if (f->datnam[0])
{
if (strcmp(f->dirct, f->ed->dirct) == 0 ||
f->dtmd == DTMD_HELP || strcmp(f->datnam, BUFFER_NAME) == 0 ||
NUM_COLS_ON_SCREEN < 40)
{
header = (char *)WpeMalloc(strlen(f->datnam) + 1);
strcpy(header, f->datnam);
}
else
{
header = (char *)WpeMalloc(strlen(f->dirct) + strlen(f->datnam) + 1);
strcpy(header, f->dirct);
strcat(header, f->datnam);
}
}
e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
f->fb->es.fb);
if (header)
WpeFree(header);
if (sw > 0)
{
e_mouse_bar(f->e.x, f->a.y+1, NUM_LINES_ON_SCREEN - 1, 0, f->fb->em.fb);
e_mouse_bar(f->a.x+19, f->e.y, NUM_COLS_ON_SCREEN - 20, 1, f->fb->em.fb);
if (f->zoom == 0)
e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->es.fb);
else
e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->es.fb);
#ifdef NEWSTYLE
if (!WpeIsXwin())
{
#endif
e_pr_char(f->e.x-4, f->a.y, '[', f->fb->er.fb);
e_pr_char(f->e.x-2, f->a.y, ']', f->fb->er.fb);
#ifdef NEWSTYLE
}
else
e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
#endif
e_pr_filetype(f);
if (WpeIsXwin() && NUM_LINES_ON_SCREEN > 8)
{
#if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
e_make_xrect(f->a.x, f->a.y+2, f->a.x, f->a.y+2, 0);
e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
e_make_xrect(f->a.x, f->a.y+4, f->a.x, f->a.y+4, 0);
e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
e_make_xrect(f->a.x, f->a.y+6, f->a.x, f->a.y+6, 0);
if (f->ins != 8)
{
e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
e_make_xrect(f->a.x, f->a.y+8, f->a.x, f->a.y+8, 0);
}
#else
e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
e_pr_char(f->a.x, f->a.y + 3, MCI, f->fb->em.fb);
e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
e_pr_char(f->a.x, f->a.y + 5, MCI, f->fb->em.fb);
e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
if (f->ins != 8)
{
e_pr_char(f->a.x, f->a.y + 7, MCI, f->fb->em.fb);
e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
}
#endif
}
e_zlsplt(f);
blst = f->blst;
nblst = f->nblst;
e_hlp = f->hlp_str;
e_pr_uul(f->fb);
}
if (f->winnum < 10 && f->winnum >= 0)
e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->er.fb);
else if (f->winnum >= 0)
e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->er.fb);
#ifdef NEWSTYLE
if (WpeIsXwin())
e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
#endif
}
/* Output - screen content */
int e_schirm(FENSTER *f, int sw)
{
int j;
if (f->dtmd == DTMD_FILEMANAGER)
return(WpeDrawFileManager(f));
else if (f->dtmd == DTMD_DATA)
return(e_data_schirm(f));
else if (f->dtmd == DTMD_FILEDROPDOWN)
return(e_pr_file_window((FLWND*)f->b, 1, sw, f->fb->er.fb, f->fb->ez.fb,
f->fb->frft.fb));
if (NUM_LINES_OFF_SCREEN_TOP < 0)
NUM_LINES_OFF_SCREEN_TOP = 0;
#ifdef PROG
if (f->c_sw)
for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
e_pr_c_line(j, f);
else
#endif
for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
e_pr_line(j, f);
for (; j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
e_blk((NUM_COLS_ON_SCREEN - 1), f->a.x + 1, j - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, f->fb->et.fb);
return(j);
}
/* Move and modify window */
int e_size_move(FENSTER *f)
{
int xa = f->a.x, ya = f->a.y, xe = f->e.x, ye = f->e.y;
int c = 0, xmin = 26, ymin = 3;
e_ed_rahmen(f, 0);
if (f->dtmd == DTMD_FILEDROPDOWN)
xmin = 15;
else if (!DTMD_ISTEXT(f->dtmd))
ymin = 9;
while ((c = e_getch()) != WPE_ESC && c != WPE_CR)
{
switch (c)
{
case CLE:
if (xa > 0) { xa--; xe--; }
break;
case CRI:
if (xe < MAXSCOL-1) { xa++; xe++; }
break;
case CUP:
if (ya > 1) { ya--; ye--; }
break;
case CDO:
if (ye < MAXSLNS-2) { ya++; ye++; }
break;
case SCLE:
case CCLE:
if ((xe - xa) > xmin) xe--;
break;
case SCRI:
case CCRI:
if (xe < MAXSCOL-1) xe++;
break;
case SCUP:
case BUP:
if ((ye - ya) > ymin) ye--;
break;
case SCDO:
case BDO:
if (ye < MAXSLNS-2) ye++;
break;
}
if (xa != f->a.x || ya != f->a.y || xe != f->e.x || ye != f->e.y)
{
f->a.x = xa;
f->a.y = ya;
f->e.x = xe;
f->e.y = ye;
f->pic = e_ed_kst(f, f->pic, 0);
if (f->pic == NULL) e_error(e_msg[ERR_LOWMEM], 1, f->fb);
if (f->dtmd == DTMD_FILEDROPDOWN)
{
FLWND *fw = (FLWND*) f->b;
fw->xa = f->a.x+1; fw->xe = f->e.x;
fw->ya = f->a.y+1; fw->ye = f->e.y;
}
e_cursor(f, 0);
e_schirm(f, 0);
}
}
e_ed_rahmen(f, 1);
return(c);
}
/* Standard Box */
PIC *e_std_kst(int xa, int ya, int xe, int ye, char *name, int sw, int fr,
int ft, int fes)
{
PIC *pic = e_open_view(xa, ya, xe, ye, ft, 1);
if (pic == NULL) return (NULL);
e_std_rahmen(xa, ya, xe, ye, name, sw, fr, fes);
return(pic);
}
PIC *e_change_pic(int xa, int ya, int xe, int ye, PIC *pic, int sw, int frb)
{
int i, j;
int box = 2, ax, ay, ex, ey;
PIC *newpic;
if(sw<0) { sw = -sw; box = 1; }
if (pic == NULL)
{ newpic = e_open_view(xa, ya, xe, ye, frb, box);
if (newpic == NULL) return (NULL);
}
else if (xa > pic->e.x || xe < pic->a.x ||
ya > pic->e.y || ye < pic->a.y)
{ e_close_view(pic, box);
newpic = e_open_view(xa, ya, xe, ye, frb, box);
if (newpic == NULL) return (NULL);
}
else
{
newpic = MALLOC(sizeof(PIC));
if(newpic == NULL) return(NULL);
newpic->a.x = xa;
newpic->a.y = ya;
#ifndef NEWSTYLE
if(!WpeIsXwin())
{ newpic->e.x = xe;
newpic->e.y = ye;
}
else
{ newpic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
newpic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
}
#else
newpic->e.x = xe;
newpic->e.y = ye;
#endif
#if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 3
* (newpic->e.y - newpic->a.y + 1) );
#else
newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 2
* (newpic->e.y - newpic->a.y + 1) );
#endif
if (newpic->p == NULL) { FREE(newpic); return(NULL); }
ax = pic->a.x > newpic->a.x ? pic->a.x : newpic->a.x;
ay = pic->a.y > newpic->a.y ? pic->a.y : newpic->a.y;
ex = pic->e.x < newpic->e.x ? pic->e.x : newpic->e.x;
ey = pic->e.y < newpic->e.y ? pic->e.y : newpic->e.y;
for (j = ay; j <= ey; ++j)
for (i = 2*ax; i <= 2*ex+1; ++i)
{ *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
+ (i-2*newpic->a.x))
= *(pic->p + 2*(pic->e.x-pic->a.x+1)*(j-pic->a.y)
+ (i - 2*pic->a.x) );
}
for (j = newpic->a.y; j < ay; ++j)
for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
{ *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
}
for (j = newpic->e.y; j > ey; --j)
for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
{ *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
}
for (j = newpic->a.y; j <= newpic->e.y; ++j)
for (i = 2*newpic->a.x; i < 2*ax; ++i)
{ *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
}
for (j = newpic->a.y; j <= newpic->e.y; ++j)
for (i = 2*(ex+1); i <= 2*newpic->e.x + 1; ++i)
{ *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
}
for (j = pic->a.y; j < ya; ++j)
for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
for (j = pic->a.y; j <= pic->e.y; ++j)
for (i = 2*pic->a.x; i < 2*xa; i=i+1)
e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
*(pic->e.x-pic->a.x+1) + (i - 2*pic->a.x) ) );
for (j = pic->e.y; j > ye; --j)
for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
for (j = pic->e.y; j >= pic->a.y; --j)
for (i = 2*pic->e.x + 1; i > 2*xe; --i)
e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
#if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
e_put_pic_xrect(pic);
e_get_pic_xrect(xa, ya, xe, ye, newpic);
#endif
#ifndef NEWSTYLE
if (WpeIsXwin())
{ if(xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
e_pt_col(xe+1, i, SHDCOL);
if(xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
e_pt_col(xe+2, i, SHDCOL);
if(ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++)
e_pt_col(i, ye+1, SHDCOL);
}
#endif
FREE(pic->p);
FREE(pic);
}
#ifndef NO_XWINDOWS
if (WpeIsXwin()) (*e_u_setlastpic)(newpic);
#endif
return(newpic);
}
PIC *e_ed_kst(FENSTER *f, PIC *pic, int sw)
{
PIC *newpic = e_change_pic(f->a.x, f->a.y, f->e.x,
f->e.y, pic, sw, f->fb->er.fb);
e_ed_rahmen(f, sw);
return(newpic);
}
/* delete buffer */
int e_close_buffer(BUFFER *b)
{
int i;
if (b != NULL)
{
e_remove_undo(b->ud, b->cn->numundo + 1);
if (b->bf != NULL)
{
for (i = 0; i < b->mxlines; i++)
{
if (b->bf[i].s != NULL)
FREE( b->bf[i].s );
b->bf[i].s = NULL;
}
FREE(b->bf);
}
FREE(b);
}
return(0);
}
/* close window */
int e_close_window(FENSTER *f)
{
ECNT *cn = f->ed;
FENSTER *f0 = f->ed->f[0];
int c = 0;
long maxname;
char text[256];
f = cn->f[cn->mxedt];
if (f->dtmd == DTMD_FILEMANAGER)
{
FLBFFR *b = (FLBFFR *)f->b;
FREE(f->dirct);
FREE(b->rdfile);
freedf(b->df); freedf(b->fw->df);
freedf(b->dd); freedf(b->cd); freedf(b->dw->df);
FREE(b->fw);
FREE(b->dw);
FREE(b);
(cn->mxedt)--;
cn->curedt = cn->edt[cn->mxedt];
e_close_view(f->pic, 1);
if (f != f0 && f != NULL)
{
e_free_find(&f->fd);
FREE(f);
}
if (cn->mxedt > 0)
{
f = cn->f[cn->mxedt];
e_ed_rahmen(f, 1);
}
return(0);
}
if (f->dtmd == DTMD_DATA)
{
FLWND *fw = (FLWND *)f->b;
int swt = f->ins;
#ifdef PROG
if (swt == 4 && f->save)
e_p_update_prj_fl(f);
#endif
if (f->dirct)
FREE(f->dirct);
if (swt == 7)
freedf(fw->df);
FREE(fw);
(cn->mxedt)--;
cn->curedt = cn->edt[cn->mxedt];
e_close_view(f->pic, 1);
if (f != f0 && f != NULL)
{
e_free_find(&f->fd);
FREE(f);
}
if (cn->mxedt > 0 && (swt < 5 || swt == 7))
{
f = cn->f[cn->mxedt];
e_ed_rahmen(f, 1);
}
return(0);
}
if (f == NULL || f->ed->mxedt <= 0)
return(0);
if (f != f0)
{
if (f->save != 0 && f->ins != 8)
{
sprintf(text, "File %s NOT saved!\nDo you want to save File ?", f->datnam);
c = e_message(1, text, f);
if (c == WPE_ESC)
return(c);
else if (c == 'Y')
e_save(f);
}
/* Check if file system could have an autosave or emergency save file
>12 check is to eliminate dos file systems */
if ((maxname = pathconf(f->dirct, _PC_NAME_MAX) >= strlen(f->datnam) + 4) &&
(maxname > 12))
{
remove(e_make_postf(text, f->datnam, ".ASV"));
remove(e_make_postf(text, f->datnam, ".ESV"));
}
if (strcmp(f->datnam, "Messages") && strcmp(f->datnam, "Watches"))
e_close_buffer(f->b);
if (f->dtmd == DTMD_HELP && f->ins == 8)
e_help_free(f);
if (f->datnam != NULL)
FREE(f->datnam);
if (f->dirct != NULL)
FREE(f->dirct);
if (f && f->s != NULL)
FREE(f->s);
}
(cn->mxedt)--;
cn->curedt = cn->edt[cn->mxedt];
e_close_view(f->pic, 1);
if (f != f0 && f != NULL)
{
e_free_find(&f->fd);
FREE(f);
}
if (cn->mxedt > 0)
{
f = cn->f[cn->mxedt];
e_ed_rahmen(f, 1);
}
return(c);
}
/* Toggle among windows */
int e_rep_win_tree(ECNT *cn)
{
int i;
if (cn->mxedt <= 0) return(0);
ini_repaint(cn);
for ( i = 1; i < cn->mxedt; i++)
{
e_firstl(cn->f[i], 0);
e_schirm(cn->f[i], 0);
}
e_firstl(cn->f[i], 1);
e_schirm(cn->f[i], 1);
e_cursor(cn->f[i], 1);
end_repaint();
return(0);
}
void e_switch_window(int num, FENSTER *f)
{
ECNT *cn = f->ed;
FENSTER *ft;
int n, i, te;
for (n = 1; cn->edt[n] != num && n < cn->mxedt; n++)
;
if (n >= cn->mxedt) return;
for (i = cn->mxedt; i >= 1; i--)
{
FREE(cn->f[i]->pic->p);
FREE(cn->f[i]->pic);
}
ft = cn->f[n];
te = cn->edt[n];
for ( i = n; i < cn->mxedt; i++)
{
cn->edt[i] = cn->edt[i+1];
cn->f[i] = cn->f[i+1];
}
cn->f[i] = ft;
cn->edt[i] = te;
cn->curedt = num;
e_rep_win_tree(cn);
}
/* zoom windows */
int e_ed_zoom(FENSTER *f)
{
if (f->ed->mxedt > 0)
{
if(f->zoom == 0)
{
f->sa = e_set_pnt(f->a.x, f->a.y);
f->se = e_set_pnt(f->e.x, f->e.y);
f->a = e_set_pnt(0, 1);
f->e = e_set_pnt(MAXSCOL-1, MAXSLNS-2);
f->zoom = 1;
}
else
{
f->a = e_set_pnt(f->sa.x, f->sa.y);
f->e = e_set_pnt(f->se.x, f->se.y);
f->zoom = 0;
}
f->pic = e_ed_kst(f, f->pic, 1);
if(f->pic == NULL) e_error(e_msg[ERR_LOWMEM], 1, f->fb);
e_cursor(f, 1);
e_schirm(f, 1);
}
return(WPE_ESC);
}
/* cascade windows */
int e_ed_cascade(FENSTER *f)
{
ECNT *cn = f->ed;
int i;
if (cn->mxedt < 1)
return 0; /* no windows open */
for (i = cn->mxedt; i >= 1; i--)
{
FREE(cn->f[i]->pic->p);
FREE(cn->f[i]->pic);
cn->f[i]->a = e_set_pnt(i-1, i);
cn->f[i]->e = e_set_pnt(MAXSCOL-1-cn->mxedt+i, MAXSLNS-2-cn->mxedt+i);
}
ini_repaint(cn);
for ( i = 1; i < cn->mxedt; i++)
{
e_firstl(cn->f[i], 0);
e_schirm(cn->f[i], 0);
}
e_firstl(cn->f[i], 1);
e_schirm(cn->f[i], 1);
e_cursor(cn->f[i], 1);
end_repaint();
return(0);
}
/* Tile windows */
int e_ed_tile(FENSTER *f)
{
ECNT *cn = f->ed;
POINT atmp[MAXEDT+1];
POINT etmp[MAXEDT+1];
int i, j, ni, nj;
int editwin = 0; /* number of editor windows */
int editorwin[MAXEDT + 1];
int maxlines = MAXSLNS;
for (i = cn->mxedt; i >= 1; i--)
{
if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (!DTMD_ISTEXT(cn->f[i]->dtmd) ||
((WpeIsProg()) && ((strcmp(cn->f[i]->datnam, "Messages") == 0) ||
(strcmp(cn->f[i]->datnam, "Watches") == 0)))))
{
editorwin[i] = 0;
}
else
{
editwin++;
editorwin[i] = 1;
}
}
if (editwin < 1)
return(0);
if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (WpeIsProg()))
{
maxlines -= MAXSLNS / 3 - 1;
}
for (i = cn->mxedt; i >= 1; i--)
{
FREE(cn->f[i]->pic->p);
FREE(cn->f[i]->pic);
}
for (ni = editwin, nj = 1; ni > 1; ni--)
{
nj = editwin / ni;
if (editwin % ni)
nj++;
if (nj >= ni)
break;
}
if (nj*ni < editwin)
nj++;
for (j = 0; j < nj; j++)
{
for (i = 0; i < ni; i++)
{
if (j == 0)
{
if (i == 0)
{
atmp[j*ni+i].x = i * MAXSCOL / ni;
etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
}
else
{
etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
atmp[j*ni+i].x = etmp[j*ni+i-1].x + 1;
if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
if (etmp[j*ni+i].x >= MAXSCOL)
{
etmp[j*ni+i].x = MAXSCOL - 1;
atmp[j*ni+i].x = etmp[j*ni+i].x - 26;
}
}
}
else
{
atmp[j*ni+i].x = atmp[(j-1)*ni+i].x;
etmp[j*ni+i].x = etmp[(j-1)*ni+i].x;
/* make the last window full width */
if ((j * ni + i) == (editwin - 1))
etmp[j * ni + i].x = MAXSCOL - 1;
}
}
}
for (i = 0; i < ni; i++)
{
for (j = 0; j < nj; j++)
{
if (i == 0)
{
if (j == 0)
{
atmp[j*ni+i].y = j * (maxlines-2) / nj + 1;
etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
}
else
{
etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
atmp[j*ni+i].y = etmp[(j-1)*ni+i].y + 1;
if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
if (etmp[j*ni+i].y > maxlines - 2)
{
etmp[j*ni+i].y = maxlines - 2;
atmp[j*ni+i].y = etmp[j*ni+i].y - 3;
}
}
}
else
{
atmp[j*ni+i].y = atmp[j*ni+i-1].y;
etmp[j*ni+i].y = etmp[j*ni+i-1].y;
}
}
}
for (i = 0, j = 1; i < editwin; i++, j++)
{
while (!editorwin[j]) j++;
cn->f[j]->a = e_set_pnt(atmp[i].x, atmp[i].y);
cn->f[j]->e = e_set_pnt(etmp[i].x, etmp[i].y);
cn->f[j]->zoom = 0; /* Make sure zoom is off */
}
ini_repaint(cn);
for ( i = 1; i < cn->mxedt; i++)
{
e_firstl(cn->f[i], 0);
e_schirm(cn->f[i], 0);
}
e_firstl(cn->f[i], 1);
e_schirm(cn->f[i], 1);
e_cursor(cn->f[i], 1);
end_repaint();
return(0);
}
/* call next window */
int e_ed_next(FENSTER *f)
{
if (f->ed->mxedt > 0) e_switch_window(f->ed->edt[1], f);
return(0);
}
/* write a line (screen content) */
void e_pr_line(int y, FENSTER *f)
{
BUFFER *b = f->b;
SCHIRM *s = f->s;
int i, j, k, frb;
#ifdef DEBUGGER
int fsw = 0;
#endif
for (i = j = 0; j < NUM_COLS_OFF_SCREEN_LEFT; j++, i++)
{
if (*(b->bf[y].s + i) == WPE_TAB)
j += (f->ed->tabn - j % f->ed->tabn - 1);
else if(((unsigned char) *(b->bf[y].s + i)) > 126)
{
j++;
if (((unsigned char) *(b->bf[y].s + i)) < 128 + ' ')
j++;
}
else if (*(b->bf[y].s + i) < ' ') j++;
}
if (j > NUM_COLS_OFF_SCREEN_LEFT) i--;
#ifdef DEBUGGER
for (j = 1; j <= s->brp[0]; j++)
if (s->brp[j] == y) { fsw = 1; break; }
for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
{
if (y == s->da.y && i >= s->da.x && i < s->de.x )
frb = s->fb->dy.fb;
else if (fsw) frb = s->fb->db.fb;
/* else if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y) */
else if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
frb = s->fb->ek.fb;
#else
for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
{
if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
frb = s->fb->ek.fb;
#endif
/* if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y)
|| (i == s->pt[2].x && y == s->pt[2].y) || (i == s->pt[3].x && y == s->pt[3].y)
|| (i == s->pt[4].x && y == s->pt[4].y) || (i == s->pt[5].x && y == s->pt[5].y)
|| (i == s->pt[6].x && y == s->pt[6].y) || (i == s->pt[7].x && y == s->pt[7].y)
|| (i == s->pt[8].x && y == s->pt[8].y) || (i == s->pt[9].x && y == s->pt[9].y))
frb = s->fb->ek.fb;
*/
else if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
(y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
(y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
(y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
frb = s->fb->ez.fb;
else
frb = s->fb->et.fb;
if (f->dtmd == DTMD_HELP)
{
if (*(b->bf[y].s + i) == HBG || *(b->bf[y].s + i) == HFB ||
*(b->bf[y].s + i) == HHD || *(b->bf[y].s + i) == HBB)
{
if (*(b->bf[y].s + i) == HHD) frb = s->fb->hh.fb;
else if(*(b->bf[y].s + i) == HBB) frb = s->fb->hm.fb;
else frb = s->fb->hb.fb;
#ifdef NEWSTYLE
if (*(b->bf[y].s + i) != HBB) k = j;
else k = -1;
#endif
for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
j--;
#ifdef NEWSTYLE
if (WpeIsXwin() && k >= 0)
e_make_xrect(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + k + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, 0);
#endif
continue;
}
else if (*(b->bf[y].s + i) == HFE)
{
for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
' ', s->fb->hh.fb);
return;
}
else if (*(b->bf[y].s + i) == HNF)
{
for (k = j, i++; b->bf[y].s[i] != ':' && i < b->bf[y].len &&
j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), s->fb->hb.fb);
#ifdef NEWSTYLE
if (WpeIsXwin())
e_make_xrect(f->a.x-NUM_COLS_OFF_SCREEN_LEFT+k+1, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1,
f->a.x-NUM_COLS_OFF_SCREEN_LEFT+j, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1, 0);
#endif
for (; b->bf[y].s[i] != HED && i < b->bf[y].len &&
j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
for (; b->bf[y].s[i] != '.' && i < b->bf[y].len &&
j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
j--;
continue;
}
else if (*(b->bf[y].s + i) == HED) { j--; continue; }
}
if (*(b->bf[y].s + i) == WPE_TAB)
for (k = f->ed->tabn - j % f->ed->tabn; k > 1 &&
j < NUM_COLS_ON_SCREEN + NUM_COLS_OFF_SCREEN_LEFT - 2; k--, j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
' ', frb);
else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126)
{
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
'@', frb);
if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ' &&
j < COL_NUM_ON_SCREEN_RIGHT)
{
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
'^', frb);
if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
}
}
else if (*(b->bf[y].s + i) < ' ')
{
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
'^', frb);
if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
}
if (*(b->bf[y].s + i) == WPE_TAB)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126 &&
j < COL_NUM_ON_SCREEN_RIGHT)
{
if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ')
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
((unsigned char) *(b->bf[y].s + i)) + 'A' - 129, frb);
else
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
((unsigned char) *(b->bf[y].s + i)) - 128, frb);
}
else if (*(b->bf[y].s + i) < ' ' && j < COL_NUM_ON_SCREEN_RIGHT)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
*(b->bf[y].s + i) + 'A' - 1, frb);
else
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
*(b->bf[y].s + i), frb);
}
if ((i == b->bf[y].len) && (f->ed->edopt & ED_SHOW_ENDMARKS) &&
(DTMD_ISMARKABLE(f->dtmd)) && (j < COL_NUM_ON_SCREEN_RIGHT))
{
if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
(y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
(y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
(y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
{
if (*(b->bf[y].s + i) == WPE_WR)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
PWR, s->fb->ez.fb);
else
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
PNL, s->fb->ez.fb);
}
else
{
if (*(b->bf[y].s + i) == WPE_WR)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
PWR, s->fb->et.fb);
else
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
PNL, s->fb->et.fb);
}
j++;
}
for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
' ', s->fb->et.fb);
}
/* draw standard-box frame */
void e_std_rahmen(int xa, int ya, int xe, int ye, char *name, int sw, int frb,
int fes)
{
int i;
char rhm[2][6];
char *short_name;
rhm[0][0] = RE1; rhm[0][1] = RE2; rhm[0][2] = RE3; rhm[0][3] = RE4;
rhm[0][4] = RE5; rhm[0][5] = RE6; rhm[1][0] = RD1; rhm[1][1] = RD2;
rhm[1][2] = RD3; rhm[1][3] = RD4; rhm[1][4] = RD5; rhm[1][5] = RD6;
for (i = xa + 1; i < xe; i++)
{
e_pr_char(i, ya, rhm[sw][4], frb);
e_pr_char(i, ye, rhm[sw][4], frb);
}
for (i = ya + 1; i < ye; i++)
{
e_pr_char(xa, i, rhm[sw][5], frb);
e_pr_char(xe, i, rhm[sw][5], frb);
}
e_pr_char(xa, ya, rhm[sw][0], frb);
e_pr_char(xa, ye, rhm[sw][2], frb);
e_pr_char(xe, ya, rhm[sw][1], frb);
e_pr_char(xe, ye, rhm[sw][3], frb);
if (name)
{
if (strlen(name) < xe - xa - 14)
e_pr_str((xa+xe-strlen(name))/2, ya, name, frb, 0, 0, 0, 0);
else
{
short_name = strdup(name);
strcpy(short_name + xe - xa - 17, "...");
e_pr_str(xa + 7, ya, short_name, frb, 0, 0, 0, 0);
free(short_name);
}
}
if (sw != 0)
{
e_pr_char(xa+3, ya, WBT, fes);
#ifdef NEWSTYLE
if (!WpeIsXwin())
#endif
{
e_pr_char(xa+2, ya, '[', frb);
e_pr_char(xa+4, ya, ']', frb);
}
#ifdef NEWSTYLE
else e_make_xrect(xa+2, ya, xa+4, ya, 0);
}
if (WpeIsXwin()) e_make_xr_rahmen(xa, ya, xe, ye, sw);
#else
}
/*
if(xe < MAXSCOL-1) for(i = ya+1; i <= ye; i++) e_pt_col(xe+1, i, SHDCOL);
if(ye < MAXSLNS-2) for(i = xa+1; i <= xe+1 && i < MAXSCOL; i++)
e_pt_col(i, ye+1, SHDCOL);
*/
#endif
}
struct dirfile *e_add_df(char *str, struct dirfile *df)
{
int i, n;
char *tmp;
if (df == NULL)
{ df = MALLOC(sizeof(struct dirfile));
df->anz = 0;
df->name = MALLOC(sizeof(char*));
}
for(n = 0; n < df->anz && *df->name[n] && strcmp(df->name[n], str); n++);
if(n == df->anz)
{ if(df->anz == MAXSVSTR - 1) FREE(df->name[df->anz-1]);
else
{ df->anz++;
df->name = REALLOC(df->name, df->anz * sizeof(char*));
}
for(i = df->anz-1; i > 0; i--) df->name[i] = df->name[i-1];
df->name[0] = MALLOC((strlen(str)+1) * sizeof(char));
strcpy(df->name[0], str);
}
else
{ tmp = df->name[n];
for(i = n; i > 0; i--) df->name[i] = df->name[i-1];
if(!tmp[0])
{ FREE(tmp);
df->name[0] = MALLOC((strlen(str) + 1) * sizeof(char));
strcpy(df->name[0], str);
}
else df->name[0] = tmp;
}
return(df);
}
int e_sv_window(int xa, int ya, int *n, struct dirfile *df, FENSTER *f)
{
ECNT *cn = f->ed;
int ret, ye = ya + 6;
int xe = xa +21;
FLWND *fw = MALLOC(sizeof(FLWND));
if ((f = (FENSTER *) MALLOC(sizeof(FENSTER))) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, cn->fb);
if (xe > MAXSCOL-3) { xe = MAXSCOL - 3; xa = xe - 21; }
if (ye > MAXSLNS-3) { ye = MAXSLNS - 3; ya = ye - 6; }
f->fb = cn->fb;
f->a = e_set_pnt(xa, ya);
f->e = e_set_pnt(xe, ye);
f->dtmd = DTMD_FILEDROPDOWN;
f->zoom = 0;
f->ed = cn;
f->c_sw = NULL;
f->c_st = NULL;
f->fd.dirct = NULL;
f->winnum = -1;
f->datnam = "";
if (!(f->pic = e_ed_kst(f, NULL, 1)))
{ e_error(e_msg[ERR_LOWMEM], 0, f->fb); return(0); }
f->b = (BUFFER *)fw;
fw->mxa = xa; fw->mxe = xe; fw->mya = ya; fw->mye = ye;
fw->xa = xa+1; fw->xe = xe; fw->ya = ya+1; fw->ye = ye;
fw->df = df; fw->srcha = 0; fw->f = f;
fw->nf = fw->ia = fw->ja = 0;
do
{
ret = e_file_window(0, fw, f->fb->er.fb, f->fb->ez.fb);
#if MOUSE
if (ret < 0) ret = e_rahmen_mouse(f);
#endif
if ((ret == AF2 && !(f->ed->edopt & ED_CUA_STYLE)) ||
(f->ed->edopt & ED_CUA_STYLE && ret == CtrlL))
e_size_move(f);
} while(ret != WPE_CR && ret != WPE_ESC);
*n = fw->nf;
e_close_view(f->pic, 1);
FREE(fw);
FREE(f);
return(ret);
}
int e_schr_lst_wsv(char *str, int xa, int ya, int n, int len, int ft,
int fz, struct dirfile **df, FENSTER *f)
{
#if MOUSE
extern struct mouse e_mouse;
#endif
int ret, num;
do
{ *df = e_add_df(str, *df);
#ifndef NEWSTYLE
ret = e_schreib_leiste(str, xa, ya, n-4, len, ft, fz);
#else
ret = e_schreib_leiste(str, xa, ya, n-3, len, ft, fz);
#endif
#if MOUSE
if(ret < 0 && e_mouse.y == ya && e_mouse.x >= xa+n-3
&& e_mouse.x <= xa+n-1) ret = CDO;
#endif
if (ret == CDO && e_sv_window(xa+n, ya, &num, *df, f) == WPE_CR)
strcpy(str, (*df)->name[num]);
} while(ret == CDO);
return(ret);
}
int e_schr_nchar_wsv(char *str, int x, int y, int n, int max, int col,
int csw)
#ifdef NEWSTYLE
{
e_pr_char(x+max-3, y, ' ', csw);
e_pr_char(x+max-2, y, WSW, csw);
e_pr_char(x+max-1, y, ' ', csw);
e_make_xrect(x+max-3, y, x+max-1, y, 0);
return(e_schr_nchar(str, x, y, n, max-3, col));
}
#else
{
#if !defined(NO_XWINDOWS)
int swcol = (e_gt_col(x+max, y) / 16) * 16;
if (WpeIsXwin())
{
e_pr_char(x+max, y, SCR, swcol);
e_pr_char(x+max, y+1, SCD, swcol);
e_pr_char(x+max-1, y+1, SCD, swcol);
e_pr_char(x+max-2, y+1, SCD, swcol);
}
#endif
e_pr_char(x+max-3, y, ' ', csw);
e_pr_char(x+max-2, y, WSW, csw);
e_pr_char(x+max-1, y, ' ', csw);
return(e_schr_nchar(str, x, y, n, max-4, col));
}
#endif
int e_mess_win(char *header, char *str, PIC **pic, FENSTER *f)
{
ECNT *cn = f->ed;
extern int (*e_u_kbhit)(void);
#if MOUSE
extern struct mouse e_mouse;
#endif
int xa, ya, xe, ye, num, anz = 0, mxlen = 0, i, j;
char **s;
s = StringToStringArray(str, &mxlen, strlen(header) + 8, &anz);
ya = (MAXSLNS - anz - 6)/2;
ye = ya + anz + 5;
xa = (MAXSCOL - mxlen - 6)/2;
xe = xa + mxlen + 6;
if (ya < 2) ya = 2;
if (ye > MAXSLNS-3) ye = MAXSLNS - 3;
num = anz;
if (num > ye - ya - 5)
{
num = ye - ya - 5;
strcpy(s[num-1], "...");
}
if (!(*pic) || (*pic)->e.x != xe || (*pic)->a.x != xa || (*pic)->e.x < xe)
{
*pic = e_change_pic(xa, ya, xe, ye, *pic, 1, cn->fb->nt.fb);
for (i = xa + 1; i < xe; i++)
{
e_pr_char(i, ye-2, ' ', f->fb->nt.fb);
e_pr_char(i, ye-1, ' ', f->fb->nt.fb);
}
e_pr_str((xe + xa - 6)/2, ye-2, "Ctrl C", cn->fb->nz.fb, -1, -1,
cn->fb->ns.fb, cn->fb->nt.fb);
}
e_std_rahmen(xa, ya, xe, ye, header, 1, cn->fb->nr.fb, cn->fb->ne.fb);
for (i = xa + 1; i < xe; i++)
e_pr_char(i, ya+1, ' ', cn->fb->nr.fb);
for (j = 0; j < num; j++)
{
e_pr_char(xa+1, ya+2+j, ' ', cn->fb->nt.fb);
e_pr_char(xa+2, ya+2+j, ' ', cn->fb->nt.fb);
e_pr_str(xa+3, ya+2+j, s[j], cn->fb->nt.fb, 0, 0, 0, 0);
for (i = xa+strlen(s[j])+3; i < xe; i++)
e_pr_char(i, ya+2+j, ' ', cn->fb->nt.fb);
}
for (j += ya+2; j < ye-2; j++)
for (i = xa + 1; i < xe; i++)
e_pr_char(i, j, ' ', cn->fb->nt.fb);
for (i = 0; i < anz; i++)
FREE(s[i]);
FREE(s);
#ifndef NO_XWINDOWS
if (WpeIsXwin())
{
while ((i = (*e_u_kbhit)()))
{
if (i == -1 && e_mouse.y == ye-2 && e_mouse.x > (xe + xa - 10)/2 &&
e_mouse.x < (xe + xa + 6)/2 )
i = CtrlC;
if (i == CtrlC) break;
}
}
else
#endif
while ((i = (*e_u_kbhit)()) && i != CtrlC)
;
return(i == CtrlC ? 1 : 0);
}
int e_opt_sec_box(int xa, int ya, int num, OPTK *opt, FENSTER *f, int sw)
{
PIC *pic;
int n, nold, max = 0, i, c = 0, xe, ye = ya + num + 1;
for(i = 0; i < num; i++)
if((n = strlen(opt[i].t)) > max) max = n;
xe = xa + max + 3;
pic = e_std_kst(xa, ya, xe, ye, NULL, sw, f->fb->nr.fb, f->fb->nt.fb, f->fb->ne.fb);
if(pic == NULL) { e_error(e_msg[ERR_LOWMEM], 0, f->fb); return(-2); }
for (i = 0; i < num; i++)
e_pr_str_wsd(xa+2, ya+i+1, opt[i].t, f->fb->mt.fb, opt[i].x,
1, f->fb->ms.fb, xa+1, xe-1);
#if MOUSE
while (e_mshit() != 0);
#endif
n = 0; nold = 1;
while (c != WPE_ESC && c != WPE_CR)
{ if (nold != n)
{ e_pr_str_wsd(xa+2, nold+ya+1, opt[nold].t, f->fb->mt.fb,
opt[nold].x, 1, f->fb->ms.fb, xa+1, xe-1);
e_pr_str_wsd(xa+2, n+ya+1, opt[n].t, f->fb->mz.fb,
opt[n].x, 1, f->fb->mz.fb, xa+1, xe-1);
nold = n;
}
#if MOUSE
if( (c = e_toupper(e_getch())) == -1)
c = e_m2_mouse(xa, ya, xe, ye, opt);
#else
c = e_toupper(e_getch());
#endif
for (i = 0; i < ye - ya - 1; i++)
if( c == opt[i].o) { c = WPE_CR; n = i; break; }
if (i > ye - ya) c = WPE_ESC;
else if ( c == CUP || c == CtrlP ) n = n > 0 ? n-1 : ye - ya - 2 ;
else if ( c == CDO || c == CtrlN ) n = n < ye-ya-2 ? n+1 : 0 ;
else if ( c == POS1 || c == CtrlA ) n = 0;
else if ( c == ENDE || c == CtrlE ) n = ye-ya-2;
}
if(sw == 1) e_close_view(pic, 1);
return(c == WPE_ESC ? -1 : n);
}
struct dirfile *e_make_win_list(FENSTER *f)
{
int i;
struct dirfile *df;
if (!(df = MALLOC(sizeof(struct dirfile)))) return(NULL);
df->anz = f->ed->mxedt;
if (!(df->name = MALLOC(df->anz * sizeof(char *))))
{
FREE(df);
return(NULL);
}
for (i = 0; i < df->anz; i++)
{
if (f->ed->f[df->anz-i]->datnam)
{
if (!(df->name[i] =
MALLOC((strlen(f->ed->f[df->anz-i]->datnam)+1) * sizeof(char))))
{
df->anz = i;
freedf(df);
return(NULL);
}
else strcpy(df->name[i], f->ed->f[df->anz-i]->datnam);
}
else
{
if (!(df->name[i] = MALLOC(sizeof(char))))
{
df->anz = i;
freedf(df);
return(NULL);
}
else *df->name[i] = '\0';
}
}
return(df);
}
int e_list_all_win(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0; i--)
if (f->ed->f[i]->dtmd == DTMD_DATA && f->ed->f[i]->ins == 7)
{
e_switch_window(f->ed->edt[i], f);
return(0);
}
return(e_data_first(7, f->ed, NULL));
}
#ifdef NEWSTYLE
int e_get_pic_xrect(int xa, int ya, int xe, int ye, PIC *pic)
{
int i = xa, j, ebbg;
ebbg = (xe - xa + 1) * 2 * (ye - ya + 1);
for (j = ya; j <= ye; ++j)
for (i = xa; i <= xe; ++i)
*( pic->p + ebbg + (j-ya)*(xe-xa+1) + (i-xa) ) = extbyte[j*MAXSCOL + i];
return(i);
}
int e_put_pic_xrect(PIC *pic)
{
int i = 0, j;
int ebbg = (pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1);
for (j = pic->a.y; j <= pic->e.y; ++j)
for (i = pic->a.x; i <= pic->e.x; ++i)
extbyte[j*MAXSCOL+i] =
*(pic->p + ebbg + (j-pic->a.y)*(pic->e.x-pic->a.x+1) + (i-pic->a.x));
return(i);
}
int e_make_xrect_abs(int xa, int ya, int xe, int ye, int sw)
{
int j;
for (j = xa; j <= xe; j++)
*(extbyte+ya*MAXSCOL+j) = *(extbyte+ye*MAXSCOL+j) = 0;
for (j = ya; j <= ye; j++)
*(extbyte+j*MAXSCOL+xa) = *(extbyte+j*MAXSCOL+xe) = 0;
return(e_make_xrect(xa, ya, xe, ye, sw));
}
int e_make_xrect(int xa, int ya, int xe, int ye, int sw)
{
int j;
if (sw & 2)
{
sw = (sw & 1) ? 16 : 0;
for (j = xa+1; j < xe; j++)
{
*(extbyte+ya*MAXSCOL+j) |= (sw | 4);
*(extbyte+ye*MAXSCOL+j) |= (sw | 1);
}
for (j = ya+1; j < ye; j++)
{
*(extbyte+j*MAXSCOL+xa) |= (sw | 2);
*(extbyte+j*MAXSCOL+xe) |= (sw | 8);
}
}
else
{
sw = (sw & 1) ? 16 : 0;
for (j = xa; j <= xe; j++)
{
*(extbyte+ya*MAXSCOL+j) |= (sw | 1);
*(extbyte+ye*MAXSCOL+j) |= (sw | 4);
}
for (j = ya; j <= ye; j++)
{
*(extbyte+j*MAXSCOL+xa) |= (sw | 8);
*(extbyte+j*MAXSCOL+xe) |= (sw | 2);
}
}
return(j);
}
int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw)
{
if (!sw)
{
e_make_xrect(xa, ya, xe, ye, 0);
e_make_xrect(xa, ya, xe, ye, 2);
}
else
{
e_make_xrect(xa+1, ya, xe-1, ya, 0);
e_make_xrect(xa+1, ye, xe-1, ye, 0);
e_make_xrect(xa, ya+1, xa, ye-1, 0);
e_make_xrect(xe, ya+1, xe, ye-1, 0);
e_make_xrect(xa, ya, xa, ya, 0);
e_make_xrect(xe, ya, xe, ya, 0);
e_make_xrect(xe, ye, xe, ye, 0);
e_make_xrect(xa, ye, xa, ye, 0);
}
return(sw);
}
#endif
syntax highlighted by Code2HTML, v. 0.9.1