IDE: project inspector: drop files from other applications

git-svn-id: trunk@45574 -
This commit is contained in:
mattias 2014-06-19 09:57:41 +00:00
parent fbf842866c
commit 7a606f8061
4 changed files with 117 additions and 94 deletions

View File

@ -11965,10 +11965,10 @@ var
OkToAdd: boolean; OkToAdd: boolean;
begin begin
Result:=mrOk; Result:=mrOk;
AnUnitInfo.IsPartOfProject:=true;
//debugln(['TMainIDE.ProjInspectorAddUnitToProject ',AnUnitInfo.Filename]); //debugln(['TMainIDE.ProjInspectorAddUnitToProject ',AnUnitInfo.Filename]);
ActiveSourceEditor:=nil; ActiveSourceEditor:=nil;
BeginCodeTool(ActiveSourceEditor,ActiveUnitInfo,[]); BeginCodeTool(ActiveSourceEditor,ActiveUnitInfo,[]);
AnUnitInfo.IsPartOfProject:=true;
OkToAdd:=True; OkToAdd:=True;
if FilenameIsPascalUnit(AnUnitInfo.Filename) then begin if FilenameIsPascalUnit(AnUnitInfo.Filename) then begin
OkToAdd:=SourceFileMgr.CheckDirIsInSearchPath(AnUnitInfo,False,False); OkToAdd:=SourceFileMgr.CheckDirIsInSearchPath(AnUnitInfo,False,False);

View File

@ -4,9 +4,11 @@ object ProjectInspectorForm: TProjectInspectorForm
Top = 104 Top = 104
Width = 425 Width = 425
ActiveControl = ItemsTreeView ActiveControl = ItemsTreeView
AllowDropFiles = True
Caption = 'ProjectInspectorForm' Caption = 'ProjectInspectorForm'
ClientHeight = 474 ClientHeight = 474
ClientWidth = 425 ClientWidth = 425
OnDropFiles = FormDropFiles
OnShow = ProjectInspectorFormShow OnShow = ProjectInspectorFormShow
LCLVersion = '1.3' LCLVersion = '1.3'
object ItemsTreeView: TTreeView object ItemsTreeView: TTreeView

View File

