unit LastOpenList;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Menus;

type
    TLastOpenList = class
                 private
                        ListFile : string; //Plik z lista ostatnio otwartych

                        ParentItem : ^TMenuItem; //Wskaźnij na obiekt rodzica
                        OnClickProc : TNotifyEvent; //Zdarzenie obslugi gdy kliknieto na element listy ostatnio otwartych
                        
                        MaxCount : integer; //Maksymalna liczba elementow na leiscie
                        
                 public
                         constructor Create(
                                     _ListFile : string;
                                     var _ParentItem : TMenuItem;
                                     _OnClickProc : TNotifyEvent;
                                     _MaxCount : integer );
                         
                         procedure Add(FileName : string); //Dodaje element do listy
                         procedure Load; //tworzy liste
                         
    end;

implementation

constructor TLastOpenList.Create (
           _ListFile : string;
           var _ParentItem : TMenuItem;
           _OnClickProc : TNotifyEvent;
           _MaxCount : integer );
begin
     //Inicjalizcja zmiennych instancji klasy
     ListFile := _ListFile;
     ParentItem := @_ParentItem;
     OnClickProc := _OnClickProc;
     MaxCount := _MaxCount;
end;

procedure TLastOpenList.Add(FileName : string); //Dodaje do listy ostatnio otwartych
var
   Items : TStringList;  //Plik z lista
   i : integer;
   
   NewItem : ^TMenuItem;
begin
   if not ParentItem^.Visible then ParentItem^.Visible := true;

   Items := TStringList.Create;
   Items.LoadFromFile(ListFile);
   if Items.IndexOf(FileName) = -1 then
      begin
           Items.Insert(0, FileName); //Dodajemy element (do pliku z lista)

           if Items.Count > MaxCount then //Jesli zadużo to wyrzucamy ostatni
                   Items.Delete(Items.Count - 1);
                   
           Items.SaveToFile(ListFile);

           if ParentItem^.Count < MaxCount then //Jesli jest miejsce na liscie to dodajemy element
              begin
                   new(NewItem);
                   NewItem^ := TMenuItem.Create(ParentItem^);
                   NewItem^.Name := ParentItem^.Name + 'LastOpen' + IntToStr(ParentItem^.Count);
                   NewItem^.Caption := Items.Strings[0];
                   NewItem^.OnClick := OnClickProc;
                   ParentItem^.Add(NewItem^);
                   dispose(NewItem);
              end;
              
           for i := 0 to ParentItem^.Count - 1 do
               begin
                    ParentItem^.Items[i].Caption := Items.Strings[i];
               end;
      end
   else
       begin
       //Jesli taki plik istnie na liście to wyrzucamy go na wierzch
               Items.Delete(Items.IndexOf(FileName));
               Items.Insert(0, FileName);
               Items.SaveToFile(ListFile);
               for i := 0 to ParentItem^.Count - 1 do
                   begin
                        ParentItem^.Items[i].Caption := Items.Strings[i];
                   end;
       end;
   Items.Free;
end;

procedure TLastOpenList.Load;
var
   Items : TStringList; //Lista ostatnio otwatych plików
   i : integer;

   NewItem : ^TMenuItem; //Pomocniczy do tworzenia i inicjalizacji nowych elementow listy
begin
   Items := TStringList.Create;
   Items.LoadFromFile(ListFile);
   if Items.Count = 0 then    //Jesli brak elementów na liscie
      begin
           ParentItem^.Visible := false; //Schowmy menu "Ostatnio otwarte"
      end
   else
       for i := 0 to Items.Count - 1 do
           begin
                new(NewItem); //Tworzymy nowy element i wypelaniamy pola
                NewItem^ := TMenuItem.Create(ParentItem^);
                NewItem^.Name := ParentItem^.Name + 'LastOpen' + IntToStr(i);
                NewItem^.Caption := Items.Strings[i];
                NewItem^.OnClick := OnClickProc;
                ParentItem^.Add(NewItem^); //Dodajemy do menu
                dispose(NewItem);
           end;
   Items.Free;
end;

end.

