unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  LCLTranslator, DateUtils, LCLType, Classes, SysUtils, FileUtil,
  Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, EditBtn,
  Menus, ActnList, Buttons, ComCtrls, ExtDlgs, Types, Math, ShellApi;

type

  { TForm1 }

  TForm1 = class(TForm)
    Loeschen: TImage;
    SavePictureDialog1: TSavePictureDialog;
    Speichern: TImage;
    SuchFeld: TEdit;
    AnzeigeBild: TImage;
    StartDiaschau: TImage;
    StopDiaschau: TImage;
    VerzeichnisOeffnen: TImage;
    ProgrammEnde: TImage;
    Suchen: TImage;
    Vollbild: TImage;
    ZeitSekunden: TLabel;
    KeineBilder: TLabel;
    AnzeigeOrdner: TLabel;
    AnzeigeSekunden: TLabel;
    SuchFeldOrdner: TLabel;
    ListBoxDateien: TListBox;
    SelectDirectoryDialog1: TSelectDirectoryDialog;
    Timer1: TTimer;
    SchieberSekunden: TTrackBar;
    Zufall: TImage;

    procedure AnzeigeBildDblClick(Sender: TObject);
    procedure AnzeigeBildMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure AnzeigeBildMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure AnzeigeBildMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure ListBoxDateienMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeichernClick(Sender: TObject);
    procedure VollbildClick(Sender: TObject);
    procedure ZufallClick(Sender: TObject);
    procedure LoeschenClick(Sender: TObject);
    procedure ListBoxDateienDblClick(Sender: TObject);
    procedure StartDiaschauClick(Sender: TObject);
    procedure StopDiaschauClick(Sender: TObject);
    procedure SuchFeldKeyPress(Sender: TObject; var Key: char);
    procedure VerzeichnisOeffnenClick(Sender: TObject);
    procedure ProgrammEndeClick(Sender: TObject);
    procedure SuchenClick(Sender: TObject);
    procedure ListBoxDateienClick(Sender: TObject);
    procedure Diaschau(Sender: TObject);
    procedure SchieberSekundenMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private

  public

  end;

var
  Form1: TForm1;
  DateiName : Array of String;
  DateiNameVerzeichnis : Array of String;
  BildBreite: Integer;
  Foto: Tpicture;

implementation
 uses Unit2;
{$R *.lfm}

{ TForm1 }

procedure TForm1.Diaschau(Sender: Tobject);
// IndexListe ist die aktuelle Position in der Listbox
var IndexListe: Integer;

begin
   //  ListBoxDateien.ItemIndex ist der gerade markierte Eintrag
   IndexListe:= ListBoxDateien.ItemIndex;

   // Diaschau soll solange laufen, bis der letzte Eintrag der Liste
   // erreicht ist →  ListBoxDateien.Count - 1
   if IndexListe < ListBoxDateien.Count - 1 then
   begin
      // nach Erhöhen um 1 der IndexListe wird auch der markierte Eintrag
      // der Liste um 1 erhöht
      inc(IndexListe);
      ListBoxDateien.ItemIndex:= IndexListe;
      // das Bild, das zum aktuelle markierten Eintrag gehört
      AnzeigeBild.Width:= BildBreite;
      AnzeigeBild.Height:= 600;
      AnzeigeBild.Proportional:= true;
      AnzeigeBild.Stretch:= true;
      try
         AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
      Except
         ShowMessage('Falsches Bildformat!')
      end;
   end;
end;


procedure TForm1.SchieberSekundenMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Timer1.Enabled := false;
  Timer1.Interval:= SchieberSekunden.Position*1000;
  Timer1.Enabled := true;
  AnzeigeSekunden.Caption:= IntToStr(SchieberSekunden.Position);
end;

