package com.siberika.idea.pascal.module; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleConfigurationEditor; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.roots.CollectingContentIterator; import com.intellij.openapi.roots.ModuleFileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ui.configuration.ModuleConfigurationState; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.TextBrowseFolderListener; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; import com.siberika.idea.pascal.PascalBundle; import com.siberika.idea.pascal.PascalFileType; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * Author: George Bakhtadze * Date: 14/01/2013 */ public class PascalModuleOptionsEditor implements ModuleConfigurationEditor { final ModuleConfigurationState state; final Module module; private JComponent myComponent; private TextFieldWithBrowseButton exePathEdit; private JComboBox mainFileCBox; public PascalModuleOptionsEditor(ModuleConfigurationState state, Module module) { assert PascalModuleType.isPascalModule(module); this.state = state; this.module = module; } @Override public void saveData() { } @Override public void moduleStateChanged() { } @Nls @Override public String getDisplayName() { return PascalBundle.message("ui.module.options.editor.name"); } @Nullable @Override public String getHelpTopic() { return null; } @Nullable @Override public JComponent createComponent() { if (myComponent == null) { myComponent = createComponentImpl(); } return myComponent; } private JComponent createComponentImpl() { final JPanel panel = new JPanel(new GridBagLayout()); panel.add(new JLabel(PascalBundle.message("ui.module.options.editor.mainFile.label")), new GridBagConstraints(0,0,1,1,0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(10, 6, 6, 0), 0, 0)); panel.add(new JLabel(PascalBundle.message("ui.module.options.editor.exePath.label")), new GridBagConstraints(0,1,1,1,0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(10, 6, 6, 0), 0, 0)); final ModuleFileIndex index = ModuleRootManager.getInstance(module).getFileIndex(); final List<VirtualFile> pascalFiles = new ArrayList<VirtualFile>(); index.iterateContent(new CollectingContentIterator() { @NotNull @Override public List<VirtualFile> getFiles() { return pascalFiles; } @Override public boolean processFile(VirtualFile fileOrDir) { if (fileOrDir.isValid() && !fileOrDir.isDirectory() && PascalFileType.INSTANCE.equals(fileOrDir.getFileType())) { pascalFiles.add(fileOrDir); } return true; } }); mainFileCBox = new ComboBox(pascalFiles.toArray()); panel.add(mainFileCBox, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 6, 6), 0, 0)); FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); //noinspection DialogTitleCapitalization fileChooserDescriptor.setTitle(PascalBundle.message("title.choose.directory")); exePathEdit = new TextFieldWithBrowseButton(); exePathEdit.addBrowseFolderListener(new TextBrowseFolderListener(fileChooserDescriptor)); panel.add(exePathEdit, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 6, 6), 0, 0)); return panel; } @Override public boolean isModified() { return true; } @Override public void apply() throws ConfigurationException { PascalModuleType.setMainFile(module, (VirtualFile) mainFileCBox.getSelectedItem()); PascalModuleType.setExeOutputPath(module, exePathEdit.getText()); } @Override public void reset() { mainFileCBox.setSelectedItem(PascalModuleType.getMainFile(module)); exePathEdit.setText(PascalModuleType.getExeOutputPath(module)); } @Override public void disposeUIResources() { } }