encapsulate unique vfile path calculation in a service

This commit is contained in:
Dmitry Jemerov
2012-04-30 18:57:18 +02:00
parent efbc6a3c29
commit 6c82bb3bae
5 changed files with 64 additions and 22 deletions
@@ -1,14 +1,8 @@
package com.intellij.openapi.fileEditor.impl;
import com.google.common.collect.Maps;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.ProjectScope;
import java.io.File;
import java.util.*;
/**
@@ -158,19 +152,4 @@ public class UniqueNameBuilder<T> {
}
return myShortPaths.get(key);
}
public static String getUniqueVirtualFilePath(Project project, VirtualFile file) {
final Collection<VirtualFile> filesWithSameName = FilenameIndex.getVirtualFilesByName(project, file.getName(),
ProjectScope.getProjectScope(project));
if (filesWithSameName.size() > 1) {
String path = project.getBasePath();
path = path == null ? "" : FileUtil.toSystemIndependentName(path);
UniqueNameBuilder<VirtualFile> builder = new UniqueNameBuilder<VirtualFile>(path, File.separator, 25);
for (VirtualFile virtualFile: filesWithSameName) {
builder.addPath(virtualFile, virtualFile.getPath());
}
return builder.getShortPath(file);
}
return null;
}
}
@@ -1,6 +1,7 @@
package com.intellij.openapi.fileEditor.impl;
import com.intellij.ide.ui.UISettings;
import com.intellij.openapi.fileEditor.UniqueVFilePathBuilder;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
@@ -14,6 +15,6 @@ public class UniqueNameEditorTabTitleProvider implements EditorTabTitleProvider
if (!UISettings.getInstance().SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES || DumbService.isDumb(project)) {
return null;
}
return UniqueNameBuilder.getUniqueVirtualFilePath(project, file);
return UniqueVFilePathBuilder.getInstance().getUniqueVirtualFilePath(project, file);
}
}
@@ -0,0 +1,32 @@
package com.intellij.openapi.fileEditor.impl;
import com.intellij.openapi.fileEditor.UniqueVFilePathBuilder;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.ProjectScope;
import java.io.File;
import java.util.Collection;
/**
* @author yole
*/
public class UniqueVFilePathBuilderImpl extends UniqueVFilePathBuilder {
@Override
public String getUniqueVirtualFilePath(Project project, VirtualFile file) {
final Collection<VirtualFile> filesWithSameName = FilenameIndex.getVirtualFilesByName(project, file.getName(),
ProjectScope.getProjectScope(project));
if (filesWithSameName.size() > 1) {
String path = project.getBasePath();
path = path == null ? "" : FileUtil.toSystemIndependentName(path);
UniqueNameBuilder<VirtualFile> builder = new UniqueNameBuilder<VirtualFile>(path, File.separator, 25);
for (VirtualFile virtualFile: filesWithSameName) {
builder.addPath(virtualFile, virtualFile.getPath());
}
return builder.getShortPath(file);
}
return null;
}
}
@@ -0,0 +1,27 @@
package com.intellij.openapi.fileEditor;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
/**
* @author yole
*/
public abstract class UniqueVFilePathBuilder {
private static final UniqueVFilePathBuilder DUMMY_BUILDER = new UniqueVFilePathBuilder() {
@Override
public String getUniqueVirtualFilePath(Project project, VirtualFile vFile) {
return vFile.getPresentableName();
}
};
public static UniqueVFilePathBuilder getInstance() {
final UniqueVFilePathBuilder service = ServiceManager.getService(UniqueVFilePathBuilder.class);
if (service == null) {
return DUMMY_BUILDER;
}
return service;
}
public abstract String getUniqueVirtualFilePath(Project project, VirtualFile vFile);
}
@@ -165,6 +165,9 @@
<applicationService serviceInterface="com.intellij.psi.search.searches.IndexPatternSearch"
serviceImplementation="com.intellij.psi.impl.search.IndexPatternSearchImpl"/>
<applicationService serviceInterface="com.intellij.openapi.fileEditor.UniqueVFilePathBuilder"
serviceImplementation="com.intellij.openapi.fileEditor.impl.UniqueVFilePathBuilderImpl"/>
<projectService serviceInterface="com.intellij.ui.EditorTextFieldProvider"
serviceImplementation="com.intellij.ui.EditorTextFieldProviderImpl"/>