package org.intellij.sonar.configuration.project; import static org.intellij.sonar.util.UIUtil.makeObj; import java.awt.*; 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.components.ProjectComponent; 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 org.intellij.sonar.configuration.WorkingDirs; import org.intellij.sonar.configuration.partials.AlternativeWorkingDirActionListener; import org.intellij.sonar.configuration.partials.SonarResourcesTableView; import org.intellij.sonar.persistence.ProjectSettings; import org.intellij.sonar.persistence.Settings; import org.intellij.sonar.persistence.SonarConsoleSettings; 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 ProjectSettingsConfigurable implements Configurable, ProjectComponent { private final ProjectSettings myProjectSettings; private final SonarConsoleSettings mySonarConsoleSettings; private final ProjectLocalAnalysisScriptView myLocalAnalysisScriptView; private final SonarResourcesTableView mySonarResourcesTableView; private final ProjectSonarServersView mySonarServersView; private Project myProject; private JPanel myRootJPanel; private JPanel myPanelForSonarResources; private JComboBox mySonarServersComboBox; private JButton myAddSonarServerButton; private JButton myEditSonarServerButton; private JButton myRemoveSonarServerButton; private JButton myAddLocalAnalysisScriptButton; private JButton myEditLocalAnalysisScriptButton; private JButton myRemoveLocalAnalysisScriptButton; private JComboBox myLocalAnalysisScriptComboBox; private JCheckBox myUseAlternativeWorkingDirCheckBox; private JComboBox myWorkingDirComboBox; private TextFieldWithBrowseButton myAlternativeWorkingDirTextFieldWithBrowseButton; private JCheckBox myShowSonarQubeToolWindowCheckBox; public ProjectSettingsConfigurable(Project project) { this.myProject = project; this.myProjectSettings = ProjectSettings.getInstance(project); this.mySonarConsoleSettings = SonarConsoleSettings.getInstance(); this.mySonarServersView = new ProjectSonarServersView( mySonarServersComboBox, myAddSonarServerButton, myEditSonarServerButton, myRemoveSonarServerButton, project ); this.myLocalAnalysisScriptView = new ProjectLocalAnalysisScriptView( myLocalAnalysisScriptComboBox, myAddLocalAnalysisScriptButton, myEditLocalAnalysisScriptButton, myRemoveLocalAnalysisScriptButton, project ); this.mySonarResourcesTableView = new SonarResourcesTableView(project,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.PROJECT)); myWorkingDirComboBox.addItem(makeObj(WorkingDirs.MODULE)); } private void initAlternativeWorkingDir() { myAlternativeWorkingDirTextFieldWithBrowseButton.addActionListener( new AlternativeWorkingDirActionListener( myProject,myAlternativeWorkingDirTextFieldWithBrowseButton,myProject.getBaseDir() ) ); processAlternativeDirSelections(); myUseAlternativeWorkingDirCheckBox.addActionListener( e -> processAlternativeDirSelections() ); } private void processAlternativeDirSelections() { myAlternativeWorkingDirTextFieldWithBrowseButton.setEnabled(myUseAlternativeWorkingDirCheckBox.isSelected()); myWorkingDirComboBox.setEnabled(!myUseAlternativeWorkingDirCheckBox.isSelected()); } @Override public boolean isModified() { return isProjectSettingsModified() || isSonarConsoleSettings(); } private boolean isProjectSettingsModified() { if (null == myProjectSettings) return false; Settings state = myProjectSettings.getState(); return null == state || !state.equals(this.toSettings()); } private boolean isSonarConsoleSettings() { if (null == mySonarConsoleSettings) return false; SonarConsoleSettings state = mySonarConsoleSettings.getState(); return null == state || !state.equals(this.toSonarConsoleSettings()); } @Override public void apply() throws ConfigurationException { myProjectSettings.loadState(this.toSettings()); mySonarConsoleSettings.loadState(this.toSonarConsoleSettings()); } @Override public void reset() { if (myProjectSettings != null && myProjectSettings.getState() != null) { Settings persistedSettings = myProjectSettings.getState(); this.setValuesFromSettings(persistedSettings); } if (mySonarConsoleSettings != null && mySonarConsoleSettings.getState() != null) { final SonarConsoleSettings persistedSettings = mySonarConsoleSettings.getState(); this.setValuesFromSonarConsoleSettings(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 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.withDefaultForProject(settings.getServerName()); UIUtil.selectComboBoxItem(mySonarServersComboBox,serverName); final ArrayList<Resource> resources = Lists.newArrayList(settings.getResources()); mySonarResourcesTableView.setModel(resources); final String localAnalysisScripName = LocalAnalysisScriptsUtil.withDefaultForProject(settings .getLocalAnalysisScripName()); UIUtil.selectComboBoxItem(myLocalAnalysisScriptComboBox,localAnalysisScripName); UIUtil.selectComboBoxItem( myWorkingDirComboBox, WorkingDirs.withDefaultForProject(settings.getWorkingDirSelection()) ); myAlternativeWorkingDirTextFieldWithBrowseButton.setText(settings.getAlternativeWorkingDirPath()); myUseAlternativeWorkingDirCheckBox.setSelected( Optional.ofNullable(settings.getUseAlternativeWorkingDir()).orElse(false) ); processAlternativeDirSelections(); } public SonarConsoleSettings toSonarConsoleSettings() { return SonarConsoleSettings.of(myShowSonarQubeToolWindowCheckBox.isSelected()); } public void setValuesFromSonarConsoleSettings(SonarConsoleSettings settings) { if (null == settings) return; myShowSonarQubeToolWindowCheckBox.setSelected(settings.isShowSonarConsoleOnAnalysis()); } }