package Visual_DVM_2021.Passes.All; import Common.CurrentAnchestor; import Common.Utils.CommonUtils; import _VisualDVM.Constants; import _VisualDVM.Current; import _VisualDVM.Visual.UI; import Common.Visual.Windows.Dialog.VDirectoryChooser; import _VisualDVM.Utils; import GlobalData.DBLastProject.DBLastProject; import GlobalData.GlobalDatabase; import GlobalData.Settings.SettingName; import ProjectData.Files.LanguageStyle; import ProjectData.Project.db_project_info; import ProjectData.ProjectView; import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.Pass_2021; import java.io.File; public class OpenCurrentProject extends Pass_2021 { Mode mode = Mode.Undefined; File dir = null; boolean root_changes; db_project_info new_root = null; VDirectoryChooser directoryChooser = new VDirectoryChooser("Выбор домашней папки проекта"); @Override public String getIconPath() { return "/icons/OpenProject.png"; } @Override public String getButtonText() { return ""; } @Override protected boolean needsAnimation() { return true; } boolean needsOpen() { return !Current.HasProject() || !Current.getProject().Home.equals(dir); } //----------------- @Override protected boolean canStart(Object... args) throws Exception { mode = Mode.Directory; dir = null; target = null; if (args.length == 0) { Utils.RestoreSelectedDirectory(directoryChooser); dir = directoryChooser.ShowDialog(); } else { Object arg = args[0]; if (arg instanceof File) { dir = (File) arg; } else if (arg instanceof db_project_info) { mode = Mode.ProjectInfo; target = (db_project_info) arg; dir = target.Home; return needsOpen(); } } if ((dir != null) && needsOpen()) { if (!dir.isDirectory()) { Log.Writeln_(CommonUtils.Brackets(dir) + "\nне является папкой!"); return false; } if (dir.getName().equals(Constants.data)) { Log.Writeln_(CommonUtils.Brackets(dir) + "\nявляется служебной папкой визуализатора!"); return false; } return Utils.validateProjectFolder(dir, Log) && Utils.containsSource(dir, true); } return false; } @Override protected void performPreparation() throws Exception { passes.get(PassCode_2021.CloseCurrentProject).Do(); } @Override protected void body() throws Exception { root_changes = true; switch (mode) { case Directory: if (Current.HasRoot()) { db_project_info root = Current.getRoot(); db_project_info project = root.find_version_r(dir); if (project != null) { CommonUtils.MainLog.Print("версия найдена в текущем корне"); //версия уже существует. и выстраивать дерево второй раз не нужно. //как и отображать дерево. target = project; target.Open(); root_changes = false; return; } } target = new db_project_info(dir); new_root = target.CreateVersionsTree(); target.Open(); break; case ProjectInfo: //если нам суют версию. значит уже априори корень не сменится. root_changes = false; target.Open(); break; } } @Override protected void performDone() throws Exception { CurrentAnchestor.set(Current.Project, target); CurrentAnchestor.set(Current.ProjectView, ProjectView.Files); if (root_changes) CurrentAnchestor.set(Current.Root, new_root); Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do(SettingName.ProjectsSearchDirectory, dir.getParent()); Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do( SettingName.FREE_FORM, target.style.equals(LanguageStyle.free) ? "1" : "0") ; DBLastProject lastProject; if (((GlobalDatabase)CommonUtils.db).lastProjects.containsKey(target.Home.getAbsolutePath())) { lastProject = ((GlobalDatabase)CommonUtils.db).lastProjects.get(target.Home.getAbsolutePath()); lastProject.RefreshOpenTime(); CommonUtils.db.Update(lastProject); } else { lastProject = new DBLastProject(target); CommonUtils.db.Insert(lastProject); } target.setInfo(lastProject); } @Override protected void showDone() throws Exception { if (root_changes) UI.CreateVersionsWindow(); UI.getVersionsWindow().ShowProjectVariants(); UI.getVersionsWindow().BlockVariants(); //- UI.getMainWindow().ShowProject(); //криво. но при тихом режиме открытие файлов все равно не понадобится. passes.get(PassCode_2021.OpenCurrentFile).Do(target.getLastOpenedFile()); } @Override protected void FocusResult() { UI.getMainWindow().FocusProject(); } enum Mode { Undefined, Directory, ProjectInfo } }