procedure TForm1.ListBoxDateienDblClick(Sender: TObject);
var
  indexListe, Zaehler: Integer;
  begin
     if ListBoxDateien.count > 0 then
     begin
        indexListe:=ListBoxDateien.count-1;
        Zaehler:=ListBoxDateien.ItemIndex;
        Form2.BildZeigen.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
        Form2.DateiName.caption:=ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex];
        Foto := TPicture.Create;
        Foto.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);

        Form2.OriginalGroesse.Caption:= 'Originalgröße: '+ IntToStr(Foto.Width)+' x ' + IntToStr(Foto.Height);
        Form2.GroesseKB.caption:='Dateigröße: ' + FloatToStr(RoundTo(FileSize(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex])/1024,0)) + ' kb';

        Form2.BildZeigen.width:=Screen.Width-150;
        Form2.BildZeigen.Height:=Screen.Height-150;
        Form2.BildZeigen.Proportional:= true;
        Form2.BildZeigen.Stretch:= true;
        Form2.show;
     end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  SetDefaultLang('de');
  SuchFeldOrdner.Caption:= 'Suchen in: ' + GetCurrentDir;
  AnzeigeBild.Hint:= 'Mausrad → Größe ändern';// +#13#10 + 'Rechte Maustaste: Öffnen mit ...';
  AnzeigeBild.ShowHint:= true;
  VerzeichnisOeffnen.Hint:= 'Verzeichnis öffnen';
  VerzeichnisOeffnen.ShowHint:= true;
  StartDiaschau.Hint:= 'Diaschau starten';
  StartDiaschau.ShowHint:= true;
  StopDiaschau.Hint:= 'Diaschau stoppen';
  StopDiaschau.ShowHint:= true;
  ProgrammEnde.Hint:= 'Programm beenden';
  ProgrammEnde.ShowHint:= true;
  Suchen.Hint:= 'Suchen';
  Suchen.ShowHint:= true;
  Loeschen.Hint:= 'Datei löschen';
  Loeschen.ShowHint:= true;
  Zufall.Hint:= 'Zufälliges Bild';
  Zufall.ShowHint:= true;
  Speichern.Hint:= 'Datei speichern unter';
  Speichern.ShowHint:= true;
  Vollbild.Hint:= 'Bild im neuen Fenster';
  Vollbild.ShowHint:= true;
  // Bildbreite beim Start
  BildBreite:= 800;
  Randomize;
end;

procedure TForm1.ListBoxDateienMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if (Button = mbRight) then
   begin;
      // nur Windows
      if ShellExecute(0, 'open', PChar('rundll32.exe'), PChar('shell32.dll,OpenAs_RunDLL ' + DateiNameVerzeichnis[ListBoxDateien.ItemIndex]), nil, SW_SHOWNORMAL) <= 32 then ShowMessage('Es ist ein Fehler aufgetreten');
   end;
end;

procedure TForm1.SpeichernClick(Sender: TObject);
var
  Zaehler: Integer;
  suchErgebnis : TSearchRec;
begin
  // nur wenn Dateien angezeigt werden
  if ListBoxDateien.Count > 0 then
  begin
     SavePictureDialog1.Filter := 'Bilder|*.jpg';
     SavePictureDialog1.DefaultExt:='jpg';
     if savePictureDialog1.Execute
     then AnzeigeBild.Picture.SaveToFile(SavePictureDialog1.FileName);

      Zaehler:= 0;
      ListBoxDateien.Clear;
      if FindFirst('*.jpg', faAnyFile, suchErgebnis) = 0 then
      begin
         repeat
         begin
            SetLength(DateiName, zaehler + 1);
            SetLength(DateiNameVerzeichnis, zaehler + 1);
            DateiName[zaehler]:= suchErgebnis.Name;
            DateiNameVerzeichnis[zaehler]:= GetCurrentDir+'\'+suchErgebnis.Name;
            ListBoxDateien.Items.Add(DateiName[zaehler]);
            inc(zaehler);
         end;
         until FindNext(suchErgebnis) <> 0;
         FindClose(suchErgebnis);
         end;
         // erstes Bild anzeigen
         if zaehler > 0 then
         begin
           KeineBilder.Visible:= false;
           ListBoxDateien.ItemIndex:=0;
           AnzeigeBild.Width:= 800;
           AnzeigeBild.Height:= 600;
           AnzeigeBild.Proportional:= true;
           AnzeigeBild.Stretch:= true;

           try
              AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
           Except
              ShowMessage('Falsches Bildformat!')
           end;

           StartDiaschau.Visible:= true;
           StopDiaschau.Visible:= true;
           AnzeigeSekunden.Visible:= true;
           AnzeigeOrdner.Caption:= GetCurrentDir;
         end
         else
         begin
            // keine Bilder vorhanden
            // Elemente ausblenden -> Label Keine Bilder zeigen
            KeineBilder.Visible:= true;
            StartDiaschau.Visible:= false;
            StopDiaschau.Visible:= false;
            AnzeigeSekunden.Visible:= false;
            ZeitSekunden.Visible:= false;
            AnzeigeOrdner.Visible:= false;
            SchieberSekunden.Visible:= false;
            AnzeigeBild.Picture:= nil;
         end;
   end;
