extern void closedown();

extern load();
extern void save(),initfile();

extern void test(),download();

extern unsigned long get_event();
extern unsigned char getkey();

extern void numrp(),textrp(),initscreen(),alpha(),select_gads(),draw_grid();
extern void invert(),mark();

void
align()
{
	int start,end;

 start=0;
	while(start<temppara.m1-1)
	 if(tempbuf[0][start]||tempbuf[1][start]||tempbuf[2][start]) break;
	 else start++;
	end=temppara.m1-1;

	while(end>start)
	 if(tempbuf[0][end]||tempbuf[1][end]||tempbuf[2][end]) break;
		else end--;
	movmem(&(tempbuf[0][start]),&(tempbuf[0][0]),end-start+1);
	movmem(&(tempbuf[1][start]),&(tempbuf[1][0]),end-start+1);
	movmem(&(tempbuf[2][start]),&(tempbuf[2][0]),end-start+1);
	setmem(&(tempbuf[0][end-start+1]),start,0);
	setmem(&(tempbuf[1][end-start+1]),start,0);
	setmem(&(tempbuf[2][end-start+1]),start,0);
 temppara.m1=end-start+1;
	draw_grid();
}

void
global()
{
 int i;

	for(i=0;i<NUMCHARS;i++)mypara[i]=temppara;
}

