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].path+'\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].path+'\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].path.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].path+'\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.