end;

procedure TForm1.VollbildClick(Sender: TObject);
var
  indexListe, Zaehler: Integer;
begin
  if ListBoxDateien.count > 0 then
  begin
     indexListe:=ListBoxDateien.count-1;
     Zaehler:=ListBoxDateien.ItemIndex;
     Form2.BildZeigen.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
     Form2.DateiName.caption:=ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex];
     Foto := TPicture.Create;
     Foto.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);

     Form2.OriginalGroesse.Caption:= 'Originalgröße: '+ IntToStr(Foto.Width)+' x ' + IntToStr(Foto.Height);
     Form2.GroesseKB.caption:='Dateigröße: ' + FloatToStr(RoundTo(FileSize(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex])/1024,0)) + ' kb';

     Form2.BildZeigen.width:=Screen.Width-150;
     Form2.BildZeigen.Height:=Screen.Height-150;
     Form2.BildZeigen.Proportional:= true;
     Form2.BildZeigen.Stretch:= true;
     Form2.show;
  end;
end;

procedure TForm1.ZufallClick(Sender: TObject);
var
  ZufallsZahl, NummerIndex: Integer;
begin
    if ListBoxDateien.Count>1 then
  begin
    ZufallsZahl:=0;
    //while ZufallsZahl=0 do
     begin
       ZufallsZahl:= Random(ListBoxDateien.Count-1);
      // Nummer des Items bestimmen
      NummerIndex := ListBoxDateien.Items.IndexOf(DateiName[ZufallsZahl]);
      ListBoxDateien.ItemIndex:=NummerIndex;
      try
        AnzeigeBild.Picture.LoadFromFile(DateiName[ZufallsZahl]);
      Except
        ShowMessage('Falsches Bildformat!')
      end;

      // AnzeigeDateiname.Caption:=DateiName[ZufallsZahl];

     end;
  end;
end;

procedure TForm1.LoeschenClick(Sender: TObject);
var
  Antwort, indexListe, LetztesBild: Integer;
begin
  if ListBoxDateien.count>0 then
  begin
     Antwort := MessageDlg('Bestätigung','Datei '+ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]+' löschen?', mtConfirmation, [mbYes, mbNo], 0,mbNo);
     If Antwort= mrYes then
     begin
        LetztesBild:= ListBoxDateien.ItemIndex - 1;
        if LetztesBild < 0 then LetztesBild := 0;
        DeleteFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
        ListBoxDateien.Items.Delete(ListBoxDateien.ItemIndex);

        indexListe:=ListBoxDateien.count;

        if indexListe >0 then
        begin
           dec(indexListe);
           try
              AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[LetztesBild]);
           Except
              ShowMessage('Falsches Bildformat!')
           end;
           //AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[indexListe]);
           ListBoxDateien.Selected[LetztesBild]:=True;
        end

       else
       begin
         KeineBilder.visible:=true;
         AnzeigeBild.Picture:= NIL;
       end;
     end;
  end;
end;


procedure TForm1.AnzeigeBildMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if (Button = mbRight) then
   begin;
     // nur Windows
     if ShellExecute(0, 'open', PChar('rundll32.exe'), PChar('shell32.dll,OpenAs_RunDLL ' + DateiNameVerzeichnis[ListBoxDateien.ItemIndex]), nil, SW_SHOWNORMAL) <= 32 then ShowMessage('Es ist ein Fehler aufgetreten');
   end;
end;

