blob: 7739f825dc5d6f97b7d099dd348d86fd06b5c3d7 [file] [log] [blame]
/*
* Copyright 2000-2011 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.dualView;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Condition;
import com.intellij.ui.HighlightableCellRenderer;
import com.intellij.ui.table.ItemsProvider;
import com.intellij.ui.table.SelectionProvider;
import com.intellij.ui.treeStructure.treetable.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.SortableColumnModel;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TreeTableView extends TreeTable implements ItemsProvider, SelectionProvider {
private static final Logger LOG = Logger.getInstance("#com.intellij.ui.dualView.TreeTableView");
public TreeTableView(ListTreeTableModelOnColumns treeTableModel) {
super(treeTableModel);
setRootVisible(false);
setTreeCellRenderer(new TreeCellRenderer() {
private final TreeCellRenderer myBaseRenderer = new HighlightableCellRenderer();
public Component getTreeCellRendererComponent(JTree tree1,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
JComponent result = (JComponent)myBaseRenderer.getTreeCellRendererComponent(tree1, value, selected, expanded, leaf, row, hasFocus);
result.setOpaque(!selected);
return result;
}
});
setSizes();
}
public void setTableModel(TreeTableModel treeTableModel) {
super.setTableModel(treeTableModel);
LOG.assertTrue(treeTableModel instanceof SortableColumnModel);
}
private void setSizes() {
ColumnInfo[] columns = ((ListTreeTableModelOnColumns)getTableModel()).getColumns();
for (int i = 0; i < columns.length; i++) {
ColumnInfo columnInfo = columns[i];
TableColumn column = getColumnModel().getColumn(i);
if (columnInfo.getWidth(this) > 0) {
int width = columnInfo.getWidth(this);
column.setMaxWidth(width);
column.setMinWidth(width);
}
else {
final String preferredValue = columnInfo.getPreferredStringValue();
if (preferredValue != null) {
int width = getFontMetrics(getFont()).stringWidth(preferredValue) + columnInfo.getAdditionalWidth();
column.setPreferredWidth(width);
}
}
}
}
public TableCellEditor getCellEditor(int row, int column) {
TableCellEditor editor = getColumnInfo(column).getEditor(getRowElement(row));
return editor == null ? super.getCellEditor(row, column) : editor;
}
public TreeTableCellRenderer createTableRenderer(TreeTableModel treeTableModel) {
return new TreeTableCellRenderer(TreeTableView.this, getTree()) {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
JComponent component = (JComponent)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
component.setOpaque(isSelected);
return component;
}
};
}
ListTreeTableModelOnColumns getTreeViewModel() {
return (ListTreeTableModelOnColumns)getTableModel();
}
public List<DualTreeElement> getFlattenItems() {
List<DualTreeElement> items = getTreeViewModel().getItems();
return ContainerUtil.findAll(items, new Condition<DualTreeElement>() {
public boolean value(final DualTreeElement object) {
return object.shouldBeInTheFlatView();
}
});
}
public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer renderer = getColumnInfo(column).getRenderer(getRowElement(row));
final TableCellRenderer baseRenderer = renderer == null ? super.getCellRenderer(row, column) : renderer;
return new CellRendererWrapper(baseRenderer);
}
protected Object getRowElement(final int row) {
return getTree().getPathForRow(row).getLastPathComponent();
}
protected final ColumnInfo<Object,?> getColumnInfo(final int column) {
return getTreeViewModel().getColumnInfos()[convertColumnIndexToModel(column)];
}
public List getItems() {
return getTreeViewModel().getItems();
}
public List getSelection() {
final TreeTableTree tree = getTree();
if (tree == null) return Collections.emptyList();
final int[] rows = getSelectedRows();
final ArrayList result = new ArrayList();
for (int row : rows) {
final TreePath pathForRow = tree.getPathForRow(row);
if (pathForRow != null) result.add(pathForRow.getLastPathComponent());
}
return result;
}
public void addSelection(Object item) {
getTree().setExpandsSelectedPaths(true);
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)item;
addSelectedPath(new TreePath(treeNode.getPath()));
}
public static class CellRendererWrapper implements TableCellRenderer {
private final TableCellRenderer myBaseRenderer;
public CellRendererWrapper(final TableCellRenderer baseRenderer) {
myBaseRenderer = baseRenderer;
}
public TableCellRenderer getBaseRenderer() {
return myBaseRenderer;
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
final JComponent rendererComponent = (JComponent)myBaseRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
if (isSelected) {
rendererComponent.setBackground(table.getSelectionBackground());
rendererComponent.setForeground(table.getSelectionForeground());
}
else {
final Color bg = table.getBackground();
rendererComponent.setBackground(bg);
rendererComponent.setForeground(table.getForeground());
}
rendererComponent.setOpaque(isSelected);
return rendererComponent;
}
}
}