proboard/MSGED.CPP

326 lines
6.2 KiB
C++

#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <tswin.hpp>
#include "proboard.hpp"
#define LINELEN 70
class msglines
{
String *line;
int n;
void rebuild();
void enterline(String&,String&);
void ruler();
public:
msglines() { line=new String[60]; n=0; }
~msglines() { delete [] line; n=0; }
String& operator[](int i) { return line[i-1]; }
int numlines() { return n; }
void append();
void save();
void insert(int l);
void del(int l1,int l2);
void edit(int l);
void replace(int l,char *str1,char *str2);
void show();
void show(int l);
};
void
msged()
{
msglines msg;
unlink("MSGTMP");
if(run_sdkfile("/I MSGED") >= 0) return;
io << "\n\n" << S_MSGED_HEADER << "\n\n";
msg.append();
for(;;)
{
io << '\n' << S_MSGED_COMMAND_LIST;
char k= wait_language_hotkeys(K_MSGED_COMMAND_LIST);
switch(k)
{
case 5 : {
io << S_MSGED_LIST << '\n';
msg.show();
} break;
case 0 : {
io << S_MSGED_SAVE;
msg.save();
return;
}
case 6 : {
io << S_MSGED_ASK_ABORT;
if(io.ask(0)) return;
io << "\n\n";
} break;
case 1 : {
io << S_MSGED_CONTINUE << '\n';
msg.append();
} break;
case 7 : {
int line=0;
io << S_MSGED_EDIT_LINE(form("%d",msg.numlines()));
io.read(line,2);
io << '\n';
if(line<1 || line>msg.numlines()) break;
io << '\n';
msg.edit(line);
io << '\n';
} break;
case 3 : {
int line1=0,line2=0;
io << S_MSGED_DELETE_LINE << "\n\n";
io << S_MSGED_DELETE_FROM_LINE(form("%d",msg.numlines()));
io.read(line1,2);
io << '\n';
if(line1<1 || line1>msg.numlines()) break;
io << S_MSGED_DELETE_TO_LINE(form("%d",line1),form("%d",msg.numlines()));
io.read(line2,2);
io << '\n';
if(line2<line1 || line2>msg.numlines()) break;
msg.del(line1,line2);
io << '\n' << S_MSGED_X_LINES_DELETED(form("%d",line2-line1+1)) << '\n';
} break;
case 4 : {
int line=0;
io << S_MSGED_INSERT_LINE(form("%d",msg.numlines()));
io.read(line,2);
io << '\n';
if(line<1 || line>msg.numlines()) break;
io << '\n';
msg.insert(line);
} break;
case 2 : {
int line=0;
char text1[50],text2[50];
io << S_MSGED_REPLACE_TEXT(form("%d",msg.numlines()));
io.read(line,2);
io << '\n';
if(line<1 || line>msg.numlines()) break;
io << '\n';
msg.show(line);
io << '\n' << S_MSGED_ENTER_TEXT_TO_REPLACE;
io.read(text1,49);
if(!text1[0])
{
io << '\n';
break;
}
if(msg[line].find(text1)<0)
{
io << "\n\n" << S_MSGED_TEXT_NOT_FOUND << '\n';
break;
}
io << "\n\n" << S_MSGED_REPLACE_BY;
io.read(text2,49);
msg.replace(line,text1,text2);
io << "\n\n" << S_MSGED_LINE_NOW_READS << "\n\n";
msg.show(line);
} break;
}
}
}
void
msglines::save()
{
if(n<1) return;
File f("MSGTMP",fmode_create | fmode_text);
for(int i=0;i<n;i++) f << line[i];
if(line[n-1][line[n-1].len()-1]!='\n') f << '\n';
f << '\n';
}
void
msglines::ruler()
{
io << "\n\2 [##] \7[-----------------------------------------------------------------------]\n\n";
}
void
msglines::append()
{
int i=n?n-1:0;
strip_linefeed(line[i]);
String wrap;
ruler();
while(i<60)
{
io << form(" \3[\7%2d\3]:\6 ",i+1);
enterline(line[i],wrap);
if(line[i][0]=='\n') { line[i]=""; break; }
i++;
if(i<60) line[i]=wrap;
wrap="";
}
n=i;
}
void
msglines::insert(int l)
{
ruler();
String wrap,tmpline;
while(n<60)
{
io << form(" \3[\7%2d\3]:\6 ",l);
wrap="";
enterline(tmpline,wrap);
if(tmpline[0]=='\n') break;
for(int i=n;i>=l;i--) line[i]=line[i-1];
line[l-1]=tmpline;
tmpline=wrap;
n++;
l++;
}
}
void
msglines::del(int l1,int l2)
{
l1--;
l2--;
for(int i=l1;i<n-l2+l1-1;i++) line[i]=line[i+l2-l1+1];
n-=l2-l1+1;
if(!n) line[0]="";
}
void
msglines::edit(int l)
{
String wrap("X");
int LF=0;
if(line[l-1][line[l-1].len()-1]=='\n') LF=1;
strip_linefeed(line[l-1]);
ruler();
io << form(" \3[\7%2d\3]:\6 ",l);
enterline(line[l-1],wrap);
if(!LF) line[l-1][line[l-1].len()-1]=' ';
}
void
msglines::replace(int l,char *s1,char *s2)
{
l--;
int i=line[l].find(s1);
if(i<0) return;
line[l].del(i,strlen(s1));
line[l].insert(i,s2);
rebuild();
}
void
msglines::rebuild()
{
String tmpline[60];
for(int i=0,l=0;i<n;i++)
{
String wrap;
for(int j=0;j<line[i].len();j++)
{
tmpline[l] << line[i][j];
if(line[i][j]=='\n') l++;
if(tmpline[l].len()>LINELEN)
{
wordwrap(tmpline[l],wrap,LINELEN);
tmpline[++l]=wrap;
}
}
}
for(i=0,n=-1;i<60;i++)
{
line[i]=tmpline[i];
if(n<0) if(!line[i][0]) n=i;
}
}
void
msglines::show(int l)
{
String s(line[l-1]);
strip_linefeed(s);
io << form("\3[\7%2d\3]:\6 %s\n",l,(char *)s);
}
void
msglines::show()
{
io << '\n';
stopped=0;
linecounter(0);
for(int i=1;i<=n;i++)
{
show(i);
if(linecounter() || stopped) break;
}
}
void
msglines::enterline(String& s,String& wrap)
{
int nowrap=0;
if(wrap.len()) nowrap=1;
int i;
if(!nowrap) wrap="";
for(i=0;i<s.len();i++) io << s[i];
for(;;)
{
char k=io.wait();
if(k==27 || k==7) continue;
if(k==9) k=' ';
switch(k)
{
case 8: if(s.len()>0)
{
s[s.len()-1]=0;
io << "\b \b";
}
break;
case 13: s << '\n'; io << '\n'; wrap=""; return;
default: if(nowrap && s.len()>LINELEN) continue;
io << k;
s << (char)k;
}
if(s.len()>LINELEN)
{
int l=wordwrap(s,wrap,LINELEN);
for(int i=0;i<l;i++) io << "\b \b";
io << '\n';
return;
}
}
}