diff --git a/components/ideintf/projectintf.pas b/components/ideintf/projectintf.pas index 22c562c86c..ac03bed4b6 100644 --- a/components/ideintf/projectintf.pas +++ b/components/ideintf/projectintf.pas @@ -18,7 +18,7 @@ interface uses Classes, SysUtils, FileUtil, LazFileUtils, Controls, Forms, AvgLvlTree, NewItemIntf, ProjPackIntf, CompOptsIntf, ObjInspStrConsts, LazFileCache, - LazMethodList; + LazMethodList, ImgList, Graphics; const FileDescGroupName = 'File'; @@ -585,6 +585,9 @@ const ); +function LoadProjectIconIntoImages(const ProjFile: string; + const Images: TCustomImageList; const Index: TStrings): Integer; + function ProjectFlagsToStr(Flags: TProjectFlags): string; function StrToProjectSessionStorage(const s: string): TProjectSessionStorage; function CompilationExecutableTypeNameToType(const s: string @@ -694,6 +697,44 @@ begin Result:=ProjectDescriptors.FindByName(ProjDescNameEmpty); end; +function LoadProjectIconIntoImages(const ProjFile: string; + const Images: TCustomImageList; const Index: TStrings): Integer; +var + xIconFile: RawByteString; + xIcon: TIcon; + I: Integer; +begin + //ToDo: better index + + I := Index.IndexOf(ProjFile); + if I >= 0 then + Exit(NativeInt(Index.Objects[I])); + + Result := -1; + xIconFile := ChangeFileExt(ProjFile, '.ico'); + if FileExists(xIconFile) then + begin + xIcon := TIcon.Create; + try + xIcon.LoadFromFile(xIconFile); + for I := 0 to xIcon.Count-1 do + begin + xIcon.Current := I; + if (xIcon.Width = Images.Width) + and(xIcon.Height = Images.Height) then + begin + Result := Images.AddIcon(xIcon); + Break; + end; + end; + finally + xIcon.Free; + end; + end; + + Index.AddObject(ProjFile, TObject(Result)); +end; + function ProjectFlagsToStr(Flags: TProjectFlags): string; var f: TProjectFlag; begin diff --git a/ide/mainbase.pas b/ide/mainbase.pas index f9bbd8cf2c..895c725bda 100644 --- a/ide/mainbase.pas +++ b/ide/mainbase.pas @@ -68,7 +68,7 @@ uses Debugger, IDEOptionDefs, Splash, Designer, SourceEditor, FindInFilesDlg, MainBar, MainIntf, SourceSynEditor, PseudoTerminalDlg, - DesktopManager; + DesktopManager, ImgList; type TResetToolFlag = ( @@ -218,10 +218,15 @@ type TOpenFileToolButton = class(TIDEToolButton) private + FIndex: TStringList; + procedure RefreshMenu(Sender: TObject); procedure mnuOpenFile(Sender: TObject); procedure mnuProjectFile(Sender: TObject); public + constructor Create(aOwner: TComponent); override; + destructor Destroy; override; + procedure DoOnAdded; override; end; @@ -411,12 +416,32 @@ end; { TOpenFileToolButton } +constructor TOpenFileToolButton.Create(aOwner: TComponent); +begin + inherited Create(aOwner); + + FIndex := TStringList.Create; + FIndex.Sorted := True; + FIndex.Duplicates := dupIgnore; + FIndex.CaseSensitive := False; +end; + +destructor TOpenFileToolButton.Destroy; +begin + FIndex.Free; + + inherited Destroy; +end; + procedure TOpenFileToolButton.DoOnAdded; begin inherited DoOnAdded; DropdownMenu := TPopupMenu.Create(Self); DropdownMenu.OnPopup := @RefreshMenu; + DropdownMenu.Images := TCustomImageList.Create(Self); + DropdownMenu.Images.Width := 16; + DropdownMenu.Images.Height := 16; Style := tbsDropDown; end; @@ -439,12 +464,16 @@ procedure TOpenFileToolButton.RefreshMenu(Sender: TObject); procedure AddFile(const AFileName: string; const AOnClick: TNotifyEvent); var AMenuItem: TOpenFileMenuItem; + xExt: string; begin AMenuItem := TOpenFileMenuItem.Create(DropdownMenu); + DropdownMenu.Items.Add(AMenuItem); AMenuItem.OnClick := AOnClick; AMenuItem.FileName := AFileName; - DropdownMenu.Items.Add(AMenuItem); AMenuItem.Caption := AFilename; + xExt := ExtractFileExt(AFileName); + if SameFileName(xExt, '.lpi') or SameFileName(xExt, '.lpr') then + AMenuItem.ImageIndex := LoadProjectIconIntoImages(AFileName, DropdownMenu.Images, FIndex); end; procedure AddFiles(List: TStringList; MaxCount: integer; const AOnClick: TNotifyEvent);