unit tracklistform;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, ComCtrls, ExtCtrls,clipbrd,editgenre,loadjpegorbmp,albuminfo,jpeg,
  Buttons,global;

type
  Teditinfo = class(TForm)
    GroupBox1: TGroupBox;
    PageControl: TPageControl;
    titles_sheet: TTabSheet;
    readonly: TLabel;
    Label2: TLabel;
    Label1: TLabel;
    grid: TStringGrid;
    save: TButton;
    discard: TButton;
    editalbum: TComboBox;
    od: TOpenDialog;
    TabSheet1: TTabSheet;
    info_pagecontrol: TPageControl;
    general_sheet: TTabSheet;
    label3: TLabel;
    lbgenre: TComboBox;
    editgenre: TButton;
    editartist: TButton;
    lbartist: TComboBox;
    Label10: TLabel;
    label4: TLabel;
    lbyear: TComboBox;
    Label5: TLabel;
    lbdecade: TComboBox;
    description: TMemo;
    Label7: TLabel;
    Label6: TLabel;
    recordlabel: TEdit;
    compilation: TCheckBox;
    keywords: TEdit;
    Label8: TLabel;
    artwork: TTabSheet;
    imagegroup: TGroupBox;
    imagepanel: TPanel;
    front: TImage;
    loadfront: TButton;
    pastefront: TButton;
    GroupBox2: TGroupBox;
    Panel1: TPanel;
    rear: TImage;
    loadrear: TButton;
    pasterear: TButton;
    GroupBox3: TGroupBox;
    Panel2: TPanel;
    inside: TImage;
    loadinside: TButton;
    pasteinside: TButton;
    GroupBox4: TGroupBox;
    Panel3: TPanel;
    additional: TImage;
    loadadditional: TButton;
    pastadditional: TButton;
    google: TLabel;
    notes_sheet: TTabSheet;
    notes: TMemo;
    Label9: TLabel;
    discardalbuminfo: TButton;
    savealbuminfo: TButton;
    Closeform: TButton;
    Label12: TLabel;
    Label11: TLabel;
    prev: TSpeedButton;
    next: TSpeedButton;
    Label13: TLabel;
    catno: TEdit;
    urlalbum: TEdit;
    Label14: TLabel;
    urlartist: TEdit;
    Label15: TLabel;
    urladditional: TEdit;
    Label16: TLabel;
    acquirefront: TButton;
    acquirerear: TButton;
    acquireinside: TButton;
    acquireadditional: TButton;
    procedure FormActivate(Sender: TObject);
    procedure editalbumChange(Sender: TObject);
    function loadalbum  : string;
    procedure savealbum;
    procedure gridSetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    procedure discardClick(Sender: TObject);
    procedure saveClick(Sender: TObject);
    procedure OKClick(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure pastefrontClick(Sender: TObject);
    procedure loadfrontClick(Sender: TObject);
    procedure pasterearClick(Sender: TObject);
    procedure pasteinsideClick(Sender: TObject);
    procedure pastadditionalClick(Sender: TObject);
    procedure loadrearClick(Sender: TObject);
    procedure loadinsideClick(Sender: TObject);
    procedure loadadditionalClick(Sender: TObject);
    procedure editgenreClick(Sender: TObject);
    procedure editartistClick(Sender: TObject);
    procedure lbyearChange(Sender: TObject);
    procedure savealbuminfoClick(Sender: TObject);
    procedure compilationClick(Sender: TObject);
    procedure infoChange(Sender: TObject);
    procedure discardalbuminfoClick(Sender: TObject);
    procedure CloseformClick(Sender: TObject);
    procedure prevClick(Sender: TObject);
    procedure nextClick(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure notesChange(Sender: TObject);
    procedure acquirefrontClick(Sender: TObject);
    procedure acquirerearClick(Sender: TObject);
    procedure acquireinsideClick(Sender: TObject);
    procedure acquireadditionalClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function showtitleedit(albumindex : integer) : integer; export;

var
  editinfo: Teditinfo;
  isedited : boolean;
  resp : integer;
  havesaved : boolean;
  workingdir : string;
  info : tinfo;
  havewrittensomeinfo : boolean = false;

procedure fillcontrols;
procedure goclipboard(img : timage);
procedure gofileload(img : timage);
procedure setlb(i : string;lb : tcombobox);overload;
procedure setlb(i : integer;lb : tcombobox);overload;


implementation
uses main;

{$R *.DFM}

procedure infohaschanged;
begin
editinfo.savealbuminfo.enabled:=true;
end;

procedure setlb(i : string;lb : tcombobox);overload;
var
n : integer;
begin
if i='0' then begin
   lb.itemindex:=0;
   exit;
end;
for n:=0 to lb.items.count-1 do begin
    if lb.items[n]=i then begin lb.itemindex:=n;break;end;
end;
end;

procedure setlb(i : integer;lb : tcombobox);overload;
var
n : integer;
v : integer;
begin
if i=0 then begin
   lb.itemindex:=0;
   exit;
end;
for n:=1 to lb.items.count-1 do begin
    v:=strtoint(copy(lb.items[n],1,4));
    if  v=i then begin lb.itemindex:=n;break;end;
end;

end;

procedure goclipboard(img : timage);
begin
if clipboard.hasformat(CF_BITMAP) then begin
img.Picture.assign(clipboard);
editinfo.infochange(nil);
end;
end;

 {
procedure goacquire(img : timage);
var
temppath : array[0..255] of char;
tempfilename : array[0..255] of char;
fn : string;
f : textfile;
r : dword;
//imgscan : TImgScan;

begin
//imgscan:=nil;
try
//imgscan:=Timgscan.create(editinfo);
except;
messagedlg('You need to install the Windows Imaging component (Add Remove Programs -> Windows Setup -> Accessories -> Imaging) before you can use the "Acquire from Scanner".',mtError,[mbOk],0);
editinfo.acquirefront.enabled:=false;
editinfo.acquirerear.enabled:=false;
editinfo.acquireinside.enabled:=false;
editinfo.acquireadditional.enabled:=false;

exit;
end;
GetTempPath(sizeof(temppath),temppath);
GetTempFileName(temppath,'emp',0,TempFileName);
deletefile(tempfilename);
fn:=strpas(tempfilename);
if //ImgScan.ScannerAvailable then
  try
    //r:=ImgScan.ShowSelectScanner;
    if r<>0 then begin
     exit;
    end;

    //r:=ImgScan.OpenScanner;
    if r<>0 then begin
     exit;
    end;
    //ImgScan.FileType:=3;
    //ImgScan.ScanTo := 2;
    //ImgScan.Image:=fn;


    //r:=ImgScan.StartScan;
    Application.ProcessMessages;
  finally
    //ImgScan.CloseScanner ;
    //imgscan.free;
  //end;

try
assignfile(f,fn);
if fileexists (fn) then begin
rename(f,fn+'.bmp');
try
img.picture.loadfromfile(fn+'.bmp');
except
end;
deletefile(fn+'.bmp');
end;
except
end;
editinfo.infochange(nil);
end;
}

procedure gofileload(img : timage);
var
bm : tbitmap;
jp : tjpegimage;
ty : string;
begin
editinfo.od.filter:=GraphicFilter(TGraphic);
if editinfo.od.Execute=true then begin
  if fileexists(editinfo.od.filename)=true then begin
   ty:=uppercase(copy(editinfo.od.filename,length(editinfo.od.filename)-2,3));
    if (ty='JPEG') or (ty='JPG') then begin
     jp:=tjpegimage.create;
     try
       jp.loadfromfile(editinfo.od.filename);
     except
       messagedlg('Error loading JPEG picture file.',mtError,[MbOK],0);
       jp.free;
       exit;
     end;
    img.picture.bitmap.assign(jp);
    jp.free;
   end;
if (ty='BMP')then begin
     bm:=tbitmap.create;
     try
       bm.loadfromfile(editinfo.od.filename);
     except
       messagedlg('Error loading BMP picture file.',mtError,[MbOK],0);
       bm.free;
       exit;
     end;
    img.picture.bitmap.assign(bm);
    bm.free;
   end;
end;
editinfo.infochange(nil);
end;

end;

function showtitleedit(albumindex : integer) : integer; export;
var
oldcurrentalbumpath : string;
olddcurrentalbumpath : string;
freespace,scrap : int64;
begin
result:=-1;
editinfo := Teditinfo.Create(Application);
try
      freespace:=0;
      getdiskfreespaceex(pchar(config.path),freespace,scrap,nil);
      if freespace=0 then begin
      messagedlg('Cannot edit album information. There is no free disk space in the path "'+config.path+'". If the device is not Read Only (eg. a CDROM), free up some disk space.',mtError,[mbOk],0);
      exit;
      end;

      oldcurrentalbumpath :=currentalbumpath;
      olddcurrentalbumpath :=dcurrentalbumpath;
      loadoriginallist;
      editinfo.ShowModal;
      finally
      currentalbumpath:=oldcurrentalbumpath;
      dcurrentalbumpath:=olddcurrentalbumpath;
      result:=resp;
      editinfo.Free;
  end;

end;

procedure Teditinfo.FormActivate(Sender: TObject);
begin
panel1.doublebuffered:=true;
panel2.doublebuffered:=true;
panel3.doublebuffered:=true;
info.rear:=tbitmap.create;
info.inside:=tbitmap.create;
info.additional:=tbitmap.create;
havesaved:=false;
editalbum.items:=mainform.albumlist.items;
editalbum.itemindex:=mainform.albumlist.itemindex;
grid.colwidths[0]:=30;
grid.colwidths[1]:=grid.width-60;
isedited:=false;
workingdir:=loadalbum;
pagecontrol.activepage:=titles_sheet;
fillcontrols;
editalbumChange(nil);
end;

procedure Teditinfo.editalbumChange(Sender: TObject);
var
o : tbitmap;
begin
o:=nil;
if editalbum.itemindex=0 then prev.enabled:=false else prev.enabled:=true;
if editalbum.itemindex=editalbum.items.count-1 then next.enabled:=false else next.enabled:=true;
if savealbuminfo.enabled=true then begin
if messagedlg('Changes made to album information. Save Changes?',mtConfirmation,[mbYes,mbNo],0)=mrYes then savealbuminfoclick(nil);
end;

if save.enabled=true then begin
if messagedlg('Changes made to track information. Save Changes?',mtConfirmation,[mbYes,mbNo],0)=mrYes then saveClick(nil);
end;

workingdir:=loadalbum;
loadjpegbmp(workingdir,o);
front.picture.bitmap.assign(o);
o.free;
info_openrecord(workingdir,info,true);
setlb(info.genre,lbgenre);
setlb(info.artist_type,lbartist);
setlb(info.year,lbyear);
setlb(info.decade,lbdecade);
description.text:=info.description;
recordlabel.text:=info.recordlabel;
if info.compilation=false then compilation.checked:=false else compilation.checked:=true;
keywords.text:=info.keywords;
rear.Picture.bitmap.assign(nil);
inside.Picture.bitmap.assign(nil);
additional.Picture.bitmap.assign(nil);
rear.Picture.bitmap.assign(info.rear);
inside.Picture.bitmap.assign(info.inside);
additional.Picture.bitmap.assign(info.additional);
notes.text:=info.notes;
catno.text:=info.catno;
urlalbum.text:=info.urlalbum;
urlartist.text:=info.urlartist;
urladditional.text:=info.urladditional;

savealbuminfo.enabled:=false;
discardalbuminfo.enabled:=false;
end;

function Teditinfo.loadalbum : string;
var
content : textfile;
spp : string;
tracknm : integer;
attr : integer;
begin
save.enabled:=false;
discard.enabled:=false;
  grid.rowcount:=0;
  AssignFile(content,config.path+album[editalbum.itemindex+1].artist+'__'+album[editalbum.itemindex+1].album+'\title.dat');
  currentalbumpath:=config.path+spp;
  Reset(content);
              tracknm:=0;
                     While (NOT EOF(content)) do begin
                    grid.rowcount:=grid.rowcount+1;
                    Readln (content,spp);
                    grid.cells[1,tracknm]:=spp;
                    str(tracknm+1,spp);
                    grid.cells[0,tracknm]:=spp;
                    tracknm:=tracknm+1;
                    end;
                    grid.rowcount:=grid.rowcount-1;
CloseFile(content);
attr:=filegetattr(config.path+album[editalbum.itemindex+1].artist+'__'+album[editalbum.itemindex+1].album+'\title.dat');
if (attr and fareadonly)=0 then begin
   grid.enabled:=true;
   readonly.visible:=false;

   end
else begin
    readonly.visible:=true;
    grid.enabled:=false;
    end;
result:=config.path+album[editalbum.itemindex+1].artist+'__'+album[editalbum.itemindex+1].album;
end;




procedure Teditinfo.gridSetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: String);
begin
isedited:=true;
save.enabled:=true;
discard.enabled:=true;
end;

procedure Teditinfo.discardClick(Sender: TObject);
begin
loadalbum;
end;

procedure teditinfo.savealbum;
var
content : textfile;
spp : string;
tracknm : integer;
begin
save.enabled:=false;
discard.enabled:=false;
isedited:=false;
havesaved:=true;
  AssignFile(content,config.path+album[editalbum.itemindex+1].artist+'__'+album[editalbum.itemindex+1].album+'\title.dat');
  currentalbumpath:=config.path+spp;
  Rewrite(content);
              tracknm:=0;
              While (tracknm<grid.rowcount) do begin
                    Writeln (content,grid.cells[1,tracknm]);
                    tracknm:=tracknm+1;
                    end;
                    CloseFile(content);


end;


procedure Teditinfo.saveClick(Sender: TObject);
begin
savealbum;
end;


procedure Teditinfo.OKClick(Sender: TObject);
begin
if havesaved=true then resp:=1 else resp:=0;
end;


procedure Teditinfo.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
//mainform.Options.checked:=false;
editalbumchange(nil);
screen.cursor:=crHourglass;
close;
application.processmessages;
if havewrittensomeinfo=true then loadalbuminformation;
mainform.albumlistchange(nil);
mainform.dalbumlistchange(nil);
screen.cursor:=crDefault;
end;

procedure Teditinfo.pastefrontClick(Sender: TObject);
begin
goclipboard(front);
end;

procedure Teditinfo.loadfrontClick(Sender: TObject);
begin
gofileload(front);
end;

procedure Teditinfo.pasterearClick(Sender: TObject);
begin
goclipboard(rear);
end;

procedure Teditinfo.pasteinsideClick(Sender: TObject);
begin
goclipboard(inside);
end;

procedure Teditinfo.pastadditionalClick(Sender: TObject);
begin
goclipboard(additional);
end;

procedure Teditinfo.loadrearClick(Sender: TObject);
begin
gofileload(rear);
end;

procedure Teditinfo.loadinsideClick(Sender: TObject);
begin
gofileload(inside);
end;

procedure Teditinfo.loadadditionalClick(Sender: TObject);
begin
gofileload(additional);
end;

procedure Teditinfo.editgenreClick(Sender: TObject);
begin
editalbumchange(nil);
editdynamiclist('Edit genre list','Genre',genre);
fillcontrols;
editalbumchange(nil);

end;

procedure Teditinfo.editartistClick(Sender: TObject);
begin
editalbumchange(nil);
editdynamiclist('Edit artist type list','Type',artisttype);
fillcontrols;
editalbumchange(nil);
end;

procedure fillcontrols;
var
n,y,m,d : word;
begin
with editinfo do begin
   lbgenre.clear;
   lbgenre.items.add('Not Defined');
   lbartist.clear;
   lbartist.items.add('Not Defined');
   if genre.count>0 then for n:=0 to genre.count-1 do lbgenre.items.add(genre.data[n]);
   if artisttype.count>0 then for n:=0 to artisttype.count-1 do lbartist.items.add(artisttype.data[n]);
   lbgenre.itemindex:=0;
   lbartist.itemindex:=0;

   decodedate(now,y,m,d);
   lbyear.clear;
   lbyear.items.add('Not Defined');
   for n:=y downto 1500 do lbyear.items.add(inttostr(n));
   lbyear.itemindex:=0;

   lbdecade.clear;
   lbdecade.items.add('Not Defined');
   m:=1;
   for n:=y downto 1500 do begin
    d:=trunc(n/10)*10;
    if m<>d then lbdecade.items.add(inttostr(d)+chr(39)+'s');
    m:=d;
   end;
   lbdecade.itemindex:=0;
end;
end;

procedure Teditinfo.lbyearChange(Sender: TObject);
var
d,n : integer;
begin
if lbyear.items[lbyear.itemindex]='Not Defined' then begin
lbdecade.itemindex:=0;
exit;
end;
infochange(nil);


d:=trunc(strtoint((lbyear.Items[lbyear.itemindex]))/10)*10;
for n:=1 to lbdecade.Items.count-1 do if d=strtoint(copy(lbdecade.items[n],1,4)) then begin
         lbdecade.itemindex:=n;
         break;
         end;
end;

procedure Teditinfo.savealbuminfoClick(Sender: TObject);
var
jpg : tjpegimage;
begin
havewrittensomeinfo :=true;
   with info do begin
     if lbgenre.items[lbgenre.Itemindex]='Not Defined' then genre:='0' else genre:=lbgenre.items[lbgenre.Itemindex];
     if lbartist.items[lbartist.Itemindex]='Not Defined' then artist_type:='0' else artist_type:=lbartist.items[lbartist.Itemindex];
     if lbyear.items[lbyear.Itemindex]='Not Defined' then year:=0 else year:=strtoint(lbyear.items[lbyear.Itemindex]);
     if lbdecade.items[lbdecade.Itemindex]='Not Defined' then decade:=0 else decade:=strtoint(copy(lbdecade.items[lbdecade.Itemindex],1,4));
     description :=editinfo.description.text;
     recordlabel :=editinfo.recordlabel.text;
     if editinfo.compilation.checked=true then compilation :=true else compilation:=false;
     keywords :=editinfo.keywords.text;

     info.rear.assign(editinfo.rear.Picture.bitmap);
     info.inside.assign(editinfo.inside.Picture.bitmap);
     info.additional.assign(editinfo.additional.Picture.bitmap);
     notes:=editinfo.notes.text;
     catno:=editinfo.catno.text;
     urlartist:=editinfo.urlartist.text;
     urlalbum:=editinfo.urlalbum.text;
     urladditional:=editinfo.urladditional.text;
  end;


jpg:=tjpegimage.create;
jpg.assign(front.picture.bitmap);
jpg.compress;
jpg.savetofile(workingdir+'\title.jpg');
if info_saverecord(workingdir,info)=0 then begin
savealbuminfo.enabled:=false;
discardalbuminfo.enabled:=false;
end;

end;

procedure Teditinfo.compilationClick(Sender: TObject);
begin
infochange(nil);
end;

procedure Teditinfo.infoChange(Sender: TObject);
begin
savealbuminfo.enabled:=true;
discardalbuminfo.enabled:=true;
end;

procedure Teditinfo.discardalbuminfoClick(Sender: TObject);
begin
editalbumChange(nil);
end;

procedure Teditinfo.CloseformClick(Sender: TObject);
begin
editinfo.close;
end;

procedure Teditinfo.prevClick(Sender: TObject);
begin
if savealbuminfo.enabled=true then savealbuminfoClick(nil);
editalbum.itemindex:=editalbum.itemindex-1;
editalbumchange(nil);
end;

procedure Teditinfo.nextClick(Sender: TObject);
begin
if savealbuminfo.enabled=true then savealbuminfoClick(nil);
editalbum.itemindex:=editalbum.itemindex+1;
editalbumchange(nil);
end;

procedure Teditinfo.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (key='+') and (next.enabled=true) then begin nextclick(nil); key:=#0; end;
if (key='-') and (prev.enabled=true) then begin prevclick(nil); key:=#0; end;
end;

procedure Teditinfo.notesChange(Sender: TObject);
begin
savealbuminfo.enabled:=true;
discardalbuminfo.enabled:=true;
end;

procedure Teditinfo.acquirefrontClick(Sender: TObject);
begin
//goacquire(front);
end;

procedure Teditinfo.acquirerearClick(Sender: TObject);
begin
//goacquire(rear);
end;

procedure Teditinfo.acquireinsideClick(Sender: TObject);
begin
//goacquire(inside);
end;

procedure Teditinfo.acquireadditionalClick(Sender: TObject);
begin
//goacquire(additional);
end;

end.