Files
VisualSapfor/src/Common_old/UI/Tables/StyledTable.java
2024-10-07 14:44:24 +03:00

102 lines
4.4 KiB
Java

package Common_old.UI.Tables;
import Common_old.Current;
import Common_old.UI.Menus.TableMenu;
import _VisualDVM.Syntax.ThemeElement;
import _VisualDVM.Syntax.VisualiserFonts;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public abstract class StyledTable extends JTable implements ThemeElement {
//https://askdev.ru/q/kak-upravlyat-stilem-cvetom-i-razmerom-shrifta-vnutri-jtable-455196/
//https://stackoverflow.com/questions/4129666/how-to-convert-hex-to-rgb-using-java цвета
public StyledTable(AbstractTableModel model) {
super(model);
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
setFillsViewportHeight(true);
setAutoCreateRowSorter(dataModel.getRowCount() > 0);
Init();
setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain));
JTableHeader header = getTableHeader();
header.setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain));
putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//текущий объет может определяться по первому столбцу. могут быть баги если не запретить
getTableHeader().setReorderingAllowed(false);
CorrectSizes();
setComponentPopupMenu(CreateMenu());
applyTheme();
}
public TableMenu CreateMenu() {
return new TableMenu(this);
}
public void Init() {
}
private void adjustColumnSizes(int column, int margin) {
DefaultTableColumnModel colModel = (DefaultTableColumnModel) getColumnModel();
TableColumn col = colModel.getColumn(column);
int width;
TableCellRenderer renderer = col.getHeaderRenderer();
if (renderer == null) {
renderer = getTableHeader().getDefaultRenderer();
}
Component comp = renderer.getTableCellRendererComponent(this, col.getHeaderValue(), false, false, 0, 0);
width = comp.getPreferredSize().width;
for (int r = 0; r < getRowCount(); r++) {
renderer = getCellRenderer(r, column);
comp = renderer.getTableCellRendererComponent(this, getValueAt(r, column), false, false, r, column);
int currentWidth = comp.getPreferredSize().width;
width = Math.max(width, currentWidth);
}
width += 2 * margin;
col.setPreferredWidth(width);
col.setWidth(width);
}
private void adjustJTableRowSizes() {
for (int row = 0; row < getRowCount(); row++) {
int maxHeight = 0;
for (int column = 0; column < getColumnCount(); column++) {
TableCellRenderer cellRenderer = getCellRenderer(row, column);
Object valueAt = getValueAt(row, column);
Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(this, valueAt, false, false, row, column);
int heightPreferable = tableCellRendererComponent.getPreferredSize().height;
maxHeight = Math.max(heightPreferable, maxHeight);
}
setRowHeight(row, maxHeight);
}
}
public void CorrectSizes() {
adjustJTableRowSizes();
CorrectColumnsSizes();
this.removeEditor();//отлючение редактирования клеток если таковые были.
}
public void CorrectColumnsSizes() {
for (int i = 0; i < getColumnCount(); i++) {
adjustColumnSizes(i, 2);
}
}
@Override
public void applyTheme() {
setBackground(Current.getTheme().table_background);
setForeground(Current.getTheme().foreground);
setSelectionBackground(Current.getTheme().selection_background);
setSelectionForeground(Current.getTheme().foreground);
}
public void SelectRow(int r) {
getSelectionModel().setSelectionInterval(r, r);
}
public void scrollToVisible(int rowIndex, int vColIndex) {
if (!(getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport) getParent();
Rectangle rect = getCellRect(rowIndex, vColIndex, true);
Point pt = viewport.getViewPosition();
rect.setLocation(rect.x - pt.x, rect.y - pt.y);
viewport.scrollRectToVisible(rect);
}
public void scrollToLastRow() {
scrollToVisible(getRowCount() - 1, 0);
}
}