blob: aef245b9e47864d991a2fcc880c68a5163572be2 [file] [log] [blame]
package org.jetbrains.android.projectView;
import com.android.resources.ResourceFolderType;
import com.android.tools.idea.rendering.ResourceHelper;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.ui.popup.ListPopupStep;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.EditorNotifications;
import com.intellij.util.containers.BidirectionalMap;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* @author yole
*/
public class ResourceQualifierSwitcher extends EditorNotifications.Provider<ResourceQualifierSwitcher.ResourceQualifierSwitcherPanel> {
private static final Key<ResourceQualifierSwitcherPanel> KEY = Key.create("android.projectView.QualifierSwitcherPanel");
private final Project myProject;
public ResourceQualifierSwitcher(Project project) {
myProject = project;
}
@NotNull
@Override
public Key<ResourceQualifierSwitcherPanel> getKey() {
return KEY;
}
@Nullable
@Override
public ResourceQualifierSwitcherPanel createNotificationPanel(@NotNull VirtualFile file, @NotNull FileEditor fileEditor) {
if (!ApplicationManager.getApplication().isInternal()) {
return null;
}
if (file.getFileType() != XmlFileType.INSTANCE) {
return null;
}
VirtualFile parent = file.getParent();
if (parent == null) {
return null;
}
parent = parent.getParent();
if (parent == null || !parent.getName().equals("res")) {
return null;
}
Module module = ModuleUtilCore.findModuleForFile(file, myProject);
AndroidFacet facet = module == null ? null : AndroidFacet.getInstance(module);
if (facet == null) {
return null;
}
BidirectionalMap<String, VirtualFile> qualifiers = collectQualifiers(parent, file);
if (qualifiers.size() <= 1) {
return null;
}
return new ResourceQualifierSwitcherPanel(myProject, file, qualifiers);
}
private static BidirectionalMap<String, VirtualFile> collectQualifiers(VirtualFile resDirectory, VirtualFile file) {
BidirectionalMap<String, VirtualFile> result = new BidirectionalMap<String, VirtualFile>();
ResourceFolderType type = ResourceHelper.getFolderType(file);
for (VirtualFile dir : resDirectory.getChildren()) {
ResourceFolderType otherType = ResourceFolderType.getFolderType(dir.getName());
if (otherType == type) {
VirtualFile fileWithQualifier = dir.findChild(file.getName());
if (fileWithQualifier != null) {
String childName = dir.getName();
int dashPos = childName.indexOf('-');
String qualifier = dashPos > 0 ? childName.substring(dashPos+1) : "<default>";
result.put(qualifier, fileWithQualifier);
}
}
}
return result;
}
public static class ResourceQualifierSwitcherPanel extends JPanel {
private final Project myProject;
private final VirtualFile myFile;
private final BidirectionalMap<String, VirtualFile> myQualifiers;
public ResourceQualifierSwitcherPanel(final Project project, @NotNull final VirtualFile file, BidirectionalMap<String, VirtualFile> qualifiers) {
super(new BorderLayout());
myProject = project;
myFile = file;
myQualifiers = qualifiers;
final String currentFileQualifier = qualifiers.getKeysByValue(file).get(0);
final JLabel label = new JLabel(currentFileQualifier);
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
if (event.getButton() != MouseEvent.BUTTON1 || event.getClickCount() != 1) {
return;
}
BidirectionalMap<String, VirtualFile> map = collectQualifiers(file.getParent().getParent(), file);
ListPopupStep popupStep = new BaseListPopupStep<String>("Choose Qualifier", new ArrayList<String>(map.keySet())) {
@Override
public PopupStep onChosen(String selectedValue, boolean finalChoice) {
switchToFile(selectedValue);
return FINAL_CHOICE;
}
};
ListPopup popup = JBPopupFactory.getInstance().createListPopup(popupStep);
popup.showUnderneathOf(label);
}
});
add(label, BorderLayout.WEST);
}
private void switchToFile(String qualifier) {
VirtualFile newFile = myQualifiers.get(qualifier);
if (!myFile.equals(newFile)) {
FileEditorManager.getInstance(myProject).openFile(newFile, true);
}
}
}
}