BasicTableUIpublic class BasicTableUI extends TableUI BasicTableUI implementation |
Fields Summary |
---|
private static final StringBuilder | BASELINE_COMPONENT_KEY | protected JTable | table | protected CellRendererPane | rendererPane | protected KeyListener | keyListener | protected FocusListener | focusListener | protected MouseInputListener | mouseInputListener | private Handler | handler | private boolean | isFileListLocal cache of Table's client property "Table.isFileList" | private static final TransferHandler | defaultTransferHandler |
Methods Summary |
---|
protected java.awt.event.FocusListener | createFocusListener()Creates the focus listener for handling keyboard navigation in the JTable.
return getHandler();
| protected java.awt.event.KeyListener | createKeyListener()Creates the key listener for handling keyboard navigation in the JTable.
return null;
| protected javax.swing.event.MouseInputListener | createMouseInputListener()Creates the mouse listener for the JTable.
return getHandler();
| private java.awt.Dimension | createTableSize(long width)
int height = 0;
int rowCount = table.getRowCount();
if (rowCount > 0 && table.getColumnCount() > 0) {
Rectangle r = table.getCellRect(rowCount-1, 0, true);
height = r.y + r.height;
}
// Width is always positive. The call to abs() is a workaround for
// a bug in the 1.1.6 JIT on Windows.
long tmp = Math.abs(width);
if (tmp > Integer.MAX_VALUE) {
tmp = Integer.MAX_VALUE;
}
return new Dimension((int)tmp, height);
| public static javax.swing.plaf.ComponentUI | createUI(javax.swing.JComponent c)
return new BasicTableUI();
| private java.awt.Rectangle | extendRect(java.awt.Rectangle rect, boolean horizontal)
if (rect == null) {
return rect;
}
if (horizontal) {
rect.x = 0;
rect.width = table.getWidth();
} else {
rect.y = 0;
if (table.getRowCount() != 0) {
Rectangle lastRect = table.getCellRect(table.getRowCount() - 1, 0, true);
rect.height = lastRect.y + lastRect.height;
} else {
rect.height = table.getHeight();
}
}
return rect;
| private static int | getAdjustedLead(javax.swing.JTable table, boolean row, javax.swing.ListSelectionModel model)
int index = model.getLeadSelectionIndex();
int compare = row ? table.getRowCount() : table.getColumnCount();
return index < compare ? index : -1;
| private static int | getAdjustedLead(javax.swing.JTable table, boolean row)
return row ? getAdjustedLead(table, row, table.getSelectionModel())
: getAdjustedLead(table, row, table.getColumnModel().getSelectionModel());
| public int | getBaseline(javax.swing.JComponent c, int width, int height)Returns the baseline.
super.getBaseline(c, width, height);
UIDefaults lafDefaults = UIManager.getLookAndFeelDefaults();
Component renderer = (Component)lafDefaults.get(
BASELINE_COMPONENT_KEY);
if (renderer == null) {
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
renderer = tcr.getTableCellRendererComponent(
table, "a", false, false, -1, -1);
lafDefaults.put(BASELINE_COMPONENT_KEY, renderer);
}
renderer.setFont(table.getFont());
int rowMargin = table.getRowMargin();
return renderer.getBaseline(Integer.MAX_VALUE, table.getRowHeight() -
rowMargin) + rowMargin / 2;
| public java.awt.Component$BaselineResizeBehavior | getBaselineResizeBehavior(javax.swing.JComponent c)Returns an enum indicating how the baseline of the component
changes as the size changes.
super.getBaselineResizeBehavior(c);
return Component.BaselineResizeBehavior.CONSTANT_ASCENT;
| private java.awt.Rectangle | getHDropLineRect(javax.swing.JTable$DropLocation loc)
if (!loc.isInsertRow()) {
return null;
}
int row = loc.getRow();
int col = loc.getColumn();
if (col >= table.getColumnCount()) {
col--;
}
Rectangle rect = table.getCellRect(row, col, true);
if (row >= table.getRowCount()) {
row--;
Rectangle prevRect = table.getCellRect(row, col, true);
rect.y = prevRect.y + prevRect.height;
}
if (rect.y == 0) {
rect.y = -1;
} else {
rect.y -= 2;
}
rect.height = 3;
return rect;
| private javax.swing.plaf.basic.BasicTableUI$Handler | getHandler()
if (handler == null) {
handler = new Handler();
}
return handler;
| javax.swing.InputMap | getInputMap(int condition)
if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) {
InputMap keyMap =
(InputMap)DefaultLookup.get(table, this,
"Table.ancestorInputMap");
return keyMap;
}
return null;
| public java.awt.Dimension | getMaximumSize(javax.swing.JComponent c)Return the maximum size of the table. The maximum height is the
row heighttimes the number of rows.
The maximum width is the sum of the maximum widths of each column.
long width = 0;
Enumeration enumeration = table.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
TableColumn aColumn = (TableColumn)enumeration.nextElement();
width = width + aColumn.getMaxWidth();
}
return createTableSize(width);
| public java.awt.Dimension | getMinimumSize(javax.swing.JComponent c)Return the minimum size of the table. The minimum height is the
row height times the number of rows.
The minimum width is the sum of the minimum widths of each column.
long width = 0;
Enumeration enumeration = table.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
TableColumn aColumn = (TableColumn)enumeration.nextElement();
width = width + aColumn.getMinWidth();
}
return createTableSize(width);
| public java.awt.Dimension | getPreferredSize(javax.swing.JComponent c)Return the preferred size of the table. The preferred height is the
row height times the number of rows.
The preferred width is the sum of the preferred widths of each column.
long width = 0;
Enumeration enumeration = table.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
TableColumn aColumn = (TableColumn)enumeration.nextElement();
width = width + aColumn.getPreferredWidth();
}
return createTableSize(width);
| private java.awt.Rectangle | getVDropLineRect(javax.swing.JTable$DropLocation loc)
if (!loc.isInsertColumn()) {
return null;
}
boolean ltr = table.getComponentOrientation().isLeftToRight();
int col = loc.getColumn();
Rectangle rect = table.getCellRect(loc.getRow(), col, true);
if (col >= table.getColumnCount()) {
col--;
rect = table.getCellRect(loc.getRow(), col, true);
if (ltr) {
rect.x = rect.x + rect.width;
}
} else if (!ltr) {
rect.x = rect.x + rect.width;
}
if (rect.x == 0) {
rect.x = -1;
} else {
rect.x -= 2;
}
rect.width = 3;
return rect;
| protected void | installDefaults()Initialize JTable properties, e.g. font, foreground, and background.
The font, foreground, and background properties are only set if their
current value is either null or a UIResource, other properties are set
if the current value is null.
LookAndFeel.installColorsAndFont(table, "Table.background",
"Table.foreground", "Table.font");
// JTable's original row height is 16. To correctly display the
// contents on Linux we should have set it to 18, Windows 19 and
// Solaris 20. As these values vary so much it's too hard to
// be backward compatable and try to update the row height, we're
// therefor NOT going to adjust the row height based on font. If the
// developer changes the font, it's there responsability to update
// the row height.
LookAndFeel.installProperty(table, "opaque", Boolean.TRUE);
Color sbg = table.getSelectionBackground();
if (sbg == null || sbg instanceof UIResource) {
table.setSelectionBackground(UIManager.getColor("Table.selectionBackground"));
}
Color sfg = table.getSelectionForeground();
if (sfg == null || sfg instanceof UIResource) {
table.setSelectionForeground(UIManager.getColor("Table.selectionForeground"));
}
Color gridColor = table.getGridColor();
if (gridColor == null || gridColor instanceof UIResource) {
table.setGridColor(UIManager.getColor("Table.gridColor"));
}
// install the scrollpane border
Container parent = table.getParent(); // should be viewport
if (parent != null) {
parent = parent.getParent(); // should be the scrollpane
if (parent != null && parent instanceof JScrollPane) {
LookAndFeel.installBorder((JScrollPane)parent, "Table.scrollPaneBorder");
}
}
isFileList = Boolean.TRUE.equals(table.getClientProperty("Table.isFileList"));
| private void | installDefaults2()
TransferHandler th = table.getTransferHandler();
if (th == null || th instanceof UIResource) {
table.setTransferHandler(defaultTransferHandler);
// default TransferHandler doesn't support drop
// so we don't want drop handling
if (table.getDropTarget() instanceof UIResource) {
table.setDropTarget(null);
}
}
| protected void | installKeyboardActions()Register all keyboard actions on the JTable.
LazyActionMap.installLazyActionMap(table, BasicTableUI.class,
"Table.actionMap");
InputMap inputMap = getInputMap(JComponent.
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
SwingUtilities.replaceUIInputMap(table,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,
inputMap);
| protected void | installListeners()Attaches listeners to the JTable.
focusListener = createFocusListener();
keyListener = createKeyListener();
mouseInputListener = createMouseInputListener();
table.addFocusListener(focusListener);
table.addKeyListener(keyListener);
table.addMouseListener(mouseInputListener);
table.addMouseMotionListener(mouseInputListener);
table.addPropertyChangeListener(getHandler());
if (isFileList) {
table.getSelectionModel().addListSelectionListener(getHandler());
}
| public void | installUI(javax.swing.JComponent c)
table = (JTable)c;
rendererPane = new CellRendererPane();
table.add(rendererPane);
installDefaults();
installDefaults2();
installListeners();
installKeyboardActions();
| static void | loadActionMap(javax.swing.plaf.basic.LazyActionMap map)
// IMPORTANT: There is a very close coupling between the parameters
// passed to the Actions constructor. Only certain parameter
// combinations are supported. For example, the following Action would
// not work as expected:
// new Actions(Actions.NEXT_ROW_CELL, 1, 4, false, true)
// Actions which move within the selection only (having a true
// inSelection parameter) require that one of dx or dy be
// zero and the other be -1 or 1. The point of this warning is
// that you should be very careful about making sure a particular
// combination of parameters is supported before changing or
// adding anything here.
map.put(new Actions(Actions.NEXT_COLUMN, 1, 0,
false, false));
map.put(new Actions(Actions.NEXT_COLUMN_CHANGE_LEAD, 1, 0,
false, false));
map.put(new Actions(Actions.PREVIOUS_COLUMN, -1, 0,
false, false));
map.put(new Actions(Actions.PREVIOUS_COLUMN_CHANGE_LEAD, -1, 0,
false, false));
map.put(new Actions(Actions.NEXT_ROW, 0, 1,
false, false));
map.put(new Actions(Actions.NEXT_ROW_CHANGE_LEAD, 0, 1,
false, false));
map.put(new Actions(Actions.PREVIOUS_ROW, 0, -1,
false, false));
map.put(new Actions(Actions.PREVIOUS_ROW_CHANGE_LEAD, 0, -1,
false, false));
map.put(new Actions(Actions.NEXT_COLUMN_EXTEND_SELECTION,
1, 0, true, false));
map.put(new Actions(Actions.PREVIOUS_COLUMN_EXTEND_SELECTION,
-1, 0, true, false));
map.put(new Actions(Actions.NEXT_ROW_EXTEND_SELECTION,
0, 1, true, false));
map.put(new Actions(Actions.PREVIOUS_ROW_EXTEND_SELECTION,
0, -1, true, false));
map.put(new Actions(Actions.SCROLL_UP_CHANGE_SELECTION,
false, false, true, false));
map.put(new Actions(Actions.SCROLL_DOWN_CHANGE_SELECTION,
false, true, true, false));
map.put(new Actions(Actions.FIRST_COLUMN,
false, false, false, true));
map.put(new Actions(Actions.LAST_COLUMN,
false, true, false, true));
map.put(new Actions(Actions.SCROLL_UP_EXTEND_SELECTION,
true, false, true, false));
map.put(new Actions(Actions.SCROLL_DOWN_EXTEND_SELECTION,
true, true, true, false));
map.put(new Actions(Actions.FIRST_COLUMN_EXTEND_SELECTION,
true, false, false, true));
map.put(new Actions(Actions.LAST_COLUMN_EXTEND_SELECTION,
true, true, false, true));
map.put(new Actions(Actions.FIRST_ROW, false, false, true, true));
map.put(new Actions(Actions.LAST_ROW, false, true, true, true));
map.put(new Actions(Actions.FIRST_ROW_EXTEND_SELECTION,
true, false, true, true));
map.put(new Actions(Actions.LAST_ROW_EXTEND_SELECTION,
true, true, true, true));
map.put(new Actions(Actions.NEXT_COLUMN_CELL,
1, 0, false, true));
map.put(new Actions(Actions.PREVIOUS_COLUMN_CELL,
-1, 0, false, true));
map.put(new Actions(Actions.NEXT_ROW_CELL, 0, 1, false, true));
map.put(new Actions(Actions.PREVIOUS_ROW_CELL,
0, -1, false, true));
map.put(new Actions(Actions.SELECT_ALL));
map.put(new Actions(Actions.CLEAR_SELECTION));
map.put(new Actions(Actions.CANCEL_EDITING));
map.put(new Actions(Actions.START_EDITING));
map.put(TransferHandler.getCutAction().getValue(Action.NAME),
TransferHandler.getCutAction());
map.put(TransferHandler.getCopyAction().getValue(Action.NAME),
TransferHandler.getCopyAction());
map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
TransferHandler.getPasteAction());
map.put(new Actions(Actions.SCROLL_LEFT_CHANGE_SELECTION,
false, false, false, false));
map.put(new Actions(Actions.SCROLL_RIGHT_CHANGE_SELECTION,
false, true, false, false));
map.put(new Actions(Actions.SCROLL_LEFT_EXTEND_SELECTION,
true, false, false, false));
map.put(new Actions(Actions.SCROLL_RIGHT_EXTEND_SELECTION,
true, true, false, false));
map.put(new Actions(Actions.ADD_TO_SELECTION));
map.put(new Actions(Actions.TOGGLE_AND_ANCHOR));
map.put(new Actions(Actions.EXTEND_TO));
map.put(new Actions(Actions.MOVE_SELECTION_TO));
map.put(new Actions(Actions.FOCUS_HEADER));
| public void | paint(java.awt.Graphics g, javax.swing.JComponent c)Paint a representation of the table instance
that was set in installUI().
Rectangle clip = g.getClipBounds();
Rectangle bounds = table.getBounds();
// account for the fact that the graphics has already been translated
// into the table's bounds
bounds.x = bounds.y = 0;
if (table.getRowCount() <= 0 || table.getColumnCount() <= 0 ||
// this check prevents us from painting the entire table
// when the clip doesn't intersect our bounds at all
!bounds.intersects(clip)) {
paintDropLines(g);
return;
}
boolean ltr = table.getComponentOrientation().isLeftToRight();
Point upperLeft = clip.getLocation();
if (!ltr) {
upperLeft.x++;
}
Point lowerRight = new Point(clip.x + clip.width - (ltr ? 1 : 0),
clip.y + clip.height);
int rMin = table.rowAtPoint(upperLeft);
int rMax = table.rowAtPoint(lowerRight);
// This should never happen (as long as our bounds intersect the clip,
// which is why we bail above if that is the case).
if (rMin == -1) {
rMin = 0;
}
// If the table does not have enough rows to fill the view we'll get -1.
// (We could also get -1 if our bounds don't intersect the clip,
// which is why we bail above if that is the case).
// Replace this with the index of the last row.
if (rMax == -1) {
rMax = table.getRowCount()-1;
}
int cMin = table.columnAtPoint(ltr ? upperLeft : lowerRight);
int cMax = table.columnAtPoint(ltr ? lowerRight : upperLeft);
// This should never happen.
if (cMin == -1) {
cMin = 0;
}
// If the table does not have enough columns to fill the view we'll get -1.
// Replace this with the index of the last column.
if (cMax == -1) {
cMax = table.getColumnCount()-1;
}
// Paint the grid.
paintGrid(g, rMin, rMax, cMin, cMax);
// Paint the cells.
paintCells(g, rMin, rMax, cMin, cMax);
paintDropLines(g);
| private void | paintCell(java.awt.Graphics g, java.awt.Rectangle cellRect, int row, int column)
if (table.isEditing() && table.getEditingRow()==row &&
table.getEditingColumn()==column) {
Component component = table.getEditorComponent();
component.setBounds(cellRect);
component.validate();
}
else {
TableCellRenderer renderer = table.getCellRenderer(row, column);
Component component = table.prepareRenderer(renderer, row, column);
rendererPane.paintComponent(g, component, table, cellRect.x, cellRect.y,
cellRect.width, cellRect.height, true);
}
| private void | paintCells(java.awt.Graphics g, int rMin, int rMax, int cMin, int cMax)
JTableHeader header = table.getTableHeader();
TableColumn draggedColumn = (header == null) ? null : header.getDraggedColumn();
TableColumnModel cm = table.getColumnModel();
int columnMargin = cm.getColumnMargin();
Rectangle cellRect;
TableColumn aColumn;
int columnWidth;
if (table.getComponentOrientation().isLeftToRight()) {
for(int row = rMin; row <= rMax; row++) {
cellRect = table.getCellRect(row, cMin, false);
for(int column = cMin; column <= cMax; column++) {
aColumn = cm.getColumn(column);
columnWidth = aColumn.getWidth();
cellRect.width = columnWidth - columnMargin;
if (aColumn != draggedColumn) {
paintCell(g, cellRect, row, column);
}
cellRect.x += columnWidth;
}
}
} else {
for(int row = rMin; row <= rMax; row++) {
cellRect = table.getCellRect(row, cMin, false);
aColumn = cm.getColumn(cMin);
if (aColumn != draggedColumn) {
columnWidth = aColumn.getWidth();
cellRect.width = columnWidth - columnMargin;
paintCell(g, cellRect, row, cMin);
}
for(int column = cMin+1; column <= cMax; column++) {
aColumn = cm.getColumn(column);
columnWidth = aColumn.getWidth();
cellRect.width = columnWidth - columnMargin;
cellRect.x -= columnWidth;
if (aColumn != draggedColumn) {
paintCell(g, cellRect, row, column);
}
}
}
}
// Paint the dragged column if we are dragging.
if (draggedColumn != null) {
paintDraggedArea(g, rMin, rMax, draggedColumn, header.getDraggedDistance());
}
// Remove any renderers that may be left in the rendererPane.
rendererPane.removeAll();
| private void | paintDraggedArea(java.awt.Graphics g, int rMin, int rMax, javax.swing.table.TableColumn draggedColumn, int distance)
int draggedColumnIndex = viewIndexForColumn(draggedColumn);
Rectangle minCell = table.getCellRect(rMin, draggedColumnIndex, true);
Rectangle maxCell = table.getCellRect(rMax, draggedColumnIndex, true);
Rectangle vacatedColumnRect = minCell.union(maxCell);
// Paint a gray well in place of the moving column.
g.setColor(table.getParent().getBackground());
g.fillRect(vacatedColumnRect.x, vacatedColumnRect.y,
vacatedColumnRect.width, vacatedColumnRect.height);
// Move to the where the cell has been dragged.
vacatedColumnRect.x += distance;
// Fill the background.
g.setColor(table.getBackground());
g.fillRect(vacatedColumnRect.x, vacatedColumnRect.y,
vacatedColumnRect.width, vacatedColumnRect.height);
// Paint the vertical grid lines if necessary.
if (table.getShowVerticalLines()) {
g.setColor(table.getGridColor());
int x1 = vacatedColumnRect.x;
int y1 = vacatedColumnRect.y;
int x2 = x1 + vacatedColumnRect.width - 1;
int y2 = y1 + vacatedColumnRect.height - 1;
// Left
g.drawLine(x1-1, y1, x1-1, y2);
// Right
g.drawLine(x2, y1, x2, y2);
}
for(int row = rMin; row <= rMax; row++) {
// Render the cell value
Rectangle r = table.getCellRect(row, draggedColumnIndex, false);
r.x += distance;
paintCell(g, r, row, draggedColumnIndex);
// Paint the (lower) horizontal grid line if necessary.
if (table.getShowHorizontalLines()) {
g.setColor(table.getGridColor());
Rectangle rcr = table.getCellRect(row, draggedColumnIndex, true);
rcr.x += distance;
int x1 = rcr.x;
int y1 = rcr.y;
int x2 = x1 + rcr.width - 1;
int y2 = y1 + rcr.height - 1;
g.drawLine(x1, y2, x2, y2);
}
}
| private void | paintDropLines(java.awt.Graphics g)
JTable.DropLocation loc = table.getDropLocation();
if (loc == null) {
return;
}
Color color = UIManager.getColor("Table.dropLineColor");
Color shortColor = UIManager.getColor("Table.dropLineShortColor");
if (color == null && shortColor == null) {
return;
}
Rectangle rect;
rect = getHDropLineRect(loc);
if (rect != null) {
int x = rect.x;
int w = rect.width;
if (color != null) {
extendRect(rect, true);
g.setColor(color);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
}
if (!loc.isInsertColumn() && shortColor != null) {
g.setColor(shortColor);
g.fillRect(x, rect.y, w, rect.height);
}
}
rect = getVDropLineRect(loc);
if (rect != null) {
int y = rect.y;
int h = rect.height;
if (color != null) {
extendRect(rect, false);
g.setColor(color);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
}
if (!loc.isInsertRow() && shortColor != null) {
g.setColor(shortColor);
g.fillRect(rect.x, y, rect.width, h);
}
}
| private void | paintGrid(java.awt.Graphics g, int rMin, int rMax, int cMin, int cMax)
g.setColor(table.getGridColor());
Rectangle minCell = table.getCellRect(rMin, cMin, true);
Rectangle maxCell = table.getCellRect(rMax, cMax, true);
Rectangle damagedArea = minCell.union( maxCell );
if (table.getShowHorizontalLines()) {
int tableWidth = damagedArea.x + damagedArea.width;
int y = damagedArea.y;
for (int row = rMin; row <= rMax; row++) {
y += table.getRowHeight(row);
g.drawLine(damagedArea.x, y - 1, tableWidth - 1, y - 1);
}
}
if (table.getShowVerticalLines()) {
TableColumnModel cm = table.getColumnModel();
int tableHeight = damagedArea.y + damagedArea.height;
int x;
if (table.getComponentOrientation().isLeftToRight()) {
x = damagedArea.x;
for (int column = cMin; column <= cMax; column++) {
int w = cm.getColumn(column).getWidth();
x += w;
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
}
} else {
x = damagedArea.x;
for (int column = cMax; column >= cMin; column--) {
int w = cm.getColumn(column).getWidth();
x += w;
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
}
}
}
| private boolean | pointOutsidePrefSize(int row, int column, java.awt.Point p)
if (!isFileList) {
return false;
}
return SwingUtilities2.pointOutsidePrefSize(table, row, column, p);
| protected void | uninstallDefaults()
if (table.getTransferHandler() instanceof UIResource) {
table.setTransferHandler(null);
}
| protected void | uninstallKeyboardActions()
SwingUtilities.replaceUIInputMap(table, JComponent.
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
SwingUtilities.replaceUIActionMap(table, null);
| protected void | uninstallListeners()
table.removeFocusListener(focusListener);
table.removeKeyListener(keyListener);
table.removeMouseListener(mouseInputListener);
table.removeMouseMotionListener(mouseInputListener);
table.removePropertyChangeListener(getHandler());
if (isFileList) {
table.getSelectionModel().removeListSelectionListener(getHandler());
}
focusListener = null;
keyListener = null;
mouseInputListener = null;
handler = null;
| public void | uninstallUI(javax.swing.JComponent c)
uninstallDefaults();
uninstallListeners();
uninstallKeyboardActions();
table.remove(rendererPane);
rendererPane = null;
table = null;
| private int | viewIndexForColumn(javax.swing.table.TableColumn aColumn)
TableColumnModel cm = table.getColumnModel();
for (int column = 0; column < cm.getColumnCount(); column++) {
if (cm.getColumn(column) == aColumn) {
return column;
}
}
return -1;
|
|