unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, MPlayer, Menus, ExtCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    PopupMenu1: TPopupMenu;
    LeereListe1: TMenuItem;
    Alphsortieren1: TMenuItem;
    neuelisten1: TMenuItem;
    ListBox2: TListBox;
    Suchen1: TMenuItem;
    FindDialog1: TFindDialog;
    Panel1: TPanel;
    AudioCDhinzufgen1: TMenuItem;
    procedure FormShow(Sender: TObject);
    procedure LeereListe1Click(Sender: TObject);
    procedure Alphsortieren1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ListBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure neuelisten1Click(Sender: TObject);
    procedure ListBox1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    procedure ListBox1EndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure Suchen1Click(Sender: TObject);
    procedure FindDialog1Find(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure AudioCDhinzufgen1Click(Sender: TObject);
  private
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public-Deklarationen}
  end;

const
  maxChar='d';

const

  ModeStr: array[TMPModes] of string = ('Nicht bereit', 'Stop', 'Wiedergabe', 'Aufnahme', 'Suchen', 'Pause', 'Geöffnet');

var
  Form1: TForm1;
  x1:Array['a'..maxChar]of word;
  maus:boolean;
  mausx,mausy,lpos1,lpos2:integer;
  selfstarted:boolean;

implementation

uses ShellAPI, Unit2;

{$R *.DFM}

procedure ls;
begin
lpos1:=form1.listbox1.topindex;
lpos2:=form2.listbox1.topindex;
end;

procedure le;
begin
form1.listbox1.topindex:=lpos1;
form2.listbox1.topindex:=lpos2;
end;

procedure ladedatei(Name:String);
var
datei:text;
temp1,temp2:string[128];
posi,zahl:word;
zaehler:char;
begin
ls;
assign(datei,name);
reset(datei);
readln(datei,temp1);
if(temp1[1]='#')then
  begin
  form1.listbox1.sorted:=false;
  form1.Alphsortieren1.checked:=false;
  while not eof(datei) do
  begin
    readln(datei,temp1);
    delete(temp1,1,pos(',',temp1));
    readln(datei,temp2);
    zahl:=pos('(x1',temp1)+3;
    if(zahl=3)then
      posi:=form1.listbox1.items.count-1 else
      begin
      posi:=x1[temp1[zahl]];
      for zaehler:=temp1[zahl] to maxChar do
        inc(x1[zaehler]);
      delete(temp1,zahl-3,5);
      end;
    with form1 do
      begin
      while(length(temp1)<124)do
        temp1:=temp1+' ';
      temp1:=temp1+'#>';
      listbox1.items.insert(posi,temp1+temp2);
      end;
    end;
    form1.caption:=inttostr(form1.listbox1.items.count)+' Songs; bitte per Drag&Drop hinzufügen!';
  end;
close(datei);
le;
end;

procedure leereArray;
var
  zaehler:char;
begin
  for zaehler:='a' to maxChar do
    x1[zaehler]:=0;
end;

procedure addmp3(Name:String);
var
koord:TPoint;
temp:string;
begin
with form1 do
  begin
  koord.x:=mouse.cursorpos.x-left-listbox1.left-5;
  koord.y:=mouse.cursorpos.y-top-listbox1.top-24;
  end;
ls;
temp:=extractfilename(Name);
delete(temp,length(temp)-3,4);
while(length(temp)<124)do
  temp:=temp+' ';
temp:=temp+'#>'+Name;
with form1 do
  begin
  listbox1.items.insert(listbox1.itematpos(koord,false),temp);
  end;
le;
end;

procedure ladeverz(dat:String);
Var
SearchRec:TSearchRec;
temp:string;
begin
if(extractfileext(dat)='.mp3')then
  addmp3(dat)else
  if(extractfileext(dat)='')then
    begin
    chdir(dat);
    getdir(0,temp);
    temp:=temp+'\';
    if(findfirst(dat+'\*.',$00000010,SearchRec)=0)then;
      begin
      ladeverz(temp+SearchRec.Name);
      while(findnext(SearchRec)=0)do
        ladeverz(temp+SearchRec.Name);
      end;
    findclose(SearchRec);
    if(findfirst(dat+'\*.mp3',$0000003F,SearchRec)=0)then
      begin
      ladeverz(temp+SearchRec.Name);
      while(findnext(SearchRec)=0)do
        ladeverz(temp+SearchRec.Name);
      end;
    findclose(SearchRec);
    end;
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  CFileName: array[0..MAX_PATH] of Char;
begin
  try
    if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
    begin
      if(uppercase(extractfileext(Cfilename))='.MP3')then
        addmp3(CFileName) else
        if(uppercase(extractfileext(CFilename))='.M3U')then
          begin
          if not(neueListen1.Checked)then
          listbox1.Clear;
          leereArray;
          ladedatei(CFileName);
          end else
          if(extractfileext(CFileName)='')and(extractfilepath(CFileName)<>'')then
            ladeVerz(CFileName);
      Msg.Result := 0;
    end;
  finally
    DragFinish(Msg.Drop);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

