/* * Copyright 2010-2015 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.jetbrains.kotlin.idea.k2jsrun; import com.intellij.ide.browsers.BrowserFamily; import com.intellij.ide.browsers.WebBrowser; import com.intellij.ide.browsers.WebBrowserManager; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.ui.JBColor; import com.intellij.ui.ListCellRendererWrapper; import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import static com.intellij.openapi.util.io.FileUtil.toSystemIndependentName; public final class K2JSRunConfigurationEditor extends SettingsEditor<K2JSRunConfiguration> { private JPanel mainPanel; private TextFieldWithBrowseButton htmlChooseFile; private JComboBox browserComboBox; private JCheckBox openInBrowserCheckBox; private TextFieldWithBrowseButton generatedChooseFile; private JLabel chooseBrowserLabel; private JLabel htmlFileLabel; @NotNull private final Project project; public K2JSRunConfigurationEditor(@NotNull Project project) { this.project = project; } @Override protected void resetEditorFrom(@NotNull K2JSRunConfiguration configuration) { htmlChooseFile.setText(toSystemIndependentName(configuration.settings().getPageToOpenFilePath())); browserComboBox.setSelectedItem(configuration.settings().getBrowserFamily()); generatedChooseFile.setText(toSystemIndependentName(configuration.settings().getGeneratedFilePath())); openInBrowserCheckBox.setSelected(configuration.settings().isShouldOpenInBrowserAfterTranslation()); } @Override protected void applyEditorTo(@NotNull K2JSRunConfiguration configuration) throws ConfigurationException { K2JSConfigurationSettings settings = configuration.settings(); settings.setPageToOpenFilePath(toSystemIndependentName(htmlChooseFile.getText())); Object item = browserComboBox.getSelectedItem(); if (item instanceof BrowserFamily) { settings.setBrowserFamily((BrowserFamily) item); } settings.setGeneratedFilePath(toSystemIndependentName(generatedChooseFile.getText())); settings.setShouldOpenInBrowserAfterTranslation(openInBrowserCheckBox.isSelected()); } @NotNull @Override protected JComponent createEditor() { setUpShowInBrowserCheckBox(); setUpChooseHtmlToShow(); setUpBrowserCombobox(); setUpChooseGenerateFilePath(); return mainPanel; } private void setUpChooseGenerateFilePath() { FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.getDirectoryChooserDescriptor("directory where generated files will be stored"); fileChooserDescriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots()); generatedChooseFile.addBrowseFolderListener(null, null, project, fileChooserDescriptor); final JTextField textField = generatedChooseFile.getTextField(); textField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(@NotNull DocumentEvent e) { onChange(); } @Override public void removeUpdate(@NotNull DocumentEvent e) { onChange(); } @Override public void changedUpdate(@NotNull DocumentEvent e) { onChange(); } private void onChange() { File file = new File(generatedChooseFile.getText()); if (!file.isDirectory()) { textField.setForeground(JBColor.red); } else { textField.setForeground(JBColor.foreground()); } } }); } private void setUpShowInBrowserCheckBox() { openInBrowserCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(@NotNull ItemEvent e) { boolean selected = openInBrowserCheckBox.isSelected(); htmlChooseFile.setEnabled(selected); browserComboBox.setEnabled(selected); htmlFileLabel.setEnabled(selected); chooseBrowserLabel.setEnabled(selected); } }); } private void setUpChooseHtmlToShow() { FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileDescriptor(StdFileTypes.HTML); fileChooserDescriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots()); htmlChooseFile.addBrowseFolderListener("Choose file to show after translation is finished", null, project, fileChooserDescriptor); } private void setUpBrowserCombobox() { for (WebBrowser browser : WebBrowserManager.getInstance().getActiveBrowsers()) { browserComboBox.addItem(browser.getFamily()); } browserComboBox.setRenderer(new ListCellRendererWrapper<BrowserFamily>() { @Override public void customize(JList list, BrowserFamily family, int index, boolean selected, boolean hasFocus) { if (family != null) { setText(family.getName()); setIcon(family.getIcon()); } } }); if (browserComboBox.getItemCount() < 2) { browserComboBox.setVisible(false); browserComboBox.setVisible(false); } else { browserComboBox.setSelectedItem(0); } } @Override protected void disposeEditor() { // do nothing } }