blob: 980d6ae50af6d77d60305b08bba2026b595c48a4 [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.ui.EditableModel;
import com.intellij.util.ui.ElementProducer;
import com.intellij.util.ui.ListTableModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* @author Konstantin Bulenkov
*/
class TableToolbarDecorator extends ToolbarDecorator {
private final JTable myTable;
@Nullable private final ElementProducer<?> myProducer;
TableToolbarDecorator(@NotNull JTable table, @Nullable final ElementProducer<?> producer) {
myTable = table;
myProducer = producer;
myAddActionEnabled = myRemoveActionEnabled = myUpActionEnabled = myDownActionEnabled = isModelEditable();
if (isModelEditable()) {
createDefaultTableActions(producer);
}
myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
updateButtons();
}
});
myTable.addPropertyChangeListener("enabled", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateButtons();
}
});
}
@Override
protected JComponent getComponent() {
return myTable;
}
@Override
protected void updateButtons() {
final CommonActionsPanel p = getActionsPanel();
if (p != null) {
boolean someElementSelected;
if (myTable.isEnabled()) {
final int index = myTable.getSelectedRow();
final int size = myTable.getModel().getRowCount();
someElementSelected = 0 <= index && index < size;
if (someElementSelected) {
final boolean downEnable = myTable.getSelectionModel().getMaxSelectionIndex() < size - 1;
final boolean upEnable = myTable.getSelectionModel().getMinSelectionIndex() > 0;
final boolean editEnabled = myTable.getSelectedRowCount() == 1;
p.setEnabled(CommonActionsPanel.Buttons.EDIT, editEnabled);
p.setEnabled(CommonActionsPanel.Buttons.UP, upEnable);
p.setEnabled(CommonActionsPanel.Buttons.DOWN, downEnable);
}
else {
p.setEnabled(CommonActionsPanel.Buttons.EDIT, false);
p.setEnabled(CommonActionsPanel.Buttons.UP, false);
p.setEnabled(CommonActionsPanel.Buttons.DOWN, false);
}
p.setEnabled(CommonActionsPanel.Buttons.ADD, myProducer == null || myProducer.canCreateElement());
}
else {
someElementSelected = false;
p.setEnabled(CommonActionsPanel.Buttons.ADD, false);
p.setEnabled(CommonActionsPanel.Buttons.EDIT, false);
p.setEnabled(CommonActionsPanel.Buttons.UP, false);
p.setEnabled(CommonActionsPanel.Buttons.DOWN, false);
}
p.setEnabled(CommonActionsPanel.Buttons.REMOVE, someElementSelected);
updateExtraElementActions(someElementSelected);
}
}
private void createDefaultTableActions(@Nullable final ElementProducer<?> producer) {
final JTable table = myTable;
final EditableModel tableModel = (EditableModel)table.getModel();
myAddAction = new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
TableUtil.stopEditing(table);
final int rowCount = table.getRowCount();
if (tableModel instanceof ListTableModel && producer != null) {
//noinspection unchecked
((ListTableModel)tableModel).addRow(producer.createElement());
} else {
tableModel.addRow();
}
if (rowCount == table.getRowCount()) return;
final int index = table.getModel().getRowCount() - 1;
table.setRowSelectionInterval(index, index);
table.setColumnSelectionInterval(0, 0);
table.editCellAt(index, 0);
boolean temporaryHideVerticalScrollBar = table.getCellEditor() instanceof Animated;
TableUtil.updateScroller(table, temporaryHideVerticalScrollBar);
//noinspection SSBasedInspection
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final Component editorComponent = table.getEditorComponent();
if (editorComponent != null) {
final Rectangle bounds = editorComponent.getBounds();
table.scrollRectToVisible(bounds);
editorComponent.requestFocus();
}
}
});
}
};
myRemoveAction = new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
if (TableUtil.doRemoveSelectedItems(table, tableModel, null)) {
updateButtons();
table.requestFocus();
TableUtil.updateScroller(table, false);
}
}
};
myUpAction = new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
final int row = table.getEditingRow();
final int col = table.getEditingColumn();
TableUtil.stopEditing(table);
final int[] indexes = table.getSelectedRows();
for (int index : indexes) {
if (0 < index && index < table.getModel().getRowCount()) {
tableModel.exchangeRows(index, index - 1);
table.setRowSelectionInterval(index - 1, index - 1);
}
}
table.requestFocus();
if (row > 0 && col != -1) {
table.editCellAt(row - 1, col);
}
}
};
myDownAction = new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
final int row = table.getEditingRow();
final int col = table.getEditingColumn();
TableUtil.stopEditing(table);
final int[] indexes = table.getSelectedRows();
for (int index : indexes) {
if (0 <= index && index < table.getModel().getRowCount() - 1) {
tableModel.exchangeRows(index, index + 1);
table.setRowSelectionInterval(index + 1, index + 1);
}
}
table.requestFocus();
if (row < table.getRowCount() - 1 && col != -1) {
table.editCellAt(row + 1, col);
}
}
};
}
@Override
protected void installDnDSupport() {
RowsDnDSupport.install(myTable, (EditableModel)myTable.getModel());
}
@Override
protected boolean isModelEditable() {
return myTable.getModel() instanceof EditableModel;
}
}