| 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); |
| } |
| } |
| } |
| } |