diff options
author | Mark Wielaard <mark@klomp.org> | 2004-09-04 21:14:05 +0000 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2004-09-04 21:14:05 +0000 |
commit | d3b4922ac911978002581c2aefc8dd272e6e0de0 (patch) | |
tree | bc88ad8ed5d61850d377201b2c81af5d4111d685 /javax/swing/plaf/basic/BasicTableUI.java | |
parent | fa25dc3a60ff76d97595dbc4c6a20bb66558ab51 (diff) | |
download | classpath-d3b4922ac911978002581c2aefc8dd272e6e0de0.tar.gz |
2004-09-04 Graydon Hoare <graydon@redhat.com>
* javax/swing/Box.java: Fix setting of layout in ctor.
* javax/swing/JScrollPane.java: Scroll headers as well.
* javax/swing/JTable.java: Reimplement.
* javax/swing/JViewPort.java: Only add non-null children.
* javax/swing/ScrollPaneLayout.java: Correct header calculations.
* javax/swing/Timer.java: Fix stopping null waker.
* javax/swing/plaf/basic/BasicTableHeaderUI.java: New file.
* javax/swing/plaf/basic/BasicTableUI.java: New file.
* javax/swing/table/DefaultTableCellRenderer.java: Configure.
* javax/swing/table/DefaultTableColumnModel.java: Flesh out.
* javax/swing/table/DefaultTableModel.java: Clean up.
* javax/swing/table/JTableHeader.java: Implement.
Diffstat (limited to 'javax/swing/plaf/basic/BasicTableUI.java')
-rw-r--r-- | javax/swing/plaf/basic/BasicTableUI.java | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/javax/swing/plaf/basic/BasicTableUI.java b/javax/swing/plaf/basic/BasicTableUI.java new file mode 100644 index 000000000..d3b1f7ad5 --- /dev/null +++ b/javax/swing/plaf/basic/BasicTableUI.java @@ -0,0 +1,337 @@ +package javax.swing.plaf.basic; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseEvent; +import javax.swing.CellRendererPane; +import javax.swing.JComponent; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.MouseInputListener; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.TableUI; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.UIDefaults; +import javax.swing.UIManager; + + +public class BasicTableUI + extends TableUI +{ + + public static ComponentUI createUI(JComponent comp) + { + return new BasicTableUI(); + } + + protected FocusListener focusListener; + protected KeyListener keyListener; + protected MouseInputListener mouseInputListener; + protected CellRendererPane rendererPane; + protected JTable table; + + class FocusHandler implements FocusListener + { + public void focusGained(FocusEvent e) + { + } + public void focusLost(FocusEvent e) + { + } + } + + class KeyHandler implements KeyListener + { + public void keyPressed(KeyEvent e) + { + } + public void keyReleased(KeyEvent e) + { + } + public void keyTyped(KeyEvent e) + { + } + } + + class MouseInputHandler implements MouseInputListener + { + Point begin, curr; + + private int getRowForPoint(Point p) + { + int y0 = table.getLocation().y; + int nrows = table.getRowCount(); + Dimension gap = table.getInterCellSpacing(); + int height = table.getRowHeight() + (gap == null ? 0 : gap.height); + int y = p.y; + for (int i = 0; i < nrows; ++i) + { + if (0 <= y && y < height) + return i; + y -= height; + } + return -1; + } + + private int getColForPoint(Point p) + { + int x0 = table.getLocation().x; + int ncols = table.getColumnCount(); + Dimension gap = table.getInterCellSpacing(); + TableColumnModel cols = table.getColumnModel(); + int x = p.x; + for (int i = 0; i < ncols; ++i) + { + int width = cols.getColumn(i).getWidth() + (gap == null ? 0 : gap.width); + if (0 <= x && x < width) + return i; + x -= width; + } + return -1; + } + + private void updateSelection() + { + if (table.getRowSelectionAllowed()) + { + int lo_row = getRowForPoint(begin); + int hi_row = getRowForPoint(curr); + ListSelectionModel rowModel = table.getSelectionModel(); + if (lo_row != -1 && hi_row != -1) + rowModel.setSelectionInterval(lo_row, hi_row); + } + + if (table.getColumnSelectionAllowed()) + { + int lo_col = getColForPoint(begin); + int hi_col = getColForPoint(curr); + ListSelectionModel colModel = table.getColumnModel().getSelectionModel(); + if (lo_col != -1 && hi_col != -1) + colModel.setSelectionInterval(lo_col, hi_col); + } + } + + public void mouseClicked(MouseEvent e) + { + } + public void mouseDragged(MouseEvent e) + { + curr = new Point(e.getX(), e.getY()); + updateSelection(); + } + public void mouseEntered(MouseEvent e) + { + } + public void mouseExited(MouseEvent e) + { + } + public void mouseMoved(MouseEvent e) + { + } + public void mousePressed(MouseEvent e) + { + begin = new Point(e.getX(), e.getY()); + curr = new Point(e.getX(), e.getY()); + updateSelection(); + } + public void mouseReleased(MouseEvent e) + { + begin = null; + curr = null; + } + } + + protected FocusListener createFocusListener() + { + return new FocusHandler(); + } + protected KeyListener createKeyListener() + { + return new KeyHandler(); + } + protected MouseInputListener createMouseInputListener() + { + return new MouseInputHandler(); + } + + public Dimension getMaximumSize(JComponent comp) + { + return getPreferredSize(comp); + } + + public Dimension getMinimumSize(JComponent comp) + { + return getPreferredSize(comp); + } + + public Dimension getPreferredSize(JComponent comp) + { + int width = table.getColumnModel().getTotalColumnWidth(); + int height = table.getRowCount() * table.getRowHeight(); + return new Dimension(width, height); + } + + protected void installDefaults() + { + UIDefaults defaults = UIManager.getLookAndFeelDefaults(); + table.setFont(defaults.getFont("Table.font")); + table.setGridColor(defaults.getColor("Table.gridColor")); + table.setForeground(defaults.getColor("Table.foreground")); + table.setBackground(defaults.getColor("Table.background")); + table.setSelectionForeground(defaults.getColor("Table.selectionForeground")); + table.setSelectionBackground(defaults.getColor("Table.selectionBackground")); + table.setOpaque(true); + } + protected void installKeyboardActions() + { + } + + protected void installListeners() + { + table.addFocusListener(focusListener); + table.addKeyListener(keyListener); + table.addMouseListener(mouseInputListener); + } + + protected void uninstallDefaults() + { + table.setFont(null); + table.setGridColor(null); + table.setForeground(null); + table.setBackground(null); + table.setSelectionForeground(null); + table.setSelectionBackground(null); + } + + protected void uninstallKeyboardActions() + { + } + + protected void uninstallListeners() + { + table.removeFocusListener(focusListener); + table.removeKeyListener(keyListener); + table.removeMouseListener(mouseInputListener); + } + + public void installUI(JComponent comp) + { + table = (JTable)comp; + focusListener = createFocusListener(); + keyListener = createKeyListener(); + mouseInputListener = createMouseInputListener(); + installDefaults(); + installKeyboardActions(); + installListeners(); + } + + public void uninstallUI(JComponent c) + { + uninstallListeners(); + uninstallKeyboardActions(); + uninstallDefaults(); + } + + public void paint(Graphics gfx, JComponent ignored) + { + int ncols = table.getColumnCount(); + int nrows = table.getRowCount(); + if (nrows == 0 || ncols == 0) + return; + + Rectangle clip = gfx.getClipBounds(); + TableColumnModel cols = table.getColumnModel(); + + int height = table.getRowHeight(); + int x0 = 0, y0 = 0; + int x = x0; + int y = y0; + + Dimension gap = table.getInterCellSpacing(); + int ymax = clip.y + clip.height; + int xmax = clip.x + clip.width; + + // paint the cell contents + for (int c = 0; c < ncols && x < xmax; ++c) + { + y = y0; + TableColumn col = cols.getColumn(c); + int width = col.getWidth(); + int modelCol = col.getModelIndex(); + + for (int r = 0; r < nrows && y < ymax; ++r) + { + Rectangle bounds = new Rectangle(x, y, width, height); + if (bounds.intersects(clip)) + { + TableCellRenderer rend = table.getCellRenderer(r, c); + Component comp = table.prepareRenderer(rend, r, c); + gfx.translate(x, y); + comp.setBounds(new Rectangle(0, 0, width, height)); + comp.paint(gfx); + gfx.translate(-x, -y); + } + y += height; + if (gap != null) + y += gap.height; + } + x += width; + if (gap != null) + x += gap.width; + } + + // tighten up the x and y max bounds + ymax = y; + xmax = x; + + Color grid = table.getGridColor(); + + // paint vertical grid lines + if (grid != null && table.getShowVerticalLines()) + { + x = x0; + Color save = gfx.getColor(); + gfx.setColor(grid); + boolean paintedLine = false; + for (int c = 0; c < ncols && x < xmax; ++c) + { + x += cols.getColumn(c).getWidth();; + if (gap != null) + x += gap.width; + gfx.drawLine(x, y0, x, ymax); + paintedLine = true; + } + gfx.setColor(save); + } + + // paint horizontal grid lines + if (grid != null && table.getShowHorizontalLines()) + { + y = y0; + Color save = gfx.getColor(); + gfx.setColor(grid); + boolean paintedLine = false; + for (int r = 0; r < nrows && y < ymax; ++r) + { + y += height; + if (gap != null) + y += gap.height; + gfx.drawLine(x0, y, xmax, y); + paintedLine = true; + } + gfx.setColor(save); + } + + } + +} |