diff --git a/uppsrc/ide/Common/Common.h b/uppsrc/ide/Common/Common.h index bdaf050fc..0aa1552fd 100644 --- a/uppsrc/ide/Common/Common.h +++ b/uppsrc/ide/Common/Common.h @@ -99,4 +99,6 @@ void SerializeWorkspaceConfigs(Stream& s); extern bool IdeExit; +bool CopyFolder(const char *dst, const char *src, Progress *pi = NULL); + #endif diff --git a/uppsrc/ide/Common/Util.cpp b/uppsrc/ide/Common/Util.cpp index 09977756b..e49e79d7f 100644 --- a/uppsrc/ide/Common/Util.cpp +++ b/uppsrc/ide/Common/Util.cpp @@ -219,3 +219,27 @@ INITBLOCK { } bool IdeExit; + +bool CopyFolder(const char *dst, const char *src, Progress *pi) +{ + if(strcmp(src, dst) == 0) + return true; + RealizeDirectory(dst); + if(pi) + pi->SetText(dst); + FindFile ff(AppendFileName(src, "*")); + while(ff) { + if(pi && pi->StepCanceled()) + return false; + String s = AppendFileName(src, ff.GetName()); + String d = AppendFileName(dst, ff.GetName()); + if(ff.IsFolder()) + if(!CopyFolder(d, s, pi)) + return false; + if(ff.IsFile()) + if(!SaveFile(d, LoadFile(s))) + return false; + ff.Next(); + } + return true; +} diff --git a/uppsrc/ide/Install.cpp b/uppsrc/ide/Install.cpp index c5320c464..087d2e60b 100644 --- a/uppsrc/ide/Install.cpp +++ b/uppsrc/ide/Install.cpp @@ -249,29 +249,6 @@ bool Install() #else -bool CopyFolder(const char *dst, const char *src, Progress *pi) -{ - if(strcmp(src, dst) == 0) - return true; - RealizeDirectory(dst); - if(pi) - pi->SetText(dst); - FindFile ff(AppendFileName(src, "*")); - while(ff) { - if(pi && pi->StepCanceled()) - return false; - String s = AppendFileName(src, ff.GetName()); - String d = AppendFileName(dst, ff.GetName()); - if(ff.IsFolder()) - if(!CopyFolder(d, s, pi)) - return false; - if(ff.IsFile()) - SaveFile(d, LoadFile(s)); - ff.Next(); - } - return true; -} - bool CopyFolder(Progress& pi, const char *dst, const char *src) { return CopyFolder(dst, src, &pi); diff --git a/uppsrc/ide/SelectPkg.cpp b/uppsrc/ide/SelectPkg.cpp index aea829902..28d4c3774 100644 --- a/uppsrc/ide/SelectPkg.cpp +++ b/uppsrc/ide/SelectPkg.cpp @@ -11,23 +11,31 @@ void SelectPackageDlg::PackageMenu(Bar& menu) bool b = GetCurrentName().GetCount(); menu.Add("New package..", THISBACK(OnNew)); menu.Separator(); - menu.Add(b, "Rename package..", THISBACK(RenamePackage)); + menu.Add(b, "Duplicate package..", [=] { RenamePackage(true); }); + menu.Add(b, "Rename package..", [=] { RenamePackage(false); }); menu.Add(b, "Delete package", THISBACK(DeletePackage)); } -bool RenamePackageFs(const String& upp, const String& newname) +bool RenamePackageFs(const String& upp, const String& newname, bool duplicate) { if(IsNull(newname)) { Exclamation("Wrong name."); return false; } - if(FileExists(PackagePath(newname))) { + String pf = GetFileFolder(upp); + String npf = AppendFileName(GetFileFolder(pf), newname); + if(DirectoryExists(npf)) { Exclamation("Package [* \1" + newname + "\1] already exists!"); return false; } - String pf = GetFileFolder(upp); - String npf = GetPackagePathNest(pf) + "/" + newname; - RealizePath(npf); + if(duplicate) { + if(!CopyFolder(npf, pf)) { + DeleteFolderDeep(npf); + Exclamation("Duplicating package folder has failed."); + return false; + } + } + else if(!FileMove(pf, npf)) { Exclamation("Renaming package folder has failed."); return false; @@ -40,22 +48,17 @@ bool RenamePackageFs(const String& upp, const String& newname) return true; } -void SelectPackageDlg::RenamePackage() +void SelectPackageDlg::RenamePackage(bool duplicate) { String n = GetCurrentName(); if(IsNull(n)) return; - WithRenamePackageLayout dlg; - CtrlLayoutOKCancel(dlg, "Rename package"); - dlg.name.SetFilter(FilterPackageName); - dlg.name <<= n; - dlg.name.SelectAll(); again: - if(dlg.Execute() != IDOK) + if(!EditText(n, duplicate ? "Duplicate package:" : "Rename package", "Name", FilterPackageName)) return; - if(!RenamePackageFs(PackagePath(GetCurrentName()), ~dlg.name)) + if(!RenamePackageFs(PackagePath(GetCurrentName()), n, duplicate)) goto again; - Load(); + Load(n); } void SelectPackageDlg::DeletePackage() @@ -117,7 +120,7 @@ SelectPackageDlg::SelectPackageDlg(const char *title, bool selectvars_, bool mai progress.Hide(); brief <<= THISBACK(SyncBrief); search.NullText("Search (Ctrl+K)", StdFont().Italic(), SColorDisabled()); - search <<= THISBACK(SyncList); + search << [=] { SyncList(Null); }; search.SetFilter(CharFilterDefaultToUpperAscii); SyncBrief(); description.NullText("Package description (Alt+Enter)", StdFont().Italic(), SColorDisabled()); @@ -264,7 +267,7 @@ void SelectPackageDlg::OnCancel() void SelectPackageDlg::OnFilter() { - SyncList(); + SyncList(Null); } void SelectPackageDlg::OnBase() @@ -411,9 +414,9 @@ struct PackageDisplay : Display { PackageDisplay() { fnt = StdFont(); } }; -void SelectPackageDlg::SyncList() +void SelectPackageDlg::SyncList(const String& find) { - String n = GetCurrentName(); + String n = Nvl(find, GetCurrentName()); int asc = alist.GetScroll(); int csc = clist.GetSbPos(); @@ -483,7 +486,7 @@ String SelectPackageDlg::CachePath(const char *vn) const return AppendFileName(ConfigFile("cfg"), String(vn) + ".pkg_cache"); } -void SelectPackageDlg::Load() +void SelectPackageDlg::Load(const String& find) { if(selectvars && !base.IsCursor()) return; @@ -523,7 +526,7 @@ void SelectPackageDlg::Load() if(!IsSplashOpen() && !IsOpen()) Open(); progress++; - SyncList(); + SyncList(find); update = msecs(); } ProcessEvents(); // keep GUI running @@ -532,7 +535,7 @@ void SelectPackageDlg::Load() String path = nest.GetKey(i); if(NormalizePath(path).StartsWith(nest_dir) && DirectoryExists(path)) { String upp_path = AppendFileName(path, GetFileName(d.package) + ".upp"); - LSLOW(); + LSLOW(); // this is used for testing only, normally it is NOP Time tm = FileGetTime(upp_path); if(IsNull(tm)) // .upp file does not exist - not a package d.ispackage = false; @@ -578,7 +581,7 @@ void SelectPackageDlg::Load() description.Show(); if(loading) { loading = false; - SyncList(); + SyncList(find); } } } diff --git a/uppsrc/ide/SrcUpdater/Install.cpp b/uppsrc/ide/SrcUpdater/Install.cpp index a6a88cc6f..d92460e53 100644 --- a/uppsrc/ide/SrcUpdater/Install.cpp +++ b/uppsrc/ide/SrcUpdater/Install.cpp @@ -4,7 +4,6 @@ #define IMAGEFILE #include -bool CopyFolder(const char *dst, const char *src, Progress *pi); bool LoadVarFile(const char *name, VectorMap& _var); bool HasSvn(){ diff --git a/uppsrc/ide/UppDlg.h b/uppsrc/ide/UppDlg.h index 55ef1b1d6..ae66cf31e 100644 --- a/uppsrc/ide/UppDlg.h +++ b/uppsrc/ide/UppDlg.h @@ -196,16 +196,17 @@ struct SelectPackageDlg : public WithListLayout { const String& nest, Index& dir_exists, const String& prefix); String CachePath(const char *vn) const; - void Load(); + void Load(const String& find = Null); void SyncBase(String initvars); - void SyncList(); + void SyncList(const String& find); static bool Pless(const SelectPackageDlg::PkInfo& a, const SelectPackageDlg::PkInfo& b); Vector GetSvnDirs(); void SyncSvnDir(const String& dir); void SyncSvnDirs(); - void RenamePackage(); + void DuplicatePackage(); + void RenamePackage(bool duplicate); void DeletePackage(); void PackageMenu(Bar& bar); @@ -214,7 +215,7 @@ struct SelectPackageDlg : public WithListLayout { }; }; -bool RenamePackageFs(const String& upp, const String& newname); +bool RenamePackageFs(const String& upp, const String& newname, bool duplicate = false); String SelectPackage(const char *title, const char *startwith = NULL, bool selectvars = false, bool all = false);