Index: javax/swing/JTable.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JTable.java,v retrieving revision 1.37 diff -u -r1.37 JTable.java --- javax/swing/JTable.java 28 Jul 2005 19:37:53 -0000 1.37 +++ javax/swing/JTable.java 2 Aug 2005 19:11:39 -0000 @@ -872,7 +872,7 @@ int column, boolean includeSpacing) { - int height = getHeight(); + int height = getRowHeight(row); int width = columnModel.getColumn(column).getWidth(); int x_gap = columnModel.getColumnMargin(); int y_gap = rowMargin; @@ -1098,6 +1098,19 @@ { return rowHeight; } + + /** + * Get the height of the specified row. + * + * @param row the row whose height to return + */ + public int getRowHeight(int row) + { + // FIXME: return the height of the specified row + // which may be different from the general rowHeight + return rowHeight; + } + /** * Get the value of the address@hidden #rowMargin} property. Index: javax/swing/JViewport.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JViewport.java,v retrieving revision 1.24 diff -u -r1.24 JViewport.java --- javax/swing/JViewport.java 28 Jul 2005 19:42:54 -0000 1.24 +++ javax/swing/JViewport.java 2 Aug 2005 19:11:39 -0000 @@ -498,11 +498,11 @@ Point pos = getViewPosition(); Rectangle viewBounds = getView().getBounds(); Rectangle portBounds = getBounds(); - + // FIXME: should validate the view if it is not valid, however // this may cause excessive validation when the containment // hierarchy is being created. - + // if contentRect is larger than the portBounds, center the view if (contentRect.height > portBounds.height || contentRect.width > portBounds.width) @@ -510,24 +510,22 @@ setViewPosition(new Point(contentRect.x, contentRect.y)); return; } - + // Y-DIRECTION - if (contentRect.y + viewBounds.y < portBounds.y) + if (contentRect.y < -viewBounds.y) setViewPosition(new Point(pos.x, contentRect.y)); - else if (contentRect.y + viewBounds.y + contentRect.height > - (portBounds.y+portBounds.height)) + else if (contentRect.y + contentRect.height > + -viewBounds.y + portBounds.height) setViewPosition (new Point(pos.x, contentRect.y - - (portBounds.height - contentRect.height) - - portBounds.y)); - + (portBounds.height - contentRect.height))); + // X-DIRECTION pos = getViewPosition(); - if (contentRect.x + viewBounds.x < portBounds.x) + if (contentRect.x < -viewBounds.x) setViewPosition(new Point(contentRect.x, pos.y)); - else if (contentRect.x + viewBounds.x + contentRect.width > - (portBounds.x + portBounds.height)) + else if (contentRect.x + contentRect.width > + -viewBounds.x + portBounds.width) setViewPosition (new Point(contentRect.x - - (portBounds.width - contentRect.width) - - portBounds.x, pos.y)); + (portBounds.width - contentRect.width), pos.y)); } } Index: javax/swing/plaf/basic/BasicTableUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTableUI.java,v retrieving revision 1.18 diff -u -r1.18 BasicTableUI.java --- javax/swing/plaf/basic/BasicTableUI.java 26 Jul 2005 20:19:46 -0000 1.18 +++ javax/swing/plaf/basic/BasicTableUI.java 2 Aug 2005 19:11:40 -0000 @@ -40,6 +40,7 @@ import java.awt.Color; import java.awt.Component; +import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; @@ -366,7 +367,8 @@ } else if (evt.getKeyCode() == KeyEvent.VK_HOME) { - if (evt.getModifiers() == (InputEvent.SHIFT_MASK | InputEvent.CTRL_MASK)) + if (evt.getModifiers() == + (InputEvent.SHIFT_MASK | InputEvent.CTRL_MASK)) { rowModel.setLeadSelectionIndex(0); colModel.setLeadSelectionIndex(colLead); @@ -395,11 +397,93 @@ } else if (evt.getKeyCode() == KeyEvent.VK_PAGE_UP) { - // FIXME: implement, need JList.ensureIndexIsVisible to work + int target; + if (!evt.isControlDown()) + { + if (rowLead == getFirstVisibleRowIndex()) + target = Math.max + (0, rowLead - (getLastVisibleRowIndex() - + getFirstVisibleRowIndex() + 1)); + else + target = getFirstVisibleRowIndex(); + + if (evt.getModifiers() == 0) + { + rowModel.setSelectionInterval(target, target); + colModel.setSelectionInterval(colLead, colLead); + } + else if (evt.getModifiers() == InputEvent.SHIFT_MASK) + { + rowModel.setLeadSelectionIndex(target); + colModel.setLeadSelectionIndex(colLead); + } + } + else + { + if (colLead == getFirstVisibleColumnIndex()) + target = Math.max + (0, colLead - (getLastVisibleColumnIndex() - + getFirstVisibleColumnIndex() + 1)); + else + target = getFirstVisibleColumnIndex(); + + if (evt.getModifiers() == InputEvent.CTRL_MASK) + { + colModel.setSelectionInterval(target, target); + rowModel.setSelectionInterval(rowLead, rowLead); + } + else if (evt.getModifiers() == + (InputEvent.SHIFT_MASK | InputEvent.CTRL_MASK)) + { + colModel.setLeadSelectionIndex(target); + rowModel.setLeadSelectionIndex(rowLead); + } + } } else if (evt.getKeyCode() == KeyEvent.VK_PAGE_DOWN) { - // FIXME: implement, need JList.ensureIndexIsVisible to work + int target; + if (!evt.isControlDown()) + { + if (rowLead == getLastVisibleRowIndex()) + target = Math.min + (rowMax, rowLead + (getLastVisibleRowIndex() - + getFirstVisibleRowIndex() + 1)); + else + target = getLastVisibleRowIndex(); + + if (evt.getModifiers() == 0) + { + rowModel.setSelectionInterval(target, target); + colModel.setSelectionInterval(colLead, colLead); + } + else if (evt.getModifiers() == InputEvent.SHIFT_MASK) + { + rowModel.setLeadSelectionIndex(target); + colModel.setLeadSelectionIndex(colLead); + } + } + else + { + if (colLead == getLastVisibleColumnIndex()) + target = Math.min + (colMax, colLead + (getLastVisibleColumnIndex() - + getFirstVisibleColumnIndex() + 1)); + else + target = getLastVisibleColumnIndex(); + + if (evt.getModifiers() == InputEvent.CTRL_MASK) + { + colModel.setSelectionInterval(target, target); + rowModel.setSelectionInterval(rowLead, rowLead); + } + else if (evt.getModifiers() == + (InputEvent.SHIFT_MASK | InputEvent.CTRL_MASK)) + { + colModel.setLeadSelectionIndex(target); + rowModel.setLeadSelectionIndex(rowLead); + } + } } else if (evt.getKeyCode() == KeyEvent.VK_TAB || evt.getKeyCode() == KeyEvent.VK_ENTER) @@ -504,6 +588,9 @@ { table.changeSelection(rowLead, colLead, true, false); } + table.scrollRectToVisible + (table.getCellRect(rowModel.getLeadSelectionIndex(), + colModel.getLeadSelectionIndex(), false)); } public void keyReleased(KeyEvent e) @@ -512,6 +599,69 @@ public void keyTyped(KeyEvent e) { + } + + /** + * Returns the column index of the first visible column. + * + */ + int getFirstVisibleColumnIndex() + { + ComponentOrientation or = table.getComponentOrientation(); + Rectangle r = table.getVisibleRect(); + if (!or.isLeftToRight()) + r.translate((int) r.getWidth() - 1, 0); + return table.columnAtPoint(r.getLocation()); + } + + /** + * Returns the column index of the last visible column. + * + */ + int getLastVisibleColumnIndex() + { + ComponentOrientation or = table.getComponentOrientation(); + Rectangle r = table.getVisibleRect(); + if (or.isLeftToRight()) + r.translate((int) r.getWidth() - 1, 0); + return table.columnAtPoint(r.getLocation()); + } + + /** + * Returns the row index of the first visible row. + * + */ + int getFirstVisibleRowIndex() + { + ComponentOrientation or = table.getComponentOrientation(); + Rectangle r = table.getVisibleRect(); + if (!or.isLeftToRight()) + r.translate((int) r.getWidth() - 1, 0); + return table.rowAtPoint(r.getLocation()); + } + + /** + * Returns the row index of the last visible row. + * + */ + int getLastVisibleRowIndex() + { + ComponentOrientation or = table.getComponentOrientation(); + Rectangle r = table.getVisibleRect(); + r.translate(0, (int) r.getHeight() - 1); + if (or.isLeftToRight()) + r.translate((int) r.getWidth() - 1, 0); + // The next if makes sure that we don't return -1 simply because + // there is white space at the bottom of the table (ie, the display + // area is larger than the table) + if (table.rowAtPoint(r.getLocation()) == -1) + { + if (getFirstVisibleRowIndex() == -1) + return -1; + else + return table.getModel().getRowCount() - 1; + } + return table.rowAtPoint(r.getLocation()); } }