procedure TForm1.LeereListe1Click(Sender: TObject);
begin
  listbox1.Clear;
  leereArray;
end;

procedure TForm1.Alphsortieren1Click(Sender: TObject);
begin
  if Alphsortieren1.checked then
    begin
    listbox1.sorted:=false;
    Alphsortieren1.checked:=false;
    end else
    begin
    listbox1.sorted:=true;
    Alphsortieren1.checked:=true;
    end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  height:=screen.Height-30;
  top:=2;
  left:=2;
  if(paramcount>0)then
    ladedatei(paramstr(1));
end;

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
temp:word;
begin
if(key=46)then
  begin
  ls;
  listbox1.enabled:=false;
  for temp:=listbox1.items.count-1 downto 0 do
    if listbox1.selected[temp] then
      listbox1.items.delete(temp);
  listbox1.enabled:=true;
  le;
  end;
end;

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
lauf:word;
koord:TPoint;
begin
koord.x:=x;
koord.y:=y;
ls;
if(selfstarted)then
  begin
  listbox2.items.clear;
  for lauf:=listbox1.Items.count-1 downto 0 do
    if(listbox1.selected[lauf])then
      begin
      listbox2.items.insert(0,listbox1.items[lauf]);
      listbox1.Items.delete(lauf);
      end;
  for lauf:=0 to listbox2.items.count-1 do
    listbox1.items.insert(listbox1.itematpos(koord,false),listbox2.items[lauf]);
  end else
  begin
  for lauf:=0 to form2.listbox1.items.count-1 do
    if(form2.ListBox1.selected[lauf])then
      listbox1.items.insert(listbox1.itematpos(koord,false),form2.listbox1.items[lauf]);
  for lauf:=form2.listbox1.items.count-1 downto 0 do
    if(form2.listbox1.selected[lauf])then
      form2.listbox1.Items.delete(lauf);
  end;
form1.caption:=inttostr(form1.listbox1.items.count)+' Songs; bitte per Drag&Drop hinzufügen!';
form1.listbox1.itemindex:=-1;
if(form2.alteverschieben1.checked)then
  form2.listbox1.itemindex:=-1 else
  form2.listbox1.itemindex:=playing-1;
le;
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
   Accept:=Source is TListBox;
end;

procedure TForm1.neuelisten1Click(Sender: TObject);
begin
if(neuelisten1.checked)then
  neuelisten1.checked:=false else
  neuelisten1.checked:=true;
end;

procedure TForm1.ListBox1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
var
xy:TPoint;
begin
with sender as TListBox do
  begin
  with form1 do
    begin
    xy.x:=mouse.cursorpos.x-left-listbox1.left-5;
    xy.y:=mouse.cursorpos.y-top-listbox1.top-24;
    end;
  if(itematpos(xy,true)<>-1)then
  begin
  selfstarted:=true;
  form1.listbox1.onDragOver:=form1.ListBox1DragOver;
  form2.listbox1.OnDragOver:=form2.ListBox1DragOver;
  end else
  begin
  form1.listbox1.onDragOver:=nil;
  form2.listbox1.OnDragOver:=nil;
  end;
  end;
end;

procedure TForm1.ListBox1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
selfstarted:=falsE;
end;

procedure TForm1.Suchen1Click(Sender: TObject);
begin
FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
temp,temp2:integer;
gross:string;
begin
if(listbox1.items.count<>0)then
  begin
  temp:=listbox1.TopIndex;
  temp2:=temp;
  gross:=FindDialog1.Findtext;
  gross[1]:=upcase(gross[1]);
  repeat
  inc(temp);
  until(pos(FindDialog1.Findtext,listbox1.items[temp])<>0)or(pos(gross,listbox1.items[temp])<>0)or(temp=listbox1.items.count-1);
  if(pos(FindDialog1.Findtext,listbox1.items[temp])=0)and(pos(gross,listbox1.items[temp])=0)then
    begin
    temp:=0;
    while not((pos(FindDialog1.Findtext,listbox1.items[temp])<>0)or(pos(gross,listbox1.items[temp])<>0)or(temp=temp2))do
      inc(temp);
    end;
  if(pos(FindDialog1.Findtext,listbox1.items[temp])<>0)or(pos(gross,listbox1.items[temp])<>0)then
    begin
    listbox1.TopIndex:=temp;
    listbox1.selected[temp]:=true;;
    end else
    showmessage('Leider erfolglos');
  end;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
popupmenu1.popup(mouse.cursorpos.x,mouse.cursorpos.y);
end;

procedure TForm1.AudioCDhinzufgen1Click(Sender: TObject);
var
lauf:integer;
begin
with form2 do
  begin
  mediaplayer2.open;
  if(mediaplayer2.mode=mpStopped)then
    for lauf:=mediaplayer2.tracks downto 1 do
      form1.listbox1.items.insert(form1.listbox1.topindex,'CD-Track #'+inttostr(lauf)+'  ')
      else
      showmessage('Bitte Audio-CD einlegen und nocheinmal anwählen');
  mediaplayer2.close;
  end;
end;

end.