procedure TForm1.AnzeigeBildDblClick(Sender: TObject);
var
  indexListe, Zaehler: Integer;
  begin
     if ListBoxDateien.count > 0 then
     begin
        indexListe:=ListBoxDateien.count-1;
        Zaehler:=ListBoxDateien.ItemIndex;
        Form2.BildZeigen.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
        Form2.DateiName.caption:=ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex];
        Foto := TPicture.Create;
        Foto.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);

        Form2.OriginalGroesse.Caption:= 'Originalgröße: '+ IntToStr(Foto.Width)+' x ' + IntToStr(Foto.Height);
        Form2.GroesseKB.caption:='Dateigröße: ' + FloatToStr(RoundTo(FileSize(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex])/1024,0)) + ' kb';

        Form2.BildZeigen.width:=Screen.Width-150;
        Form2.BildZeigen.Height:=Screen.Height-150;
        Form2.BildZeigen.Proportional:= true;
        Form2.BildZeigen.Stretch:= true;
        Form2.show;
     end;
end;

procedure TForm1.AnzeigeBildMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
   if AnzeigeBild.Width> 200 then
   begin
     AnzeigeBild.Width:=AnzeigeBild.Width - 10;
   end;
   BildBreite:= AnzeigeBild.Width;
end;

procedure TForm1.AnzeigeBildMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
   if AnzeigeBild.Width < 800 then
   begin
     AnzeigeBild.Width:= AnzeigeBild.Width + 10;
   end;
   BildBreite:= AnzeigeBild.Width;
end;

procedure TForm1.StartDiaschauClick(Sender: TObject);
begin
  Timer1.Enabled:= true;
  SchieberSekunden.Visible:= true;
  ZeitSekunden.Visible:= true;
  AnzeigeSekunden.Visible:= true;
  AnzeigeSekunden.Caption:= IntToStr(SchieberSekunden.Position);
end;

procedure TForm1.StopDiaschauClick(Sender: TObject);
begin
  Timer1.Enabled:= false;
  AnzeigeSekunden.Visible:= false;
  ZeitSekunden.Visible:= false;
  SchieberSekunden.Visible:= false;
end;

procedure TForm1.SuchFeldKeyPress(Sender: TObject; var Key: char);
var
  Suche: String;
  Zaehler: Integer;
  suchErgebnis : TSearchRec;
begin
   if key=#13 then

   begin
      Suche:= SuchFeld.Text;
      Zaehler:= 0;
      ListBoxDateien.Clear;
      if FindFirst('*' + Suche + '*.jpg', faAnyFile, suchErgebnis) = 0 then
      begin
         repeat
         begin
            SetLength(DateiName, zaehler + 1);
            SetLength(DateiNameVerzeichnis, zaehler + 1);
            DateiName[zaehler]:= suchErgebnis.Name;
            DateiNameVerzeichnis[zaehler]:= GetCurrentDir+'\'+suchErgebnis.Name;
            ListBoxDateien.Items.Add(DateiName[zaehler]);
            inc(zaehler);
         end;
         until FindNext(suchErgebnis) <> 0;
         FindClose(suchErgebnis);
         end;
         // erstes Bild anzeigen
         if zaehler > 0 then
         begin
           KeineBilder.Visible:= false;
           ListBoxDateien.ItemIndex:=0;
           AnzeigeBild.Width:= 800;
           AnzeigeBild.Height:= 600;
           AnzeigeBild.Proportional:= true;
           AnzeigeBild.Stretch:= true;

           try
              AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
           Except
              ShowMessage('Falsches Bildformat!')
           end;

           StartDiaschau.Visible:= true;
           StopDiaschau.Visible:= true;
           AnzeigeSekunden.Visible:= true;
           AnzeigeOrdner.Caption:= GetCurrentDir;
         end
         else
         begin
            // keine Bilder vorhanden
            // Elemente ausblenden -> Label Keine Bilder zeigen
            KeineBilder.Visible:= true;
            StartDiaschau.Visible:= false;
            StopDiaschau.Visible:= false;
            AnzeigeSekunden.Visible:= false;
            ZeitSekunden.Visible:= false;
            AnzeigeOrdner.Visible:= false;
            SchieberSekunden.Visible:= false;
            AnzeigeBild.Picture:= nil;
         end;
   end;
end;


procedure TForm1.VerzeichnisOeffnenClick(Sender: TObject);
var
  suchErgebnis : TSearchRec;
  zaehler: Integer;
  Verzeichnis: String;
