package org.intellij.sonar.configuration.module;
import static org.intellij.sonar.util.UIUtil.makeObj;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Optional;
import javax.swing.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleComponent;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.vfs.VirtualFile;
import org.intellij.sonar.configuration.WorkingDirs;
import org.intellij.sonar.configuration.partials.AlternativeWorkingDirActionListener;
import org.intellij.sonar.configuration.partials.SonarResourcesTableView;
import org.intellij.sonar.persistence.ModuleSettings;
import org.intellij.sonar.persistence.Settings;
import org.intellij.sonar.util.LocalAnalysisScriptsUtil;
import org.intellij.sonar.util.SonarServersUtil;
import org.intellij.sonar.util.UIUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.sonar.wsclient.services.Resource;
public class ModuleSettingsConfigurable implements Configurable, ModuleComponent {
private final ModuleLocalAnalysisScriptView myLocalAnalysisScriptView;
private final SonarResourcesTableView mySonarResourcesTableView;
private final Module myModule;
private final Project myProject;
private final ModuleSonarServersView mySonarServersView;
private JPanel myRootJPanel;
private JPanel myPanelForSonarResources;
private JComboBox mySonarServersComboBox;
private JButton myAddSonarServerButton;
private JButton myEditSonarServerButton;
private JButton myRemoveSonarServerButton;
private JComboBox myLocalAnalysisScriptComboBox;
private JButton myAddLocalAnalysisScriptButton;
private JButton myEditLocalAnalysisScriptButton;
private JButton myRemoveLocalAnalysisScriptButton;
private JComboBox myWorkingDirComboBox;
private JCheckBox myUseAlternativeWorkingDirCheckBox;
private TextFieldWithBrowseButton myAlternativeWorkingDirTextFieldWithBrowseButton;
public ModuleSettingsConfigurable(Module module) {
this.myModule = module;
this.myProject = module.getProject();
this.myLocalAnalysisScriptView = new ModuleLocalAnalysisScriptView(
myLocalAnalysisScriptComboBox,
myAddLocalAnalysisScriptButton,
myEditLocalAnalysisScriptButton,
myRemoveLocalAnalysisScriptButton,
myProject
);
this.mySonarServersView = new ModuleSonarServersView(
mySonarServersComboBox,
myAddSonarServerButton,
myEditSonarServerButton,
myRemoveSonarServerButton,
myProject
);
this.mySonarResourcesTableView = new SonarResourcesTableView(myProject,mySonarServersView);
}
@Nls
@Override
public String getDisplayName() {
return "SonarQube";
}
@Nullable
@Override
public String getHelpTopic() {
return null;
}
@Nullable
@Override
public JComponent createComponent() {
myPanelForSonarResources.setLayout(new BorderLayout());
myPanelForSonarResources.add(mySonarResourcesTableView.getComponent(),BorderLayout.CENTER);
mySonarServersView.init();
myLocalAnalysisScriptView.init();
initWorkingDir();
initAlternativeWorkingDir();
return myRootJPanel;
}
private void initWorkingDir() {
myWorkingDirComboBox.removeAllItems();
myWorkingDirComboBox.addItem(makeObj(WorkingDirs.MODULE));
myWorkingDirComboBox.addItem(makeObj(WorkingDirs.PROJECT));
}
private void initAlternativeWorkingDir() {
final VirtualFile moduleFile = myModule.getModuleFile();
final VirtualFile projectBaseDir = myProject.getBaseDir();
final VirtualFile dirToSelect = moduleFile != null
? moduleFile.getParent()
: projectBaseDir;
myAlternativeWorkingDirTextFieldWithBrowseButton.addActionListener(
new AlternativeWorkingDirActionListener(
myProject,myAlternativeWorkingDirTextFieldWithBrowseButton,dirToSelect
)
);
processAlternativeDirSelections();
myUseAlternativeWorkingDirCheckBox.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
processAlternativeDirSelections();
}
}
);
}
private void processAlternativeDirSelections() {
myAlternativeWorkingDirTextFieldWithBrowseButton.setEnabled(myUseAlternativeWorkingDirCheckBox.isSelected());
myWorkingDirComboBox.setEnabled(!myUseAlternativeWorkingDirCheckBox.isSelected());
}
@Override
public boolean isModified() {
final ModuleSettings component = ModuleSettings.getInstance(myModule);
if (null == component) return false;
Settings state = component.getState();
return null == state || !state.equals(this.toSettings());
}
@Override
public void apply() throws ConfigurationException {
Settings settings = this.toSettings();
ModuleSettings projectSettingsComponent = ModuleSettings.getInstance(myModule);
projectSettingsComponent.loadState(settings);
}
@Override
public void reset() {
ModuleSettings moduleSettings = myModule.getComponent(ModuleSettings.class);
if (moduleSettings != null && moduleSettings.getState() != null) {
Settings persistedSettings = moduleSettings.getState();
this.setValuesFromSettings(persistedSettings);
}
}
@Override
public void disposeUIResources() {
// To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void projectOpened() {
// To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void projectClosed() {
// To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void moduleAdded() {
}
@Override
public void initComponent() {
// To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void disposeComponent() {
// To change body of implemented methods use File | Settings | File Templates.
}
@NotNull
@Override
public String getComponentName() {
return "SonarQube";
}
public Settings toSettings() {
return Settings.of(
mySonarServersComboBox.getSelectedItem().toString(),
ImmutableList.copyOf(mySonarResourcesTableView.getTable().getItems()),
myLocalAnalysisScriptComboBox.getSelectedItem().toString(),
myWorkingDirComboBox.getSelectedItem().toString(),
myAlternativeWorkingDirTextFieldWithBrowseButton.getText(),
myUseAlternativeWorkingDirCheckBox.isSelected()
);
}
public void setValuesFromSettings(Settings settings) {
if (null == settings) return;
final String serverName = SonarServersUtil.withDefaultForModule(settings.getServerName());
UIUtil.selectComboBoxItem(mySonarServersComboBox,serverName);
final ArrayList<Resource> resources = Lists.newArrayList(settings.getResources());
mySonarResourcesTableView.setModel(resources);
final String localAnalysisScripName = LocalAnalysisScriptsUtil.withDefaultForModule(settings
.getLocalAnalysisScripName());
UIUtil.selectComboBoxItem(myLocalAnalysisScriptComboBox,localAnalysisScripName);
UIUtil.selectComboBoxItem(myWorkingDirComboBox,WorkingDirs.withDefaultForModule(settings.getWorkingDirSelection()));
myAlternativeWorkingDirTextFieldWithBrowseButton.setText(settings.getAlternativeWorkingDirPath());
myUseAlternativeWorkingDirCheckBox.setSelected(
Optional.ofNullable(settings.getUseAlternativeWorkingDir()).orElse(false)
);
processAlternativeDirSelections();
}
}