package org.intellij.sonar.configuration.partials; import static org.intellij.sonar.persistence.SonarServers.NO_SONAR; import java.awt.*; import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import javax.swing.*; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.ui.TableUtil; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.table.TableView; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; import org.intellij.sonar.configuration.ResourcesSelectionConfigurable; import org.jetbrains.annotations.Nullable; import org.sonar.wsclient.services.Resource; public class SonarResourcesTableView { private final TableView<Resource> mySonarResourcesTable; private final JComponent myJComponent; private final SonarServersView mySonarServersView; private final Project myProject; private static final ColumnInfo<Resource,String> TYPE_COLUMN = new ColumnInfo<Resource,String>("Type") { @Nullable @Override public String valueOf(Resource sonarResource) { if (Resource.QUALIFIER_PROJECT.equals(sonarResource.getQualifier())) { return "Project"; } else if (Resource.QUALIFIER_MODULE.equals(sonarResource.getQualifier())) { return "Module"; } else { return sonarResource.getQualifier(); } } }; private static final ColumnInfo<Resource,String> NAME_COLUMN = new ColumnInfo<Resource,String>("Name") { @Nullable @Override public String valueOf(Resource sonarResource) { return sonarResource.getName(); } }; private static final ColumnInfo<Resource,String> KEY_COLUMN = new ColumnInfo<Resource,String>("Key") { @Nullable @Override public String valueOf(Resource sonarResource) { return sonarResource.getKey(); } }; public SonarResourcesTableView(Project project,SonarServersView sonarServersView) { this.mySonarServersView = sonarServersView; this.mySonarResourcesTable = new TableView<Resource>(); this.myJComponent = createJComponent(); this.myProject = project; } private JComponent createJComponent() { JPanel panelForTable = ToolbarDecorator.createDecorator(mySonarResourcesTable,null). setAddAction( anActionButton -> { final String selectedSonarServerName = Optional.ofNullable(mySonarServersView.getSelectedItem()) .orElse(NO_SONAR); if (!NO_SONAR.equals(selectedSonarServerName)) { ResourcesSelectionConfigurable dlg = new ResourcesSelectionConfigurable( myProject, selectedSonarServerName ); dlg.show(); if (dlg.isOK()) { final List<Resource> selectedSonarResources = dlg.getSelectedSonarResources(); final List<Resource> currentSonarResources = mySonarResourcesTable.getItems(); Set<Resource> mergedSonarResourcesAsSet = new TreeSet<>( Comparator.comparing(Resource::getKey) ); mergedSonarResourcesAsSet.addAll(currentSonarResources); mergedSonarResourcesAsSet.addAll(selectedSonarResources); setModel(Lists.newArrayList(mergedSonarResourcesAsSet)); } } } ). setRemoveAction( anActionButton -> TableUtil.removeSelectedItems(mySonarResourcesTable) ) .disableUpDownActions() .createPanel(); panelForTable.setPreferredSize(new Dimension(-1,100)); return panelForTable; } public void setModel(List<Resource> sonarResources) { mySonarResourcesTable.setModelAndUpdateColumns( new ListTableModel<Resource>( new ColumnInfo[]{ NAME_COLUMN, KEY_COLUMN, TYPE_COLUMN },sonarResources,0 ) ); } public TableView<Resource> getTable() { return mySonarResourcesTable; } public JComponent getComponent() { return myJComponent; } }