begin

  if SelectDirectory('Wähle ein Verzeichnis', '', Verzeichnis) then
  begin
     SetCurrentDir(Verzeichnis);
     zaehler:= 0;
     ListBoxDateien.Clear;
     if FindFirst('*.jpg', faAnyFile, suchErgebnis) = 0 then
     begin
        repeat
        begin
           SetLength(DateiName, zaehler + 1);
           SetLength(DateiNameVerzeichnis, zaehler + 1);
           DateiName[zaehler]:= suchErgebnis.Name;
           DateiNameVerzeichnis[zaehler]:= GetCurrentDir+'\'+suchErgebnis.Name;
           ListBoxDateien.Items.Add(DateiName[zaehler]);
           inc(zaehler);
        end;
        until FindNext(suchErgebnis) <> 0;
        FindClose(suchErgebnis);
    end;
    // erstes Bild anzeigen
    if zaehler > 0 then
    begin
      KeineBilder.Visible:= false;
      AnzeigeOrdner.Caption:= Verzeichnis;
      SuchFeldOrdner.Caption:= 'Suchen in: ' + Verzeichnis;
      ListBoxDateien.ItemIndex:=0;
      AnzeigeBild.Width:= 800;
      AnzeigeBild.Height:= 600;
      AnzeigeBild.Proportional:= true;
      AnzeigeBild.Stretch:= true;
      try
         AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
      Except
         ShowMessage('Falsches Bildformat!')
      end;
      StartDiaschau.Visible:= true;
      StopDiaschau.Visible:= true;
      AnzeigeSekunden.Visible:= true;
    end
    else
    begin
       // keine Bilder vorhanden
       // Elemente ausblenden
       KeineBilder.Visible:= true;
       StartDiaschau.Visible:= false;
       StopDiaschau.Visible:= false;
       AnzeigeSekunden.Visible:= false;
       ZeitSekunden.Visible:= false;
       AnzeigeOrdner.Visible:= false;
       SchieberSekunden.Visible:= false;
       AnzeigeBild.Picture:= nil;
    end;
  end;
end;

procedure TForm1.ProgrammEndeClick(Sender: TObject);
var
  Antwort:Integer;
begin
  Antwort := MessageDlg('Bestätigung','Programm beenden?', mtConfirmation, [mbYes, mbNo], 0,mbNo);
  If Antwort= mrYes then  Application.Terminate;
end;

procedure TForm1.SuchenClick(Sender: TObject);
var
  Suche: String;
  Zaehler: Integer;
  suchErgebnis : TSearchRec;
begin
   Suche:= SuchFeld.Text;
   Zaehler:= 0;
   ListBoxDateien.Clear;
     if FindFirst('*' + Suche + '*.jpg', faAnyFile, suchErgebnis) = 0 then
     begin
        repeat
        begin
           SetLength(DateiName, zaehler + 1);
           DateiName[zaehler]:= suchErgebnis.Name;
           ListBoxDateien.Items.Add(DateiName[zaehler]);
           inc(zaehler);
        end;
        until FindNext(suchErgebnis) <> 0;
        FindClose(suchErgebnis);
    end;
    // erstes Bild anzeigen
    if zaehler > 0 then
    begin
      KeineBilder.Visible:= false;
      ListBoxDateien.ItemIndex:=0;
      AnzeigeBild.Width:= 800;
      AnzeigeBild.Height:= 600;
      AnzeigeBild.Proportional:= true;
      AnzeigeBild.Stretch:= true;
      try
         AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
      Except
         ShowMessage('Falsches Bildformat!')
      end;
      StartDiaschau.Visible:= true;
      StopDiaschau.Visible:= true;
      AnzeigeSekunden.Visible:= true;
    end
    else
    begin
       // keine Bilder vorhanden
       // Elemente ausblenden -> Label Keine Bilder zeigen
       KeineBilder.Visible:= true;
       StartDiaschau.Visible:= false;
       StopDiaschau.Visible:= false;
       AnzeigeSekunden.Visible:= false;
       ZeitSekunden.Visible:= false;
       AnzeigeOrdner.Visible:= false;
       SchieberSekunden.Visible:= false;
       AnzeigeBild.Picture:= nil;
    end;
end;

procedure TForm1.ListBoxDateienClick(Sender: TObject);
begin
   if ListBoxDateien.count > 0 then
   begin
     try
        AnzeigeBild.Picture.LoadFromFile(ListBoxDateien.Items.Strings[ListBoxDateien.ItemIndex]);
     Except
       ShowMessage('Falsches Bildformat!')
     end;
   end;
end;

end.
