Program Graphical_Sudoku_UpGrade;
uses windos,strings,SDKkrnl,Opnsdk,GrpSdk,graph,mouse,keyboard,crt;
const nb=20;
type but=object
         x1,y1,x2,y2:integer;
         m:string;
         f:1..nb;
         end;

var FN: string;
    b: array[1..nb] of but;
    bm,lx,ly,msx,msy: word;
    sel: record sx,sy:domen;end;
    GrMode: byte;
    IsExit: boolean;
    SDK:TSdk;

   procedure button(nr:integer);
begin
with b[nr] do begin
rectangle(x1,y1,x2,y2);
outtextxy(x1+(x2-x1)div 2,y1+(y2-y1)div 2,m);
end;
end;

  Procedure Func(n:byte);
begin
case n of
1:Done;
2:begin Sdk.Rezolva; end;
3: Sdk.Generate;
4:begin Sdk.newsheet;end;
5: Sdk.VerUnic;
6: for z:=1 to nn do Sdk.AnalPat(z,0);
7: begin Sdk.NewSheet;OpenF(fn,Sdk);end;
end;
end;

  Procedure DrowAll;
begin
   rectangle(1,1,mx-1,my-1);
   transfer(sdk);
   fereastra(cl[2]);
   setcolor(cl[3]);
   With fer,sel do begin
    rectangle(x1+gr+(sx-1)*uw,y1+gr+(sy-1)*uh,x1-gr+sx*uw,y1-gr+sy*uh);
   end;
   for i:=1 to nb do button(i);
   drmouse(msx,msy);
   outtextxy(20,my-25,tex(key));
   changepage;
end;

  Procedure verkey;
 begin
 if keypress then begin
  if testkey(1) then done;
  if testkey(56) then for i:=2 to nb do if testkey(i) then func(i);
  with sel do begin
   if testkey(72)then if sy>1  then sy:=sy-1;
   if testkey(80)then if sy<nn then sy:=sy+1;
   if testkey(75)then if sx>1  then sx:=sx-1;
   if testkey(77)then if sx<nn then sx:=sx+1;
  end;
  if testkey(59) then begin
   inc(GrMode);
   GrMode:=(GrMode-1)mod 6 +1;
   init(GrMode);
  end;
  if TestKey(Space_Scan) then for i:=2 to 11 do
   if TestKey(i) then ;
 end;
 end;

 Procedure VerMouse;
begin
for i:=1 to nb do with b[i] do
 if(msx>x1)and(msx<x2)and(msy>y1)and(msy<y2) then func(i);
with fer,sel do if (msx>x1)and(msx<x2)and(msy>y1)and(msy<y2) then
 begin
  sx:=(msx-x1)div uw+1;
  sy:=(msy-y1)div uh+1;
 end;
end;

  Procedure attr;
 var i:byte;
begin
Sdk.NewSheet;
cl[25]:=textattr;
cl[0]:=$a1;
cl[1]:=$1f;
cl[2]:=254*64;
cl[3]:=1000;
cl[4]:=2500;
with fer do begin
x1:=ex-(mx)div 4;x2:=ex+(mx)div 4;
y1:=ey-(my)div 3;y2:=ey+(my)div 3;
end;
atcl(cl[2]);
 with b[1] do begin x1:=ex-40;y1:=5;X2:=ex+40;Y2:=30;m:='Exit';end;
 with b[2] do begin x1:=10;X2:=100;y1:=10;Y2:=y1+30;end;
for i:=3 to 7 do with b[i] do begin b[i]:=b[2];y1:=b[i-1].y2+5;y2:=y1+30;end;
b[2].m:='Rezolva';
b[3].m:='Genereaza';
b[4].m:='Curat';
b[5].m:='Ver Unic';
b[6].m:='Anal Pat';
b[7].m:='Deschide';

 sel.sx:=1;
 sel.sy:=1;
end;

begin
GrMode:=6;
init(GrMode);
attr;
SetTextStyle(10, HorizDir);
fn:=paramstr(1);
if fn='' then begin
 fn:='Exemplu.sdk';
 Func(3);
end else OpenF(fn,Sdk);
repeat
 repeat
  drowall;
   repeat
     verkey;
     lx:=msx;ly:=msy;
     GetMouseInfo(bm,msx,msy);
   until (bm<>0)or(lx<>msx)or(ly<>msy)or(key<>0);
  until (bm<>0);
 vermouse;
until IsExit;
Done;
end.