diff --git a/ide/keymapping.pp b/ide/keymapping.pp index 67340e3a24..072422b77b 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -1176,8 +1176,8 @@ begin ecSaveProjectAs : Result:= lisMenuSaveProjectAs; ecPublishProject : Result:= lisMenuPublishProject; ecProjectInspector : Result:= lisMenuProjectInspector; - ecAddCurUnitToProj : Result:= lisMenuAddUnitToProject; - ecRemoveFromProj : Result:= lisMenuRemoveUnitFromProject; + ecAddCurUnitToProj : Result:= lisMenuAddToProject; + ecRemoveFromProj : Result:= lisMenuRemoveFromProject; ecViewProjectSource : Result:= lisMenuViewSource; ecViewProjectTodos : Result:= lisMenuViewProjectTodos; ecProjectOptions : Result:= lisMenuProjectOptions; diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index 300bc25cb2..235b89b016 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -193,8 +193,8 @@ resourcestring lisMenuSaveProjectAs = 'Save Project As...'; lisMenuPublishProject = 'Publish Project'; lisMenuProjectInspector = 'Project Inspector'; - lisMenuAddUnitToProject = 'Add active unit to Project'; - lisMenuRemoveUnitFromProject = 'Remove from Project'; + lisMenuAddToProject = 'Add editor file to Project'; + lisMenuRemoveFromProject = 'Remove from Project'; lisMenuViewSource = 'View Source'; lisMenuViewProjectTodos = 'View ToDo List'; lisMenuProjectOptions = 'Project Options...'; diff --git a/ide/mainbar.pas b/ide/mainbar.pas index a09a4afcc6..4f17058003 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -1116,12 +1116,12 @@ begin itmProjectAddTo := TMenuItem.Create(Self); itmProjectAddTo.Name:='itmProjectAddTo'; - itmProjectAddTo.Caption := lisMenuAddUnitToProject; + itmProjectAddTo.Caption := lisMenuAddToProject; mnuProject.Add(itmProjectAddTo); itmProjectRemoveFrom := TMenuItem.Create(Self); itmProjectRemoveFrom.Name:='itmProjectRemoveFrom'; - itmProjectRemoveFrom.Caption := lisMenuRemoveUnitFromProject; + itmProjectRemoveFrom.Caption := lisMenuRemoveFromProject; mnuProject.Add(itmProjectRemoveFrom); mnuProject.Add(CreateMenuSeparator); diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index 3ed95212e6..d606596416 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -611,6 +611,7 @@ type function GetIncludePath(RelativeToBaseDir: boolean): string; function NeedsDefineTemplates: boolean; // files + function IndexOfPkgFile(PkgFile: TPkgFile): integer; procedure ShortenFilename(var ExpandedFilename: string; UseUp: boolean); procedure LongenFilename(var AFilename: string); function FindPkgFile(const AFilename: string; @@ -626,6 +627,8 @@ type procedure RemoveFile(PkgFile: TPkgFile); procedure UnremovePkgFile(PkgFile: TPkgFile); function GetFileDialogInitialDir(const DefaultDirectory: string): string; + procedure MoveFile(CurIndex, NewIndex: integer); + procedure SortFiles; // required dependencies (plus removed required dependencies) function FindDependencyByName(const PkgName: string): TPkgDependency; function RequiredDepByIndex(Index: integer): TPkgDependency; @@ -767,6 +770,7 @@ function ComparePkgDependencyNames(Data1, Data2: Pointer): integer; function CompareUnitsTree(UnitTree1, UnitTree2: TPkgUnitsTree): integer; function ComparePackageWithUnitsTree(Package: TLazPackage; UnitTree: TPkgUnitsTree): integer; +function ComparePkgFilesAlphabetically(PkgFile1, PkgFile2: TPkgFile): integer; function GetUsageOptionsList(PackageList: TList): TList; @@ -984,6 +988,13 @@ begin Result:=Package.Compare(UnitTree.LazPackage); end; +function ComparePkgFilesAlphabetically(PkgFile1, PkgFile2: TPkgFile): integer; +begin + Result:=AnsiCompareText(PkgFile1.UnitName,PkgFile2.UnitName); + if Result<>0 then exit; + Result:=CompareFilenames(PkgFile1.FileName,PkgFile2.FileName); +end; + function GetUsageOptionsList(PackageList: TList): TList; var Cnt: Integer; @@ -2482,6 +2493,35 @@ begin Result:=Directory; end; +procedure TLazPackage.MoveFile(CurIndex, NewIndex: integer); +begin + if CurIndex=NewIndex then exit; + FFiles.Move(CurIndex,NewIndex); + Modified:=true; +end; + +procedure TLazPackage.SortFiles; +var + NewList: TList; + Cnt: Integer; + i: Integer; +begin + if FileCount=0 then exit; + NewList:=TList.Create; + try + Cnt:=FileCount; + NewList.Assign(FFiles); + NewList.Sort(@ComparePkgFilesAlphabetically); + i:=Cnt-1; + while (i>=0) and (NewList[i]=FFiles[i]) do dec(i); + if i<0 then exit; + FFiles.Assign(NewList); + Modified:=true; + finally + NewList.Free; + end; +end; + procedure TLazPackage.RemoveRemovedDependency(Dependency: TPkgDependency); begin Dependency.RemoveFromList(FFirstRemovedDependency,pdlRequires); @@ -2645,6 +2685,12 @@ begin Result:=true; end; +function TLazPackage.IndexOfPkgFile(PkgFile: TPkgFile): integer; +begin + Result:=FileCount-1; + while (Files[Result]<>PkgFile) do dec(Result); +end; + { TPkgComponent } procedure TPkgComponent.SetPkgFile(const AValue: TPkgFile); diff --git a/packager/packageeditor.pas b/packager/packageeditor.pas index dc6f0fdf55..4a869849ce 100644 --- a/packager/packageeditor.pas +++ b/packager/packageeditor.pas @@ -135,6 +135,8 @@ type procedure MoreBitBtnClick(Sender: TObject); procedure MoveDependencyUpClick(Sender: TObject); procedure MoveDependencyDownClick(Sender: TObject); + procedure MoveFileUpMenuItemClick(Sender: TObject); + procedure MoveFileDownMenuItemClick(Sender: TObject); procedure OpenFileMenuItemClick(Sender: TObject); procedure OptionsBitBtnClick(Sender: TObject); procedure PackageEditorFormClose(Sender: TObject; var Action: TCloseAction); @@ -148,6 +150,7 @@ type procedure RevertClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject); procedure SaveAsClick(Sender: TObject); + procedure SortFilesMenuItemClick(Sender: TObject); procedure UninstallClick(Sender: TObject); procedure UseMaxVersionCheckBoxClick(Sender: TObject); procedure UseMinVersionCheckBoxClick(Sender: TObject); @@ -181,6 +184,8 @@ type procedure DoCompile(CompileClean, CompileRequired: boolean); procedure DoRevert; procedure DoPublishProject; + procedure DoMoveCurrentFile(Offset: integer); + procedure DoSortFiles; public property LazPackage: TLazPackage read FLazPackage write SetLazPackage; end; @@ -406,6 +411,8 @@ var CurDependency: TPkgDependency; Removed: boolean; CurFile: TPkgFile; + Writable: Boolean; + FileIndex: Integer; function AddPopupMenuItem(const ACaption: string; AnEvent: TNotifyEvent; EnabledFlag: boolean): TMenuItem; @@ -459,16 +466,23 @@ var begin ItemCnt:=0; CurDependency:=GetCurrentDependency(Removed); + Writable:=(not LazPackage.ReadOnly); if CurDependency=nil then CurFile:=GetCurrentFile(Removed) else CurFile:=nil; if CurFile<>nil then begin + FileIndex:=LazPackage.IndexOfPkgFile(CurFile); if not Removed then begin AddPopupMenuItem(lisOpenFile, @OpenFileMenuItemClick, true); AddPopupMenuItem(lisPckEditRemoveFile, @RemoveBitBtnClick, RemoveBitBtn.Enabled); + AddPopupMenuItem('Move file up', @MoveFileUpMenuItemClick, + (FileIndex>0) and Writable); + AddPopupMenuItem('Move file down', @MoveFileDownMenuItemClick, + (FileIndexnil) - and (not LazPackage.ReadOnly)); + and Writable); AddPopupMenuItem(lisPckEditMoveDependencyDown, @MoveDependencyDownClick, (CurDependency.NextRequiresDependency<>nil) - and (not LazPackage.ReadOnly)); + and Writable); end else begin AddPopupMenuItem(lisMenuOpenPackage, @OpenFileMenuItemClick, true); AddPopupMenuItem(lisPckEditReAddDependency, @ReAddMenuItemClick, @@ -597,6 +611,16 @@ begin FilesTreeView.EndUpdate; end; +procedure TPackageEditorForm.MoveFileUpMenuItemClick(Sender: TObject); +begin + DoMoveCurrentFile(-1); +end; + +procedure TPackageEditorForm.MoveFileDownMenuItemClick(Sender: TObject); +begin + DoMoveCurrentFile(1); +end; + procedure TPackageEditorForm.OpenFileMenuItemClick(Sender: TObject); var CurNode: TTreeNode; @@ -759,6 +783,11 @@ begin DoSave(true); end; +procedure TPackageEditorForm.SortFilesMenuItemClick(Sender: TObject); +begin + DoSortFiles; +end; + procedure TPackageEditorForm.UninstallClick(Sender: TObject); begin PackageEditors.UninstallPackage(LazPackage); @@ -1778,6 +1807,37 @@ begin UpdateAll; end; +procedure TPackageEditorForm.DoMoveCurrentFile(Offset: integer); +var + Removed: boolean; + CurFile: TPkgFile; + OldIndex: Integer; + NewIndex: Integer; + TreeSelection: TStringList; +begin + CurFile:=GetCurrentFile(Removed); + if (CurFile=nil) or Removed then exit; + OldIndex:=LazPackage.IndexOfPkgFile(CurFile); + NewIndex:=OldIndex+Offset; + if (NewIndex<0) or (NewIndex>=LazPackage.FileCount) then exit; + TreeSelection:=StoreCurrentTreeSelection; + LazPackage.MoveFile(OldIndex,NewIndex); + UpdateFiles; + ApplyTreeSelection(TreeSelection,true); + UpdateButtons; + UpdateStatusBar; +end; + +procedure TPackageEditorForm.DoSortFiles; +var + TreeSelection: TStringList; +begin + TreeSelection:=StoreCurrentTreeSelection; + LazPackage.SortFiles; + UpdateAll; + ApplyTreeSelection(TreeSelection,true); +end; + constructor TPackageEditorForm.Create(TheOwner: TComponent); begin inherited Create(TheOwner);