blob: f8cc8a878f60e710390232b84aceee786d727f0f [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* 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 com.android.tools.idea.run.deployment;
import com.google.common.annotations.VisibleForTesting;
import com.intellij.ui.table.JBTable;
import com.intellij.util.ui.JBUI;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.OptionalInt;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import org.jetbrains.annotations.NotNull;
final class ModifyDeviceSetDialogTable extends JBTable {
ModifyDeviceSetDialogTable() {
JTableHeader header = getTableHeader();
header.setReorderingAllowed(false);
header.setResizingAllowed(false);
setDefaultEditor(Boolean.class, new BooleanTableCellEditor());
setRowHeight(JBUI.scale(40));
setRowSelectionAllowed(false);
}
@NotNull
List<Device> getSelectedDevices() {
return IntStream.range(0, getRowCount())
.filter(this::isSelected)
.mapToObj(this::getDeviceAt)
.collect(Collectors.toList());
}
void setSelectedDevices(@NotNull Collection<Key> keys) {
IntStream.range(0, getRowCount())
.filter(viewRowIndex -> keys.contains(getDeviceAt(viewRowIndex).getKey()))
.forEach(viewRowIndex -> setSelected(true, viewRowIndex));
}
boolean isSelected(int viewRowIndex) {
return (boolean)dataModel.getValueAt(convertRowIndexToModel(viewRowIndex), ModifyDeviceSetDialogTableModel.SELECTED_MODEL_COLUMN_INDEX);
}
@VisibleForTesting
void setSelected(@SuppressWarnings("SameParameterValue") boolean selected, int viewRowIndex) {
dataModel.setValueAt(selected, convertRowIndexToModel(viewRowIndex), ModifyDeviceSetDialogTableModel.SELECTED_MODEL_COLUMN_INDEX);
}
@NotNull
private Device getDeviceAt(int viewRowIndex) {
return ((ModifyDeviceSetDialogTableModel)dataModel).getDeviceAt(convertRowIndexToModel(viewRowIndex));
}
@NotNull
@VisibleForTesting
List<List<Object>> getData() {
List<List<Object>> data = new ArrayList<>(1 + getRowCount());
List<Object> columnNames = IntStream.range(0, getColumnCount())
.mapToObj(this::getColumnName)
.collect(Collectors.toList());
data.add(columnNames);
IntStream.range(0, getRowCount())
.mapToObj(this::getRowAt)
.forEach(data::add);
return data;
}
@NotNull
private List<Object> getRowAt(int viewRowIndex) {
return IntStream.range(0, getColumnCount())
.mapToObj(viewColumnIndex -> getValueAt(viewRowIndex, viewColumnIndex))
.collect(Collectors.toList());
}
@Override
public void setModel(@NotNull TableModel model) {
super.setModel(model);
if (tableHeader == null) {
return;
}
if (getColumnCount() == 0) {
return;
}
setSelectedAndIconColumnMaxWidthsToFit();
}
private void setSelectedAndIconColumnMaxWidthsToFit() {
setMaxWidthToFit(convertColumnIndexToView(ModifyDeviceSetDialogTableModel.SELECTED_MODEL_COLUMN_INDEX));
setMaxWidthToFit(convertColumnIndexToView(ModifyDeviceSetDialogTableModel.TYPE_MODEL_COLUMN_INDEX));
}
private void setMaxWidthToFit(int viewColumnIndex) {
OptionalInt maxPreferredWidth = IntStream.range(-1, getRowCount())
.map(viewRowIndex -> getPreferredWidth(viewRowIndex, viewColumnIndex))
.max();
maxPreferredWidth.ifPresent(getColumnModel().getColumn(viewColumnIndex)::setMaxWidth);
}
private int getPreferredWidth(int viewRowIndex, int viewColumnIndex) {
Component component;
if (viewRowIndex == -1) {
Object name = getColumnName(viewColumnIndex);
component = getTableHeader().getDefaultRenderer().getTableCellRendererComponent(this, name, false, false, -1, viewColumnIndex);
}
else {
component = prepareRenderer(getCellRenderer(viewRowIndex, viewColumnIndex), viewRowIndex, viewColumnIndex);
}
return component.getPreferredSize().width + JBUI.scale(8);
}
@Override
public void createDefaultColumnsFromModel() {
while (columnModel.getColumnCount() != 0) {
columnModel.removeColumn(columnModel.getColumn(0));
}
IntStream.range(0, dataModel.getColumnCount())
.filter(this::notAllValuesEqualEmptyString)
.mapToObj(TableColumn::new)
.forEach(this::addColumn);
}
private boolean notAllValuesEqualEmptyString(int modelColumnIndex) {
return !IntStream.range(0, dataModel.getRowCount())
.mapToObj(modelRowIndex -> dataModel.getValueAt(modelRowIndex, modelColumnIndex))
.allMatch(Predicate.isEqual(""));
}
}