main()
{
	int set;
 int kx,ky,tx,ty;
	unsigned char mask;

 if(openup())closedown();
	else {
		initfile();
  initscreen();
		do {
		 switch(get_event()) {
			 case RAWKEY:
				 break;
				case MOUSEBUTTONS:
				 if(qual&(unsigned short)IEQUALIFIER_LEFTBUTTON)
					{
					 if(mx>=TTABX)
						 if(mx<TTABX+TLEN*8)
							 if(my>=TTABY-8+1)
								 if(my<TTABY+NUMCHARS/TLEN*8-8+1)
									{
										movmem(tempbuf,charbuf[cnum],BYTES_PER_COL*XMAX);
									 mypara[cnum]=temppara;
										invert();
									 cnum=(mx-TTABX)/8+(my-TTABY+8-1)/8*TLEN;
										movmem(charbuf[cnum],tempbuf,BYTES_PER_COL*XMAX);
									 temppara=mypara[cnum];
										draw_grid();
										invert();
										break;
									}
					}
				case MOUSEMOVE:
				 if(qual&(unsigned short)(IEQUALIFIER_RBUTTON|IEQUALIFIER_LEFTBUTTON)) {
						ky=(my-gridyi)/GRID_SIZE_Y;
					 if(ky>=0)
						 if(ky<myppara->y) {
								kx=(mx-gridxi)/GRID_SIZE_X-temppara.m0;
							 if(kx>=0)
								 if(kx<temppara.m1) {
										tx=(kx+temppara.m0)*GRID_SIZE_X+gridxi;
										ty=ky*GRID_SIZE_Y+gridyi;
										mask=1<<(7-(ky&7));

									 if(qual&(unsigned short)IEQUALIFIER_RBUTTON) {
										 SetAPen(myRastPort,0l);
										 tempbuf[ky/8][kx]&=~mask;
											set=1;
										}
									 if(qual&(unsigned short)IEQUALIFIER_LEFTBUTTON) {
											if(kx)
												if(!(tempbuf[ky/8][kx-1]&mask)) set=1;
											 else set=0;
											else set=1;
											if(set)
											 if(ky<myppara->y)
													if(!(tempbuf[ky/8][kx+1]&mask)) set=1;
													else set=0;
												else set=1;
											if(set) {
											 tempbuf[ky/8][kx]|=mask;
											 SetAPen(myRastPort,1l);
											}
										}
										if(set) RectFill(myRastPort,(long)(tx+1),(long)(ty+1),
										          (long)(tx+GRID_SIZE_X-1),(long)(ty+GRID_SIZE_Y-1));
									}
							}
					}
				 break;
				case GADGETUP:
					if(id==GADGET_FORWARD||id==GADGET_BACK) {
					 mypara[cnum]=temppara;
						movmem(tempbuf,charbuf[cnum],BYTES_PER_COL*XMAX);
						invert();
					}
				 switch(id) {
					 case GADGET_SHIFTRIGHT:
						 movmem(tempbuf,&(tempbuf[0][1]),BYTES_PER_COL*XMAX-1);
							tempbuf[0][0]=0;
							tempbuf[1][0]=0;
							tempbuf[2][0]=0;
							break;
					 case GADGET_SHIFTLEFT:
						 movmem(&(tempbuf[0][1]),tempbuf,BYTES_PER_COL*XMAX-1);
							tempbuf[0][XMAX-1]=0;
							tempbuf[1][XMAX-1]=0;
							tempbuf[2][XMAX-1]=0;
							break;
					 case GADGET_FORWARD:
						 if(cnum<NUMCHARS-1) cnum++;
						 break;
					 case GADGET_BACK:
						 if(cnum) cnum--;
						 break;

      case GADGET_LOAD:
						 load();
							movmem(charbuf[cnum],tempbuf,BYTES_PER_COL*XMAX);
						 temppara=mypara[cnum];
							alpha();
							invert();
							select_gads();
							draw_grid();
							break;
      case GADGET_SAVE:
							initsave();
							break;
						case GADGET_SAVENAME:
						 save();
							break;
						case GADGET_ALIGN:
						 align();
							break;
						case GADGET_TEST:
							test();
							break;
						case GADGET_DWNLD:
						 mypara[cnum]=temppara;
							movmem(tempbuf,charbuf[cnum],BYTES_PER_COL*XMAX);
						 download();
							break;
						case GADGET_CLEAR:
							setmem(tempbuf,BYTES_PER_COL*XMAX,0);
							draw_grid();
							break;
						case GADGET_GLOBAL:
							global();
							break;
						case GADGET_MARK:
						 mark(marked[cnum]);
							marked[cnum]^=1;
						 break;

      case GADGET_R_LEFTBORDER:
						 if(temppara.m0)temppara.m0--;
						 break;
      case GADGET_L_LEFTBORDER:
						 if(temppara.m0+temppara.m1+temppara.m2<myppara->mmax)temppara.m0++;
						 break;
      case GADGET_L_RIGHTBORDER:
						 if(temppara.m2)temppara.m2--;
						 break;
      case GADGET_R_RIGHTBORDER:
						 if(temppara.m0+temppara.m1+temppara.m2<myppara->mmax)temppara.m2++;
						 break;
      case GADGET_SMALLER:
						 if(temppara.m1>1)temppara.m1--;
						 break;
      case GADGET_GREATER:
						 if(temppara.m0+temppara.m1+temppara.m2<myppara->mmax)
							 if(temppara.m1<myppara->m1max)temppara.m1++;
						 break;

					 case GADGET_DRAFT:
							draft=e_draft;
							if(elpi==e_noelpi) elpi=e_pica;
							cond=e_nocond;
							fix=e_fix;
						 break;
					 case GADGET_LQ:
						 draft=e_lq;
							if(fix==e_fix&&elpi==e_noelpi) elpi=e_pica;
						 break;
						case GADGET_ELITE:
						 elpi=e_elite;
							fix=e_fix;
							if(cond==e_semicond)cond=e_nocond;
							break;
						case GADGET_PICA:
						 elpi=e_pica;
							fix=e_fix;
							if(cond==e_semicond)cond=e_nocond;
							break;
						case GADGET_FIX:
						 fix=e_fix;
							if(draft==e_lq&&elpi==e_noelpi) elpi=e_pica;
							break;
					 case GADGET_PROPORTIONAL:
						 fix=e_prop;
							elpi=e_noelpi;
							cond=e_nocond;
							draft=e_lq;
							break;
						case GADGET_CONDENSED:
						 if(cond==e_cond) cond=e_nocond;
							else {
							 cond=e_cond;
								draft=e_lq;
								fix=e_fix;
								if(elpi==e_noelpi) elpi=e_pica;
							}
							break;
						case GADGET_SEMICONDENSED:
						 if(cond==e_semicond) {
							 cond=e_nocond;
								elpi=e_pica;
							}
							else {
							 cond=e_semicond;
								draft=e_lq;
								elpi=e_noelpi;
								fix=e_fix;
							}
							break;
						case GADGET_SUB:
							if(subsuper==e_sub)subsuper=e_normal;
							else subsuper=e_sub;
						 break;
						case GADGET_SUPER:
							if(subsuper==e_super)subsuper=e_normal;
							else subsuper=e_super;
						 break;
					}
					if(id==GADGET_SHIFTLEFT||id==GADGET_SHIFTRIGHT) draw_grid();
					if(id<=GADGET_SMALLER&&id>=GADGET_L_LEFTBORDER) draw_grid();
					if(id<=GADGET_FIX&&id>=GADGET_DRAFT) {
					 select_gads();
						temppara.m1=myppara->m1max;
						temppara.m0=(myppara->mmax-temppara.m1)/2;
						temppara.m2=myppara->mmax-temppara.m0-temppara.m1;
						global();
						draw_grid();
					}
					if(id==GADGET_FORWARD||id==GADGET_BACK) {
						movmem(charbuf[cnum],tempbuf,BYTES_PER_COL*XMAX);
					 temppara=mypara[cnum];
						draw_grid();
						invert();
					}
				 break;
			}
		} while(class!=CLOSEWINDOW);
	 closedown();
	}
}
