промежуточный. частичный рефакторинг с прицелом на библиотечную часть
This commit is contained in:
82
src/Common_old/UI/Tables/EditableHeaderRenderer.java
Normal file
82
src/Common_old/UI/Tables/EditableHeaderRenderer.java
Normal file
@@ -0,0 +1,82 @@
|
||||
package Common_old.UI.Tables;
|
||||
import javax.swing.*;
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
public class EditableHeaderRenderer implements TableCellRenderer {
|
||||
private JTable table = null;
|
||||
private MouseEventReposter reporter = null;
|
||||
private JComponent editor;
|
||||
public EditableHeaderRenderer(JComponent editor) {
|
||||
this.editor = editor;
|
||||
this.editor.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
|
||||
}
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
|
||||
if (table != null && this.table != table) {
|
||||
this.table = table;
|
||||
final JTableHeader header = table.getTableHeader();
|
||||
if (header != null) {
|
||||
this.editor.setForeground(header.getForeground());
|
||||
this.editor.setBackground(header.getBackground());
|
||||
this.editor.setFont(header.getFont());
|
||||
reporter = new MouseEventReposter(header, col, this.editor);
|
||||
header.addMouseListener(reporter);
|
||||
}
|
||||
}
|
||||
if (reporter != null) reporter.setColumn(col);
|
||||
return this.editor;
|
||||
}
|
||||
static public class MouseEventReposter extends MouseAdapter {
|
||||
private Component dispatchComponent;
|
||||
private JTableHeader header;
|
||||
private int column = -1;
|
||||
private Component editor;
|
||||
public MouseEventReposter(JTableHeader header, int column, Component editor) {
|
||||
this.header = header;
|
||||
this.column = column;
|
||||
this.editor = editor;
|
||||
}
|
||||
public void setColumn(int column) {
|
||||
this.column = column;
|
||||
}
|
||||
private void setDispatchComponent(MouseEvent e) {
|
||||
int col = header.getTable().columnAtPoint(e.getPoint());
|
||||
if (col != column || col == -1) return;
|
||||
Point p = e.getPoint();
|
||||
Point p2 = SwingUtilities.convertPoint(header, p, editor);
|
||||
dispatchComponent = SwingUtilities.getDeepestComponentAt(editor, p2.x, p2.y);
|
||||
}
|
||||
private boolean repostEvent(MouseEvent e) {
|
||||
if (dispatchComponent == null) {
|
||||
return false;
|
||||
}
|
||||
MouseEvent e2 = SwingUtilities.convertMouseEvent(header, e, dispatchComponent);
|
||||
dispatchComponent.dispatchEvent(e2);
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (header.getResizingColumn() == null) {
|
||||
Point p = e.getPoint();
|
||||
int col = header.getTable().columnAtPoint(p);
|
||||
if (col != column || col == -1) return;
|
||||
int index = header.getColumnModel().getColumnIndexAtX(p.x);
|
||||
if (index == -1) return;
|
||||
editor.setBounds(header.getHeaderRect(index));
|
||||
header.add(editor);
|
||||
editor.validate();
|
||||
setDispatchComponent(e);
|
||||
repostEvent(e);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
repostEvent(e);
|
||||
dispatchComponent = null;
|
||||
header.remove(editor);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user