mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-02 12:52:44 +02:00
favorites: new Favorites IDE extension package
git-svn-id: trunk@50512 -
This commit is contained in:
parent
151f452c84
commit
a466814e44
5
.gitattributes
vendored
5
.gitattributes
vendored
@ -1290,6 +1290,10 @@ components/externhelp/languages/externhelpfrm.po svneol=native#text/plain
|
||||
components/externhelp/languages/externhelpfrm.pt_BR.po svneol=native#text/plain
|
||||
components/externhelp/languages/externhelpfrm.ru.po svneol=native#text/plain
|
||||
components/externhelp/languages/externhelpfrm.uk.po svneol=native#text/plain
|
||||
components/favorites/README.txt svneol=native#text/plain
|
||||
components/favorites/favorites.lpk svneol=native#text/plain
|
||||
components/favorites/favorites.pas svneol=native#text/pascal
|
||||
components/favorites/favorites_impl.pas svneol=native#text/pascal
|
||||
components/filebrowser/frmconfigfilebrowser.lfm svneol=native#text/plain
|
||||
components/filebrowser/frmconfigfilebrowser.pp svneol=native#text/plain
|
||||
components/filebrowser/frmfilebrowser.lfm svneol=native#text/plain
|
||||
@ -7681,6 +7685,7 @@ packager/globallinks/editormacroscript-0.lpl svneol=native#text/pascal
|
||||
packager/globallinks/educationlaz-1.0.1.lpl svneol=native#text/plain
|
||||
packager/globallinks/exploreidemenu-0.lpl svneol=native#text/plain
|
||||
packager/globallinks/externhelp-1.3.lpl svneol=native#text/plain
|
||||
packager/globallinks/favorites-0.1.1.lpl svneol=native#text/plain
|
||||
packager/globallinks/fcl-1.0.1.lpl svneol=native#text/plain
|
||||
packager/globallinks/filefindlaz-1.0.2.lpl svneol=native#text/plain
|
||||
packager/globallinks/fpcunitconsolerunner-1.lpl svneol=native#text/plain
|
||||
|
6
components/favorites/README.txt
Normal file
6
components/favorites/README.txt
Normal file
@ -0,0 +1,6 @@
|
||||
IDE add-on for Favorites.
|
||||
Adds favorite projects list into the drop-down menu of "Open" toolbar button.
|
||||
|
||||
Author: Ondrej Pokorny
|
||||
|
||||
Documentation: http://wiki.lazarus.freepascal.org/Favorites
|
55
components/favorites/favorites.lpk
Normal file
55
components/favorites/favorites.lpk
Normal file
@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<Package Version="4">
|
||||
<PathDelim Value="\"/>
|
||||
<Name Value="favorites"/>
|
||||
<Type Value="DesignTime"/>
|
||||
<Author Value="Ondrej Pokorny"/>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<SearchPaths>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<IOChecks Value="True"/>
|
||||
<RangeChecks Value="True"/>
|
||||
<OverflowChecks Value="True"/>
|
||||
</Checks>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2Set"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
<TrashVariables Value="True"/>
|
||||
<UseExternalDbgSyms Value="True"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
<Description Value="Creates a third section (on the top) in the Open tool button drop-down menu where you can register your favorite projects."/>
|
||||
<License Value="GPL-2"/>
|
||||
<Version Minor="1" Release="1"/>
|
||||
<Files Count="1">
|
||||
<Item1>
|
||||
<Filename Value="favorites_impl.pas"/>
|
||||
<HasRegisterProc Value="True"/>
|
||||
<UnitName Value="favorites_impl"/>
|
||||
</Item1>
|
||||
</Files>
|
||||
<RequiredPkgs Count="2">
|
||||
<Item1>
|
||||
<PackageName Value="IDEIntf"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<PackageName Value="FCL"/>
|
||||
</Item2>
|
||||
</RequiredPkgs>
|
||||
<UsageOptions>
|
||||
<UnitPath Value="$(PkgOutDir)"/>
|
||||
</UsageOptions>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
</PublishOptions>
|
||||
</Package>
|
||||
</CONFIG>
|
21
components/favorites/favorites.pas
Normal file
21
components/favorites/favorites.pas
Normal file
@ -0,0 +1,21 @@
|
||||
{ This file was automatically created by Lazarus. Do not edit!
|
||||
This source is only used to compile and install the package.
|
||||
}
|
||||
|
||||
unit favorites;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
favorites_impl, LazarusPackageIntf;
|
||||
|
||||
implementation
|
||||
|
||||
procedure Register;
|
||||
begin
|
||||
RegisterUnit('favorites_impl', @favorites_impl.Register);
|
||||
end;
|
||||
|
||||
initialization
|
||||
RegisterPackage('favorites', @Register);
|
||||
end.
|
282
components/favorites/favorites_impl.pas
Normal file
282
components/favorites/favorites_impl.pas
Normal file
@ -0,0 +1,282 @@
|
||||
{
|
||||
***************************************************************************
|
||||
* *
|
||||
* This source is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This code is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License for more details. *
|
||||
* *
|
||||
* A copy of the GNU General Public License is available on the World *
|
||||
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
||||
* obtain it by writing to the Free Software Foundation, *
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
Author: Ondrej Pokorny
|
||||
|
||||
Abstract:
|
||||
Adds favorite projects list into the drop-down menu of "Open" toolbar button.
|
||||
}
|
||||
unit favorites_impl;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, ToolBarIntf, IDEImagesIntf, Graphics, PackageIntf,
|
||||
Menus, LazIDEIntf, ProjectIntf, Laz2_XMLCfg, IDEOptionsIntf,
|
||||
IDECommands, ComCtrls;
|
||||
|
||||
type
|
||||
TFavoritesHandler = class
|
||||
private
|
||||
FOldToolButtonClass: TIDEToolButtonClass;
|
||||
FFavoriteProjects: TStringList;
|
||||
FConfig: TXMLConfig;
|
||||
|
||||
procedure AddToRecentProjectFiles(Sender: TObject; AFileName: string;
|
||||
var AAllow: Boolean);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
public
|
||||
procedure LoadFromConfig;
|
||||
procedure SaveToConfig;
|
||||
function IsInFavoriteProjects(const aFileName: string): Boolean;
|
||||
procedure AddToFavoriteProjects(const aFileName: string);
|
||||
procedure RemoveFromFavoriteProjects(const aFileName: string);
|
||||
end;
|
||||
|
||||
TFileNameMenuItem = class(TMenuItem)
|
||||
public
|
||||
FileName: string;
|
||||
end;
|
||||
|
||||
TOpenFileFavToolButton = class(TIDEToolButton)
|
||||
private
|
||||
FOrigButton: TIDEToolButton;
|
||||
FOrigOnPopup: TNotifyEvent;
|
||||
|
||||
procedure RefreshMenu(Sender: TObject);
|
||||
procedure mnuFavoriteFile(Sender: TObject);
|
||||
procedure mnuAddRemoveActiveProject(Sender: TObject);
|
||||
public
|
||||
constructor Create(aOwner: TComponent); override;
|
||||
procedure DoOnAdded; override;
|
||||
end;
|
||||
|
||||
|
||||
procedure Register;
|
||||
|
||||
implementation
|
||||
|
||||
var
|
||||
FavHandler: TFavoritesHandler = nil;
|
||||
|
||||
procedure Register;
|
||||
begin
|
||||
FavHandler := TFavoritesHandler.Create;
|
||||
end;
|
||||
|
||||
{ TOpenFileFavToolButton }
|
||||
|
||||
constructor TOpenFileFavToolButton.Create(aOwner: TComponent);
|
||||
begin
|
||||
inherited Create(aOwner);
|
||||
|
||||
if FavHandler.FOldToolButtonClass<>nil then
|
||||
FOrigButton := FavHandler.FOldToolButtonClass.Create(Self)
|
||||
else
|
||||
FOrigButton := TIDEToolButton.Create(Self);
|
||||
end;
|
||||
|
||||
procedure TOpenFileFavToolButton.DoOnAdded;
|
||||
begin
|
||||
inherited DoOnAdded;
|
||||
|
||||
FOrigButton.DoOnAdded;
|
||||
|
||||
if FOrigButton.DropdownMenu<>nil then
|
||||
DropdownMenu := FOrigButton.DropdownMenu
|
||||
else
|
||||
DropdownMenu := TPopupMenu.Create(Self);
|
||||
|
||||
FOrigOnPopup := DropdownMenu.OnPopup;
|
||||
DropdownMenu.OnPopup := @RefreshMenu;
|
||||
Style := tbsDropDown;
|
||||
end;
|
||||
|
||||
procedure TOpenFileFavToolButton.mnuAddRemoveActiveProject(Sender: TObject);
|
||||
var
|
||||
xFileName: string;
|
||||
begin
|
||||
xFileName := (Sender as TFileNameMenuItem).FileName;
|
||||
if FavHandler.IsInFavoriteProjects(xFileName) then
|
||||
begin
|
||||
FavHandler.RemoveFromFavoriteProjects(xFileName);
|
||||
IDEEnvironmentOptions.AddToRecentProjectFiles(xFileName);
|
||||
end else
|
||||
begin
|
||||
FavHandler.AddToFavoriteProjects(xFileName);
|
||||
IDEEnvironmentOptions.RemoveFromRecentProjectFiles(xFileName);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TOpenFileFavToolButton.mnuFavoriteFile(Sender: TObject);
|
||||
begin
|
||||
LazarusIDE.DoOpenProjectFile((Sender as TFileNameMenuItem).FileName,[ofAddToRecent]);
|
||||
end;
|
||||
|
||||
procedure TOpenFileFavToolButton.RefreshMenu(Sender: TObject);
|
||||
var
|
||||
xM, xSep: TMenuItem;
|
||||
xFavoriteFile: string;
|
||||
xMI, xAddToFav: TFileNameMenuItem;
|
||||
xProj: TLazProject;
|
||||
xMIndex: Integer;
|
||||
begin
|
||||
if Assigned(FOrigOnPopup) then
|
||||
FOrigOnPopup(Sender);
|
||||
|
||||
xM := DropdownMenu.Items;
|
||||
|
||||
xMIndex := 0;
|
||||
for xFavoriteFile in FavHandler.FFavoriteProjects do
|
||||
begin
|
||||
xMI := TFileNameMenuItem.Create(Self);
|
||||
xMI.FileName := xFavoriteFile;
|
||||
xMI.Caption := xFavoriteFile;
|
||||
xMI.OnClick := @mnuFavoriteFile;
|
||||
xM.Insert(xMIndex, xMI);
|
||||
Inc(xMIndex);
|
||||
end;
|
||||
|
||||
xProj := LazarusIDE.ActiveProject;
|
||||
if (xProj<>nil) and FileExists(xProj.ProjectInfoFile) then
|
||||
begin
|
||||
xAddToFav := TFileNameMenuItem.Create(Self);
|
||||
xAddToFav.FileName := xProj.ProjectInfoFile;
|
||||
if not FavHandler.IsInFavoriteProjects(xProj.ProjectInfoFile) then
|
||||
xAddToFav.Caption := Format('Add to favorites: %s', [xProj.ProjectInfoFile]) // To-Do: localize
|
||||
else
|
||||
xAddToFav.Caption := Format('Remove from favorites: %s', [xProj.ProjectInfoFile]); // To-Do: localize
|
||||
xAddToFav.OnClick := @mnuAddRemoveActiveProject;
|
||||
xM.Insert(xMIndex, xAddToFav);
|
||||
Inc(xMIndex);
|
||||
end;
|
||||
|
||||
if xMIndex > 0 then
|
||||
begin
|
||||
xSep := TMenuItem.Create(Self);
|
||||
xSep.Caption := '-';
|
||||
xM.Insert(xMIndex, xSep);
|
||||
Inc(xMIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TFavoritesHandler }
|
||||
|
||||
constructor TFavoritesHandler.Create;
|
||||
var
|
||||
I: Integer;
|
||||
xToolButton: TIDEButtonCommand;
|
||||
begin
|
||||
IDEEnvironmentOptions.AddHandlerAddToRecentProjectFiles(@AddToRecentProjectFiles);
|
||||
FFavoriteProjects := TStringList.Create;
|
||||
FFavoriteProjects.Duplicates := dupIgnore;
|
||||
FFavoriteProjects.CaseSensitive := False;
|
||||
FFavoriteProjects.Sorted := True;
|
||||
FConfig := TXMLConfig.Create(LazarusIDE.GetPrimaryConfigPath+'favorites.xml');
|
||||
LoadFromConfig;
|
||||
|
||||
xToolButton := IDEToolButtonCategories.FindItemByCommand(ecOpen);
|
||||
FOldToolButtonClass := xToolButton.ToolButtonClass;
|
||||
xToolButton.ToolButtonClass := TOpenFileFavToolButton;
|
||||
|
||||
for I := 0 to FFavoriteProjects.Count-1 do
|
||||
IDEEnvironmentOptions.RemoveFromRecentProjectFiles(FFavoriteProjects[I]);
|
||||
end;
|
||||
|
||||
procedure TFavoritesHandler.AddToFavoriteProjects(const aFileName: string);
|
||||
begin
|
||||
FFavoriteProjects.Add(aFileName);
|
||||
end;
|
||||
|
||||
procedure TFavoritesHandler.AddToRecentProjectFiles(Sender: TObject;
|
||||
AFileName: string; var AAllow: Boolean);
|
||||
begin
|
||||
if IsInFavoriteProjects(AFileName) then
|
||||
AAllow := False;
|
||||
end;
|
||||
|
||||
destructor TFavoritesHandler.Destroy;
|
||||
begin
|
||||
SaveToConfig;
|
||||
FFavoriteProjects.Free;
|
||||
FConfig.Free;
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TFavoritesHandler.IsInFavoriteProjects(const aFileName: string
|
||||
): Boolean;
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
for I := 0 to FFavoriteProjects.Count-1 do
|
||||
if SameFileName(aFileName, FFavoriteProjects[I]) then
|
||||
Exit(True);
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
procedure TFavoritesHandler.LoadFromConfig;
|
||||
var
|
||||
I: Integer;
|
||||
xItem: string;
|
||||
begin
|
||||
I := 1;
|
||||
while True do
|
||||
begin
|
||||
xItem := FConfig.GetValue('projects/item'+IntToStr(I), '');
|
||||
if xItem = '' then
|
||||
Break;
|
||||
if FileExists(xItem) then
|
||||
FFavoriteProjects.Add(xItem);
|
||||
Inc(I);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFavoritesHandler.RemoveFromFavoriteProjects(const aFileName: string);
|
||||
var
|
||||
xIndex: Integer;
|
||||
begin
|
||||
xIndex := FFavoriteProjects.IndexOf(aFileName);
|
||||
if xIndex >= 0 then
|
||||
FFavoriteProjects.Delete(xIndex);
|
||||
end;
|
||||
|
||||
procedure TFavoritesHandler.SaveToConfig;
|
||||
var
|
||||
I: Integer;
|
||||
xItem: string;
|
||||
begin
|
||||
I := 1;
|
||||
FConfig.DeletePath('projects');
|
||||
for xItem in FFavoriteProjects do
|
||||
begin
|
||||
FConfig.SetValue('projects/item'+IntToStr(I), xItem);
|
||||
Inc(I);
|
||||
end;
|
||||
end;
|
||||
|
||||
finalization
|
||||
FreeAndNil(FavHandler);
|
||||
end.
|
||||
|
1
packager/globallinks/favorites-0.1.1.lpl
Normal file
1
packager/globallinks/favorites-0.1.1.lpl
Normal file
@ -0,0 +1 @@
|
||||
$(LazarusDir)/components/favorites/favorites.lpk
|
Loading…
Reference in New Issue
Block a user