blob: 28aa8d96e24c0c13cdd87401656ac85f7dbbca2c [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* 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.intellij.ui;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.ItemRemovable;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class TableUtil {
private TableUtil() {
}
public interface ItemChecker {
boolean isOperationApplyable(@NotNull TableModel model, int row);
}
@NotNull
public static List<Object[]> removeSelectedItems(@NotNull JTable table) {
return removeSelectedItems(table, null);
}
public static void selectRows(@NotNull JTable table, @NotNull int[] viewRows) {
ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.clearSelection();
int count = table.getRowCount();
for (int row : viewRows) {
if (row >= 0 && row < count) {
selectionModel.addSelectionInterval(row, row);
}
}
}
public static void scrollSelectionToVisible(@NotNull JTable table){
ListSelectionModel selectionModel = table.getSelectionModel();
int maxSelectionIndex = selectionModel.getMaxSelectionIndex();
int minSelectionIndex = selectionModel.getMinSelectionIndex();
final int maxColumnSelectionIndex = Math.max(0, table.getColumnModel().getSelectionModel().getMinSelectionIndex());
final int minColumnSelectionIndex = Math.max(0, table.getColumnModel().getSelectionModel().getMaxSelectionIndex());
if(maxSelectionIndex == -1){
return;
}
Rectangle minCellRect = table.getCellRect(minSelectionIndex, minColumnSelectionIndex, false);
Rectangle maxCellRect = table.getCellRect(maxSelectionIndex, maxColumnSelectionIndex, false);
Point selectPoint = minCellRect.getLocation();
int allHeight = maxCellRect.y + maxCellRect.height - minCellRect.y;
allHeight = Math.min(allHeight, table.getVisibleRect().height);
table.scrollRectToVisible(new Rectangle(selectPoint, new Dimension(minCellRect.width / 2,allHeight)));
}
@NotNull
public static List<Object[]> removeSelectedItems(@NotNull JTable table, @Nullable ItemChecker applyable) {
final TableModel model = table.getModel();
if (!(model instanceof ItemRemovable)) {
throw new RuntimeException("model must be instance of ItemRemovable");
}
if (table.getSelectionModel().isSelectionEmpty()) {
return new ArrayList<Object[]>(0);
}
final List<Object[]> removedItems = new SmartList<Object[]>();
final ItemRemovable itemRemovable = (ItemRemovable)model;
final int columnCount = model.getColumnCount();
doRemoveSelectedItems(table, new ItemRemovable() {
@Override
public void removeRow(int index) {
Object[] row = new Object[columnCount];
for (int column = 0; column < columnCount; column++) {
row[column] = model.getValueAt(index, column);
}
removedItems.add(row);
itemRemovable.removeRow(index);
}
}, applyable);
return ContainerUtil.reverse(removedItems);
}
public static boolean doRemoveSelectedItems(@NotNull JTable table, @NotNull ItemRemovable itemRemovable, @Nullable ItemChecker applyable) {
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
ListSelectionModel selectionModel = table.getSelectionModel();
int minSelectionIndex = selectionModel.getMinSelectionIndex();
int maxSelectionIndex = selectionModel.getMaxSelectionIndex();
if (minSelectionIndex == -1 || maxSelectionIndex == -1) {
return false;
}
TableModel model = table.getModel();
boolean removed = false;
for (int index = maxSelectionIndex; index >= 0; index--) {
if (selectionModel.isSelectedIndex(index) && (applyable == null || applyable.isOperationApplyable(model, index))) {
itemRemovable.removeRow(index);
removed = true;
}
}
if (!removed) {
return false;
}
int count = model.getRowCount();
if (count == 0) {
table.clearSelection();
}
else if (selectionModel.getMinSelectionIndex() == -1) {
if (minSelectionIndex >= model.getRowCount()) {
selectionModel.setSelectionInterval(model.getRowCount() - 1, model.getRowCount() - 1);
}
else {
selectionModel.setSelectionInterval(minSelectionIndex, minSelectionIndex);
}
}
return true;
}
public static int moveSelectedItemsUp(@NotNull JTable table) {
if (table.isEditing()){
table.getCellEditor().stopCellEditing();
}
TableModel model = table.getModel();
ListSelectionModel selectionModel = table.getSelectionModel();
int counter = 0;
for(int row = 0; row < model.getRowCount(); row++){
if (selectionModel.isSelectedIndex(row)) {
counter++;
for (int column = 0; column < model.getColumnCount(); column++) {
Object temp = model.getValueAt(row, column);
model.setValueAt(model.getValueAt(row - 1, column), row, column);
model.setValueAt(temp, row - 1, column);
}
selectionModel.removeSelectionInterval(row, row);
selectionModel.addSelectionInterval(row - 1, row - 1);
}
}
Rectangle cellRect = table.getCellRect(selectionModel.getMinSelectionIndex(), 0, true);
if (cellRect != null) {
table.scrollRectToVisible(cellRect);
}
table.repaint();
return counter;
}
public static int moveSelectedItemsDown(@NotNull JTable table) {
if (table.isEditing()){
table.getCellEditor().stopCellEditing();
}
TableModel model = table.getModel();
ListSelectionModel selectionModel = table.getSelectionModel();
int counter = 0;
for(int row = model.getRowCount() - 1; row >= 0 ; row--){
if (selectionModel.isSelectedIndex(row)) {
counter++;
for (int column = 0; column < model.getColumnCount(); column++) {
Object temp = model.getValueAt(row, column);
model.setValueAt(model.getValueAt(row + 1, column), row, column);
model.setValueAt(temp, row + 1, column);
}
selectionModel.removeSelectionInterval(row, row);
selectionModel.addSelectionInterval(row + 1, row + 1);
}
}
Rectangle cellRect = table.getCellRect(selectionModel.getMaxSelectionIndex(), 0, true);
if (cellRect != null) {
table.scrollRectToVisible(cellRect);
}
table.repaint();
return counter;
}
public static void editCellAt(@NotNull JTable table, int row, int column) {
if (table.editCellAt(row, column)) {
final Component component = table.getEditorComponent();
if (component != null) {
component.requestFocus();
}
}
}
public static void stopEditing(@NotNull JTable table) {
if (table.isEditing()) {
final TableCellEditor cellEditor = table.getCellEditor();
if (cellEditor != null) {
cellEditor.stopCellEditing();
}
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
if (row >= 0 && column >= 0) {
TableCellEditor editor = table.getCellEditor(row, column);
if (editor != null) {
editor.stopCellEditing();
//Object value = editor.getCellEditorValue();
//
//table.setValueAt(value, row, column);
}
}
}
}
public static void ensureSelectionExists(@NotNull JTable table) {
if (table.getSelectedRow() != -1 || table.getRowCount() == 0) return;
table.setRowSelectionInterval(0, 0);
}
public static void setupCheckboxColumn(@NotNull JTable table, int columnIndex) {
setupCheckboxColumn(table.getColumnModel().getColumn(columnIndex));
}
public static void setupCheckboxColumn(@NotNull TableColumn column) {
int checkboxWidth = new JCheckBox().getPreferredSize().width;
column.setResizable(false);
column.setPreferredWidth(checkboxWidth);
column.setMaxWidth(checkboxWidth);
column.setMinWidth(checkboxWidth);
}
public static void updateScroller(@NotNull JTable table, boolean temporaryHideVerticalScrollBar) {
JScrollPane scrollPane = UIUtil.getParentOfType(JScrollPane.class, table);
if (scrollPane != null) {
if (temporaryHideVerticalScrollBar) {
final JScrollBar bar = scrollPane.getVerticalScrollBar();
if (bar == null || !bar.isVisible()) {
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
}
}
scrollPane.revalidate();
scrollPane.repaint();
}
}
}