@ -31,7 +31,6 @@
TProjectInspectorForm is the form of the project inspector. TProjectInspectorForm is the form of the project inspector.
ToDo: ToDo:
- draw red line for missing files
- drop files - drop files
- multi select - multi select
- popup menu - popup menu
@ -59,14 +58,16 @@ unit ProjectInspector;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
{$DEFINE VerboseProjInspDrag}
interface interface
uses uses
Classes, SysUtils, LCLProc, LCLType, Forms, Controls, Buttons, ComCtrls, Classes, SysUtils, LCLProc, LCLType, Forms, Controls, Buttons, ComCtrls,
Menus, Dialogs, FileUtil, LazFileCache, ExtCtrls, Graphics, IDEHelpIntf, Menus, Dialogs, FileUtil, LazFileCache, ExtCtrls, Graphics, IDEHelpIntf,
IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ProjectIntf, Project, IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ProjectIntf, PackageIntf,
LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, AddToProjectDlg, PackageDefs, Project, LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, AddToProjectDlg,
TreeFilterEdit, EnvironmentOpts; PackageDefs, TreeFilterEdit, CodeToolManager, CodeCache, EnvironmentOpts;
type type
TOnAddUnitToProject = TOnAddUnitToProject =
@ -79,11 +80,9 @@ type
ADependency: TPkgDependency): TModalResult of object; ADependency: TPkgDependency): TModalResult of object;
TProjectInspectorFlag = ( TProjectInspectorFlag = (
pifAllChanged, pifNeedUpdateItems,
pifItemsChanged, pifNeedUpdateButtons,
pifButtonsChanged, pifNeedUpdateTitle
pifTitleChanged,
pifWasHidden
); );
TProjectInspectorFlags = set of TProjectInspectorFlag; TProjectInspectorFlags = set of TProjectInspectorFlag;
@ -119,6 +118,7 @@ type
HelpBitBtn: TToolButton; HelpBitBtn: TToolButton;
procedure AddBitBtnClick(Sender: TObject); procedure AddBitBtnClick(Sender: TObject);
procedure DirectoryHierarchyButtonClick(Sender: TObject); procedure DirectoryHierarchyButtonClick(Sender: TObject);
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure ItemsPopupMenuPopup(Sender: TObject); procedure ItemsPopupMenuPopup(Sender: TObject);
procedure ItemsTreeViewAdvancedCustomDrawItem(Sender: TCustomTreeView; procedure ItemsTreeViewAdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
@ -176,7 +176,7 @@ type
function GetNodeDataItem(TVNode: TTreeNode; out NodeData: TPINodeData; function GetNodeDataItem(TVNode: TTreeNode; out NodeData: TPINodeData;
out Item: TObject): boolean; out Item: TObject): boolean;
procedure SetDependencyDefaultFilename(AsPreferred: boolean); procedure SetDependencyDefaultFilename(AsPreferred: boolean);
procedure SetIdleConnected(const AValue: boolean); procedure SetIdleConnected(AValue: boolean);
procedure SetLazProject(const AValue: TProject); procedure SetLazProject(const AValue: TProject);
procedure SetShowDirectoryHierarchy(const AValue: boolean); procedure SetShowDirectoryHierarchy(const AValue: boolean);
procedure SetSortAlphabetically(const AValue: boolean); procedure SetSortAlphabetically(const AValue: boolean);
@ -186,21 +186,21 @@ type
procedure UpdateRequiredPackages; procedure UpdateRequiredPackages;
procedure OnProjectBeginUpdate(Sender: TObject); procedure OnProjectBeginUpdate(Sender: TObject);
procedure OnProjectEndUpdate(Sender: TObject; ProjectChanged: boolean); procedure OnProjectEndUpdate(Sender: TObject; ProjectChanged: boolean);
procedure OnCloseIDE(Sender: TObject);
protected protected
procedure KeyUp(var Key: Word; Shift: TShiftState); override; procedure KeyUp(var Key: Word; Shift: TShiftState); override;
procedure IdleHandler(Sender: TObject; var Done: Boolean); procedure IdleHandler(Sender: TObject; var Done: Boolean);
procedure UpdateShowing; override;
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure BeginUpdate; procedure BeginUpdate;
procedure EndUpdate; procedure EndUpdate;
function IsUpdateLocked: boolean; function IsUpdateLocked: boolean; inline;
procedure UpdateAll(Immediately: boolean); procedure UpdateAll(Immediately: boolean = false);
procedure UpdateTitle; procedure UpdateTitle(Immediately: boolean = false);
procedure UpdateButtons; procedure UpdateItems(Immediately: boolean = false);
procedure UpdateItems(Immediately: boolean); procedure UpdateButtons(Immediately: boolean = false);
procedure UpdatePending;
function CanUpdate(Flag: TProjectInspectorFlag): boolean;
function GetSelectedFile: TUnitInfo; function GetSelectedFile: TUnitInfo;
function GetSelectedDependency: TPkgDependency; function GetSelectedDependency: TPkgDependency;
public public
@ -232,6 +232,12 @@ implementation
{ TProjectInspectorForm } { TProjectInspectorForm }
// inline
function TProjectInspectorForm.IsUpdateLocked: boolean;
begin
Result:=FUpdateLock>0;
end;
procedure TProjectInspectorForm.ItemsTreeViewDblClick(Sender: TObject); procedure TProjectInspectorForm.ItemsTreeViewDblClick(Sender: TObject);
begin begin
OpenButtonClick(Self); OpenButtonClick(Self);
@ -363,6 +369,44 @@ begin
ShowDirectoryHierarchy:=DirectoryHierarchyButton.Down; ShowDirectoryHierarchy:=DirectoryHierarchyButton.Down;
end; end;
procedure TProjectInspectorForm.FormDropFiles(Sender: TObject;
const FileNames: array of String);
var
i: Integer;
NewFilename: String;
NewFile: TUnitInfo;
begin
{$IFDEF VerboseProjInspDrag}
debugln(['TProjectInspectorForm.FormDropFiles ',length(FileNames)]);
{$ENDIF}
if length(FileNames)=0 then exit;
BeginUpdate;
try
for i:=0 to high(Filenames) do begin
NewFilename:=CleanAndExpandFilename(FileNames[i]);
if not FileExistsUTF8(NewFilename) then continue;
if DirPathExists(NewFilename) then continue;
NewFile:=LazProject.UnitInfoWithFilename(NewFilename);
if (NewFile<>nil) and (NewFile.IsPartOfProject) then continue;
{$IFDEF VerboseProjInspDrag}
debugln(['TProjectInspectorForm.FormDropFiles Adding files: ',NewFilename]);
{$ENDIF}
if NewFile=nil then begin
NewFile:=TUnitInfo.Create(nil);
NewFile.Filename:=NewFilename;
LazProject.AddFile(NewFile,false);
end;
NewFile.IsPartOfProject:=true;
if Assigned(OnAddUnitToProject) then begin
if OnAddUnitToProject(Self,NewFile)<>mrOk then break;
end;
UpdateAll(false);
end;
finally
EndUpdate;
end;
end;
procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject); procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject);
var var
ItemCnt: integer; ItemCnt: integer;
@ -586,6 +630,7 @@ begin
DirectoryHierarchyButton.Down:=FShowDirectoryHierarchy; DirectoryHierarchyButton.Down:=FShowDirectoryHierarchy;
FilterEdit.ShowDirHierarchy:=FShowDirectoryHierarchy; FilterEdit.ShowDirHierarchy:=FShowDirectoryHierarchy;
FilterEdit.InvalidateFilter; FilterEdit.InvalidateFilter;
EnvironmentOptions.ProjInspShowDirHierarchy := ShowDirectoryHierarchy;
end; end;
procedure TProjectInspectorForm.SetSortAlphabetically(const AValue: boolean); procedure TProjectInspectorForm.SetSortAlphabetically(const AValue: boolean);
@ -595,6 +640,7 @@ begin
SortAlphabeticallyButton.Down:=FSortAlphabetically; SortAlphabeticallyButton.Down:=FSortAlphabetically;
FilterEdit.SortData:=FSortAlphabetically; FilterEdit.SortData:=FSortAlphabetically;
FilterEdit.InvalidateFilter; FilterEdit.InvalidateFilter;
EnvironmentOptions.ProjInspSortAlphabetically := SortAlphabetically;
end; end;
procedure TProjectInspectorForm.SetDependencyDefaultFilename(AsPreferred: boolean); procedure TProjectInspectorForm.SetDependencyDefaultFilename(AsPreferred: boolean);
@ -615,8 +661,10 @@ begin
UpdateButtons; UpdateButtons;
end; end;
procedure TProjectInspectorForm.SetIdleConnected(const AValue: boolean); procedure TProjectInspectorForm.SetIdleConnected(AValue: boolean);
begin begin
if csDestroying in ComponentState then
AValue:=false;
if FIdleConnected=AValue then exit; if FIdleConnected=AValue then exit;
FIdleConnected:=AValue; FIdleConnected:=AValue;
if FIdleConnected then if FIdleConnected then
@ -829,12 +877,6 @@ begin
EndUpdate; EndUpdate;
end; end;
procedure TProjectInspectorForm.OnCloseIDE(Sender: TObject);
begin
EnvironmentOptions.ProjInspSortAlphabetically := SortAlphabetically;
EnvironmentOptions.ProjInspShowDirHierarchy := ShowDirectoryHierarchy;
end;
procedure TProjectInspectorForm.KeyUp(var Key: Word; Shift: TShiftState); procedure TProjectInspectorForm.KeyUp(var Key: Word; Shift: TShiftState);
begin begin
inherited KeyDown(Key, Shift); inherited KeyDown(Key, Shift);
@ -843,38 +885,11 @@ end;
procedure TProjectInspectorForm.IdleHandler(Sender: TObject; var Done: Boolean); procedure TProjectInspectorForm.IdleHandler(Sender: TObject; var Done: Boolean);
begin begin
if not IsVisible then begin if IsUpdateLocked then begin
Include(FFlags,pifWasHidden);
IdleConnected:=false; IdleConnected:=false;
exit; exit;
end; end;
Exclude(FFlags,pifWasHidden); UpdatePending;
if FUpdateLock>0 then begin
IdleConnected:=false;
exit;
end;
if pifAllChanged in FFlags then
UpdateAll(true)
else if pifItemsChanged in FFlags then
UpdateItems(true)
else if pifTitleChanged in FFlags then
UpdateTitle
else if pifButtonsChanged in FFlags then
UpdateButtons
else
IdleConnected:=false;
end;
procedure TProjectInspectorForm.UpdateShowing;
begin
inherited UpdateShowing;
if IsVisible and (pifWasHidden in FFlags) then begin
Exclude(FFlags,pifWasHidden);
if FFlags<>[] then begin
// the form is visible again and some updates are pending
IdleConnected:=true;
end;
end;
end; end;
function TProjectInspectorForm.GetSelectedFile: TUnitInfo; function TProjectInspectorForm.GetSelectedFile: TUnitInfo;
@ -907,7 +922,6 @@ begin
KeyPreview:=true; KeyPreview:=true;
SortAlphabetically := EnvironmentOptions.ProjInspSortAlphabetically; SortAlphabetically := EnvironmentOptions.ProjInspSortAlphabetically;
ShowDirectoryHierarchy := EnvironmentOptions.ProjInspShowDirHierarchy; ShowDirectoryHierarchy := EnvironmentOptions.ProjInspShowDirHierarchy;
LazarusIDE.AddHandlerOnIDEClose(@OnCloseIDE);
end; end;
destructor TProjectInspectorForm.Destroy; destructor TProjectInspectorForm.Destroy;
@ -932,36 +946,25 @@ procedure TProjectInspectorForm.EndUpdate;
begin begin
if FUpdateLock=0 then RaiseException('TProjectInspectorForm.EndUpdate'); if FUpdateLock=0 then RaiseException('TProjectInspectorForm.EndUpdate');
dec(FUpdateLock); dec(FUpdateLock);
end; if FUpdateLock=0 then
IdleConnected:=true;
function TProjectInspectorForm.IsUpdateLocked: boolean;
begin
Result:=FUpdateLock>0;
end; end;
procedure TProjectInspectorForm.UpdateAll(Immediately: boolean); procedure TProjectInspectorForm.UpdateAll(Immediately: boolean);
begin begin
if (FUpdateLock>0) or (not Visible) then begin UpdateItems;
Include(FFlags,pifAllChanged);
IdleConnected:=true;
exit;
end;
Exclude(FFlags,pifAllChanged);
UpdateTitle; UpdateTitle;
UpdateButtons; UpdateButtons;
UpdateItems(true); if Immediately then
UpdatePending;
end; end;
procedure TProjectInspectorForm.UpdateTitle; procedure TProjectInspectorForm.UpdateTitle(Immediately: boolean);
var var
NewCaption: String; NewCaption: String;
begin begin
if (FUpdateLock>0) or (not Visible) then begin if not CanUpdate(pifNeedUpdateTitle) then exit;
Include(FFlags,pifTitleChanged);
IdleConnected:=true;
exit;
end;
Exclude(FFlags,pifTitleChanged);
if LazProject=nil then if LazProject=nil then
Caption:=lisMenuProjectInspector Caption:=lisMenuProjectInspector
else begin else begin
@ -972,17 +975,25 @@ begin
end; end;
end; end;
procedure TProjectInspectorForm.UpdateButtons; procedure TProjectInspectorForm.UpdateItems(Immediately: boolean);
begin
if not CanUpdate(pifNeedUpdateItems) then exit;
ItemsTreeView.BeginUpdate;
try
UpdateProjectFiles;
UpdateRequiredPackages;
finally
ItemsTreeView.EndUpdate;
end;
end;
procedure TProjectInspectorForm.UpdateButtons(Immediately: boolean);
var var
CurFile: TUnitInfo; CurFile: TUnitInfo;
CurDependency: TPkgDependency; CurDependency: TPkgDependency;
begin begin
if (FUpdateLock>0) or (not Visible) then begin if not CanUpdate(pifNeedUpdateButtons) then exit;
Include(FFlags,pifButtonsChanged);
IdleConnected:=true;
exit;
end;
Exclude(FFlags,pifButtonsChanged);
if LazProject<>nil then begin if LazProject<>nil then begin
AddBitBtn.Enabled:=true; AddBitBtn.Enabled:=true;
CurFile:=GetSelectedFile; CurFile:=GetSelectedFile;
@ -1000,20 +1011,29 @@ begin
end; end;
end; end;
procedure TProjectInspectorForm.UpdateItems(Immediately: boolean); procedure TProjectInspectorForm.UpdatePending;
begin begin
if (FUpdateLock>0) or (not Visible) then begin if pifNeedUpdateItems in FFlags then
Include(FFlags,pifItemsChanged); UpdateItems(true);
if pifNeedUpdateTitle in FFlags then
UpdateTitle(true);
if pifNeedUpdateButtons in FFlags then
UpdateButtons(true);
IdleConnected:=false;
end;
function TProjectInspectorForm.CanUpdate(Flag: TProjectInspectorFlag): boolean;
begin
Result:=false;
if csDestroying in ComponentState then exit;
if LazProject=nil then exit;
if IsUpdateLocked then begin
Include(fFlags,Flag);
IdleConnected:=true; IdleConnected:=true;
exit; Result:=false;
end; end else begin
Exclude(FFlags,pifItemsChanged); Exclude(fFlags,Flag);
ItemsTreeView.BeginUpdate; Result:=true;
try
UpdateProjectFiles;
UpdateRequiredPackages;
finally
ItemsTreeView.EndUpdate;
end; end;
end; end;

View File

@ -2189,7 +2189,8 @@ begin
if fUpdateLock=0 then if fUpdateLock=0 then
RaiseException(''); RaiseException('');
dec(fUpdateLock); dec(fUpdateLock);
UpdatePending; if fUpdateLock=0 then
IdleConnected:=true;
end; end;
procedure TPackageEditorForm.UpdateTitle(Immediately: boolean); procedure TPackageEditorForm.UpdateTitle(Immediately: boolean);