package org.jetbrains.android.compiler.artifact; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.*; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBList; import com.intellij.util.ui.UIUtil; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author Eugene.Kudelevsky */ public abstract class ProGuardConfigFilesPanel extends JPanel { private final JBList myList; private CollectionListModel<String> myModel; public ProGuardConfigFilesPanel() { super(new BorderLayout()); myModel = new CollectionListModel<String>(); myList = new JBList(myModel); final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myList). setAddAction(new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { final String path = chooseFile(); if (path != null) { myModel.add(path); } } }); JPanel tablePanel = decorator.setPreferredSize(new Dimension(-1, 120)).createPanel(); tablePanel.setMinimumSize(new Dimension(-1, 120)); add(tablePanel, BorderLayout.CENTER); final JBLabel label = new JBLabel("Config file paths:"); label.setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 5, 0)); add(label, BorderLayout.NORTH); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (Component component : getComponents()) { UIUtil.setEnabled(component, enabled, true); } } private String chooseFile() { final AndroidFacet facet = getFacet(); if (facet == null) { return null; } final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor(); final VirtualFile contentRoot = AndroidRootUtil.getMainContentRoot(facet); final VirtualFile file = FileChooser.chooseFile(descriptor, this, facet.getModule().getProject(), contentRoot); return file != null ? FileUtil.toSystemDependentName(file.getPath()) : null; } @NotNull public List<String> getUrls() { final List<String> paths = getOsPaths(); if (paths.isEmpty()) { return Collections.emptyList(); } final List<String> result = new ArrayList<String>(paths.size()); for (String path : paths) { String url = VfsUtilCore.pathToUrl(FileUtil.toSystemIndependentName(path)); final String sdkHome = getCanonicalSdkHome(); if (sdkHome != null) { url = StringUtil.replace(url, sdkHome, AndroidCommonUtils.SDK_HOME_MACRO); } result.add(url); } return result; } @NotNull public List<String> getOsPaths() { return myModel.getItems(); } public void setUrls(@NotNull List<String> urls) { setOsPaths(AndroidUtils.urlsToOsPaths(urls, getCanonicalSdkHome())); } public void setOsPaths(@NotNull List<String> paths) { myModel = new CollectionListModel<String>(paths); myList.setModel(myModel); } @Nullable private String getCanonicalSdkHome() { final AndroidFacet facet = getFacet(); if (facet == null) { return null; } final Sdk sdk = ModuleRootManager.getInstance(facet.getModule()).getSdk(); if (sdk == null) { return null; } final String homePath = sdk.getHomePath(); return homePath != null ? FileUtil.toCanonicalPath(homePath) : null; } @Nullable protected abstract AndroidFacet getFacet(); }