IDEA-74499 Remember the last visited root and use it if no files are selected and...
authorKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Mon, 30 Jan 2012 06:39:07 +0000 (10:39 +0400)
committerKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Mon, 30 Jan 2012 06:39:07 +0000 (10:39 +0400)
If there are no information about recently visited roots, get the project root if exists.

plugins/git4idea/src/git4idea/config/GitVcsSettings.java
plugins/git4idea/src/git4idea/ui/branch/GitBranchUiUtil.java
plugins/git4idea/src/git4idea/ui/branch/GitBranchWidget.java

index f9bdce89f99172d0285ed84e69d3faa11d74abd8..b05c7370d1f84eb634cc0eeecacff48ce46eddea 100644 (file)
@@ -69,6 +69,7 @@ public class GitVcsSettings implements PersistentStateComponent<GitVcsSettings.S
     public ConversionPolicy LINE_SEPARATORS_CONVERSION = ConversionPolicy.CONVERT;
     public boolean PUSH_AUTO_UPDATE = false;
     public GitBranchSyncSetting SYNC_SETTING = GitBranchSyncSetting.NOT_DECIDED;
+    public String RECENT_GIT_ROOT_PATH = null;
   }
 
   public GitVcsSettings(GitVcsApplicationSettings appSettings) {
@@ -162,5 +163,13 @@ public class GitVcsSettings implements PersistentStateComponent<GitVcsSettings.S
     myState.SYNC_SETTING = syncSetting;
   }
 
+  @Nullable
+  public String getRecentRootPath() {
+    return myState.RECENT_GIT_ROOT_PATH;
+  }
+
+  public void setRecentRoot(@NotNull String recentGitRootPath) {
+    myState.RECENT_GIT_ROOT_PATH = recentGitRootPath;
+  }
 
 }
index fdf01d69831fbb4739820b043bda98d5604d7537..93d89b800a1c493a1ff10c1f346408ebc751d003 100644 (file)
@@ -25,12 +25,15 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.ProjectLevelVcsManager;
+import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.wm.StatusBar;
 import com.intellij.openapi.wm.WindowManager;
 import com.intellij.openapi.wm.impl.status.StatusBarUtil;
+import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitBranch;
 import git4idea.GitVcs;
+import git4idea.config.GitVcsSettings;
 import git4idea.repo.GitRepository;
 import git4idea.repo.GitRepositoryManager;
 import git4idea.validators.GitNewBranchNameValidator;
@@ -184,8 +187,34 @@ public class GitBranchUiUtil {
       return gitRoots[0];
     }
 
-    // TODO: remember last git root we have worked with
-    return null;
+    // remember the last visited Git root
+    GitVcsSettings settings = GitVcsSettings.getInstance(project);
+    if (settings != null) {
+      String recentRootPath = settings.getRecentRootPath();
+      if (recentRootPath != null) {
+        VirtualFile recentRoot = VcsUtil.getVirtualFile(recentRootPath);
+        if (recentRoot != null) {
+          return recentRoot;
+        }
+      }
+    }
+
+    // otherwise return the root of the project dir or the root containing the project dir, if there is such
+    VirtualFile projectBaseDir = project.getBaseDir();
+    if (projectBaseDir == null) {
+      return null;
+    }
+    VirtualFile rootCandidate = null;
+    for (VirtualFile root : gitRoots) {
+      if (root.equals(projectBaseDir)) {
+        return root;
+      }
+      else if (VfsUtilCore.isAncestor(root, projectBaseDir, true)) {
+        rootCandidate = root;
+      }
+    }
+    
+    return rootCandidate;
   }
 
 }
index 25804ca3f4280bf4895142ca6099a2bac7ef10bf..dcd5cd44336068b63f6986d756d0ced8b7469a81 100644 (file)
@@ -25,6 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.wm.StatusBarWidget;
 import com.intellij.openapi.wm.impl.status.EditorBasedWidget;
 import com.intellij.util.Consumer;
+import git4idea.config.GitVcsSettings;
 import git4idea.repo.GitRepository;
 import git4idea.repo.GitRepositoryChangeListener;
 import git4idea.repo.GitRepositoryManager;
@@ -39,14 +40,14 @@ import java.awt.event.MouseEvent;
 public class GitBranchWidget extends EditorBasedWidget implements StatusBarWidget.MultipleTextValuesPresentation,
                                                                   StatusBarWidget.Multiframe,
                                                                   GitRepositoryChangeListener {
-  private final GitRepositoryManager myRepositoryManager;
+  private final GitVcsSettings mySettings;
   private volatile String myText = "";
   private volatile String myTooltip = "";
 
   public GitBranchWidget(Project project) {
     super(project);
-    myRepositoryManager = GitRepositoryManager.getInstance(project);
-    myRepositoryManager.addListenerToAllRepositories(this);
+    GitRepositoryManager.getInstance(project).addListenerToAllRepositories(this);
+    mySettings = GitVcsSettings.getInstance(project);
   }
 
   @Override
@@ -95,7 +96,7 @@ public class GitBranchWidget extends EditorBasedWidget implements StatusBarWidge
     if (repo == null) {
       return null;
     }
-    return GitBranchPopup.getInstance(getProject(), repo).asListPopup();
+    return GitBranchPopup.getInstance(project, repo).asListPopup();
   }
 
   @Override
@@ -144,6 +145,7 @@ public class GitBranchWidget extends EditorBasedWidget implements StatusBarWidge
         myText = GitBranchUiUtil.getDisplayableBranchText(repo);
         myTooltip = getDisplayableBranchTooltip(repo);
         myStatusBar.updateWidget(ID());
+        mySettings.setRecentRoot(repo.getRoot().getPath());
       }
     });
   }