package org.intellij.sonar.configuration.partials;
import static org.intellij.sonar.util.UIUtil.makeObj;
import java.util.Optional;
import javax.swing.*;
import com.google.common.base.Throwables;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import org.intellij.sonar.configuration.LocalAnalysisScriptConfigurable;
import org.intellij.sonar.console.SonarConsole;
import org.intellij.sonar.persistence.LocalAnalysisScript;
import org.intellij.sonar.persistence.LocalAnalysisScripts;
import org.intellij.sonar.util.UIUtil;
public abstract class LocalAnalysisScriptView {
protected final Project myProject;
protected final JComboBox myLocalAnalysisScriptComboBox;
protected final JButton myAddLocalAnalysisScriptButton;
protected final JButton myEditLocalAnalysisScriptButton;
protected final JButton myRemoveLocalAnalysisScriptButton;
public LocalAnalysisScriptView(
JComboBox localAnalysisScriptComboBox,
JButton addLocalAnalysisScriptButton,
JButton editLocalAnalysisScriptButton,
JButton removeLocalAnalysisScriptButton,
Project project
) {
this.myProject = project;
this.myLocalAnalysisScriptComboBox = localAnalysisScriptComboBox;
this.myAddLocalAnalysisScriptButton = addLocalAnalysisScriptButton;
this.myEditLocalAnalysisScriptButton = editLocalAnalysisScriptButton;
this.myRemoveLocalAnalysisScriptButton = removeLocalAnalysisScriptButton;
}
public void init() {
addActionListenersForButtons();
initComboBox();
disableEditAndRemoveButtonsIfPossible();
}
private void addActionListenersForButtons() {
myLocalAnalysisScriptComboBox.addItemListener(
itemEvent -> disableEditAndRemoveButtonsIfPossible()
);
myAddLocalAnalysisScriptButton.addActionListener(
e -> {
final LocalAnalysisScriptConfigurable dlg = showLocalAnalysisScriptConfigurableDialog();
if (dlg.isOK()) {
final LocalAnalysisScript newLocalAnalysisScript = dlg.toLocalAnalysisScript();
try {
LocalAnalysisScripts.add(newLocalAnalysisScript);
myLocalAnalysisScriptComboBox.addItem(makeObj(newLocalAnalysisScript.getName()));
UIUtil.selectComboBoxItem(myLocalAnalysisScriptComboBox,newLocalAnalysisScript.getName());
} catch (IllegalArgumentException ex) {
final String errorMessage = newLocalAnalysisScript.getName()+" already exists";
SonarConsole.get(myProject).error(errorMessage+"\n"+Throwables.getStackTraceAsString(ex));
Messages.showErrorDialog(errorMessage,"Local Analysis Script Name Error");
showLocalAnalysisScriptConfigurableDialog(newLocalAnalysisScript);
}
}
}
);
myEditLocalAnalysisScriptButton.addActionListener(
actionEvent -> {
final Object selected = myLocalAnalysisScriptComboBox.getSelectedItem();
final Optional<LocalAnalysisScript> previous = LocalAnalysisScripts.get(selected.toString());
if (!previous.isPresent()) {
Messages.showErrorDialog(selected.toString()+" is not more preset","Cannot Perform Edit");
} else {
final LocalAnalysisScriptConfigurable dlg = showLocalAnalysisScriptConfigurableDialog(previous.get());
if (dlg.isOK()) {
LocalAnalysisScript next = dlg.toLocalAnalysisScript();
try {
LocalAnalysisScripts.remove(previous.get().getName());
LocalAnalysisScripts.add(next);
myLocalAnalysisScriptComboBox.removeItem(selected);
myLocalAnalysisScriptComboBox.addItem(makeObj(next.getName()));
UIUtil.selectComboBoxItem(myLocalAnalysisScriptComboBox,next.getName());
} catch (IllegalArgumentException e) {
Messages.showErrorDialog(
selected.toString()+" cannot be saved\n\n"+Throwables.getStackTraceAsString(e),
"Cannot Perform Edit"
);
}
}
}
}
);
myRemoveLocalAnalysisScriptButton.addActionListener(
actionEvent -> {
final Object selected = myLocalAnalysisScriptComboBox.getSelectedItem();
int rc = Messages.showOkCancelDialog(
"Are you sure you want to remove "+selected.toString()+" ?",
"Remove Local Analysis Script",
Messages.getQuestionIcon()
);
if (rc == Messages.OK) {
LocalAnalysisScripts.remove(selected.toString());
myLocalAnalysisScriptComboBox.removeItem(selected);
disableEditAndRemoveButtonsIfPossible();
}
}
);
}
protected abstract void initComboBox();
protected abstract boolean editAndRemoveButtonsCanBeEnabled();
protected void disableEditAndRemoveButtonsIfPossible() {
final boolean enabled = editAndRemoveButtonsCanBeEnabled();
myEditLocalAnalysisScriptButton.setEnabled(enabled);
myRemoveLocalAnalysisScriptButton.setEnabled(enabled);
}
protected LocalAnalysisScriptConfigurable showLocalAnalysisScriptConfigurableDialog() {
return showLocalAnalysisScriptConfigurableDialog(null);
}
protected LocalAnalysisScriptConfigurable showLocalAnalysisScriptConfigurableDialog(LocalAnalysisScript
localAnalysisScript) {
final LocalAnalysisScriptConfigurable dlg = new LocalAnalysisScriptConfigurable(myProject);
if (null != localAnalysisScript)
dlg.setValuesFrom(localAnalysisScript);
dlg.show();
return dlg;
}
}