/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.napile.idea.thermit.validation; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import org.jetbrains.annotations.NonNls; import org.napile.idea.thermit.AntImportsIndex; import org.napile.idea.thermit.config.ThermitConfigurationBase; import org.napile.idea.thermit.dom.AntDomFileDescription; import com.intellij.openapi.editor.HectorComponentPanel; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlFile; import com.intellij.ui.IdeBorderFactory; import com.intellij.util.PathUtil; import com.intellij.util.indexing.FileBasedIndex; /** * @author Eugene Zhuravlev * Date: May 12, 2008 */ public class AntHectorConfigurable extends HectorComponentPanel { @NonNls private static final String NONE = "<None>"; @NonNls public static final String CONTEXTS_COMBO_KEY = "AntContextsComboBox"; private final XmlFile myFile; private final String myLocalPath; private final Map<String, XmlFile> myPathToFileMap = new HashMap<String, XmlFile>(); private String myOriginalContext = NONE; private JComboBox myCombo; private final GlobalSearchScope myFileFilter; private final Project myProject; public AntHectorConfigurable(XmlFile file) { myFile = file; myProject = file.getProject(); final VirtualFile selfVFile = myFile.getVirtualFile(); myLocalPath = PathUtil.getLocalPath(selfVFile); myFileFilter = GlobalSearchScope.projectScope(myProject); } public boolean canClose() { return !myCombo.isPopupVisible(); } public JComponent createComponent() { final JPanel panel = new JPanel(new GridBagLayout()); panel.setBorder(IdeBorderFactory.createTitledBorder("File Context", false)); myCombo = new ComboBox(); myCombo.putClientProperty(CONTEXTS_COMBO_KEY, Boolean.TRUE); panel.add(new JLabel("Included into:"), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 5, 0), 0, 0)); panel.add(myCombo, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 0), 0, 0)); final PsiManager psiManager = PsiManager.getInstance(myProject); final FileBasedIndex fbi = FileBasedIndex.getInstance(); final Collection<VirtualFile> antFiles = fbi.getContainingFiles(AntImportsIndex.INDEX_NAME, AntImportsIndex.ANT_FILES_WITH_IMPORTS_KEY, myFileFilter); for(VirtualFile file : antFiles) { final PsiFile psiFile = psiManager.findFile(file); if(!(psiFile instanceof XmlFile)) { continue; } final XmlFile xmlFile = (XmlFile) psiFile; if(!xmlFile.equals(myFile) && AntDomFileDescription.isAntFile(xmlFile)) { final String path = PathUtil.getLocalPath(file); final XmlFile previous = myPathToFileMap.put(path, xmlFile); assert previous == null; } } final List<String> paths = new ArrayList<String>(myPathToFileMap.keySet()); Collections.sort(paths, new Comparator<String>() { public int compare(final String o1, final String o2) { return o1.compareTo(o2); } }); myCombo.addItem(NONE); for(String path : paths) { myCombo.addItem(path); } final ThermitConfigurationBase antConfig = ThermitConfigurationBase.getInstance(myProject); final XmlFile currentContext = antConfig.getContextFile(myFile); if(currentContext != null) { final VirtualFile vFile = currentContext.getVirtualFile(); assert vFile != null; final String path = PathUtil.getLocalPath(vFile); if(!FileUtil.pathsEqual(path, myLocalPath)) { myOriginalContext = path; } } myCombo.setSelectedItem(myOriginalContext); return panel; } public boolean isModified() { return !FileUtil.pathsEqual(myOriginalContext, (String) myCombo.getSelectedItem()); } public void apply() throws ConfigurationException { applyItem((String) myCombo.getSelectedItem()); } public void reset() { applyItem(myOriginalContext); } private void applyItem(final String contextStr) { XmlFile context = null; if(!NONE.equals(contextStr)) { context = myPathToFileMap.get(contextStr); assert context != null; } ThermitConfigurationBase.getInstance(myProject).setContextFile(myFile, context); } public void disposeUIResources() { myPathToFileMap.clear(); } }