[Jguiraffe-developers] SF.net SVN: jguiraffe:[204] trunk/core/src
Brought to you by:
oheger
|
From: <oh...@us...> - 2011-07-27 19:57:25
|
Revision: 204
http://jguiraffe.svn.sourceforge.net/jguiraffe/?rev=204&view=rev
Author: oheger
Date: 2011-07-27 19:57:18 +0000 (Wed, 27 Jul 2011)
Log Message:
-----------
[3380233] SwingTableComponentHandler ensures that a newly selected row (in single-selection mode) is visible.
Modified Paths:
--------------
trunk/core/src/changes/changes.xml
trunk/core/src/main/java/net/sf/jguiraffe/gui/platform/swing/builder/components/SwingTableComponentHandler.java
trunk/core/src/test/java/net/sf/jguiraffe/gui/platform/swing/builder/components/TestSwingTableComponentHandler.java
Modified: trunk/core/src/changes/changes.xml
===================================================================
--- trunk/core/src/changes/changes.xml 2011-07-27 19:38:57 UTC (rev 203)
+++ trunk/core/src/changes/changes.xml 2011-07-27 19:57:18 UTC (rev 204)
@@ -27,6 +27,11 @@
</properties>
<body>
<release version="1.1" date="in SVN" description="TBD">
+ <action dev="oheger" issue="3380233" type="add">
+ SwingTableComponentHandler now ensures that a newly selected row
+ (in single-selection mode) becomes visible. If necessary, it changes the
+ position of the scroll pane.
+ </action>
<action dev="oheger" issue="3380231" type="update">
Updated test dependency to EasyMock to the most recent version 3.0.
</action>
Modified: trunk/core/src/main/java/net/sf/jguiraffe/gui/platform/swing/builder/components/SwingTableComponentHandler.java
===================================================================
--- trunk/core/src/main/java/net/sf/jguiraffe/gui/platform/swing/builder/components/SwingTableComponentHandler.java 2011-07-27 19:38:57 UTC (rev 203)
+++ trunk/core/src/main/java/net/sf/jguiraffe/gui/platform/swing/builder/components/SwingTableComponentHandler.java 2011-07-27 19:57:18 UTC (rev 204)
@@ -15,10 +15,13 @@
*/
package net.sf.jguiraffe.gui.platform.swing.builder.components;
+import java.awt.Point;
+import java.awt.Rectangle;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.JTable;
+import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@@ -186,7 +189,11 @@
public void setSelectedIndex(int rowIdx)
{
clearSelection();
- getTable().addRowSelectionInterval(rowIdx, rowIdx);
+ if (rowIdx >= 0)
+ {
+ getTable().addRowSelectionInterval(rowIdx, rowIdx);
+ handleScrolling(scrollPane.getViewport(), rowIdx);
+ }
}
/**
@@ -375,4 +382,38 @@
{
getTable().getSelectionModel().removeListSelectionListener(this);
}
+
+ /**
+ * Handles scrolling when a row is selected. This method ensures that the
+ * newly selected row becomes visible. However, the horizontal scrolling
+ * position should not be changed.
+ *
+ * @param vp the view port
+ * @param rowIdx the index of the row to be made visible
+ */
+ void handleScrolling(JViewport vp, int rowIdx)
+ {
+ Point orgPos = vp.getViewPosition();
+ Rectangle rect = getTable().getCellRect(rowIdx, 0, true);
+ getTable().scrollRectToVisible(rect);
+ updateViewport(vp, orgPos);
+ }
+
+ /**
+ * Updates the scroll position of the view port. This method is called when
+ * a row is selected. In this case the row should be made visible, but the
+ * horizontal position should not be changed. This method ensures that the X
+ * offset is restored if it was changed.
+ *
+ * @param vp the {@code JViewport}
+ * @param orgPos the original position of the {@code JViewport}
+ */
+ void updateViewport(JViewport vp, Point orgPos)
+ {
+ Point newPos = vp.getViewPosition();
+ if (orgPos.x != newPos.x)
+ {
+ vp.setViewPosition(new Point(orgPos.x, newPos.y));
+ }
+ }
}
Modified: trunk/core/src/test/java/net/sf/jguiraffe/gui/platform/swing/builder/components/TestSwingTableComponentHandler.java
===================================================================
--- trunk/core/src/test/java/net/sf/jguiraffe/gui/platform/swing/builder/components/TestSwingTableComponentHandler.java 2011-07-27 19:38:57 UTC (rev 203)
+++ trunk/core/src/test/java/net/sf/jguiraffe/gui/platform/swing/builder/components/TestSwingTableComponentHandler.java 2011-07-27 19:57:18 UTC (rev 204)
@@ -21,12 +21,15 @@
import static org.junit.Assert.assertTrue;
import java.awt.Color;
+import java.awt.Point;
+import java.awt.Rectangle;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.JTable;
+import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableModel;
@@ -36,6 +39,7 @@
import net.sf.jguiraffe.gui.platform.swing.builder.components.table.SwingTableModel;
import net.sf.jguiraffe.gui.platform.swing.builder.event.ChangeListener;
+import org.apache.commons.lang.mutable.MutableObject;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
@@ -84,7 +88,7 @@
private JTable table;
/** Stores the handler under test. */
- private SwingTableComponentHandler handler;
+ private SwingTableComponentHandlerTestImpl handler;
@Before
public void setUp() throws Exception
@@ -98,7 +102,7 @@
return MODEL_LIST;
}
}, table));
- handler = new SwingTableComponentHandler(table, 0, 0);
+ handler = new SwingTableComponentHandlerTestImpl(table, 0, 0);
}
/**
@@ -338,8 +342,10 @@
public void testSetSelectedIndex()
{
initSingleSel();
- handler.setSelectedIndex(2);
- assertEquals("Selected index was not set", 2, table.getSelectedRow());
+ final int index = 2;
+ handler.setSelectedIndex(index);
+ assertEquals("Selected index was not set", index, table.getSelectedRow());
+ assertEquals("Not scrolled", index, handler.getScrollingIndex());
}
/**
@@ -357,6 +363,72 @@
}
/**
+ * Tries to set an invalid table index.
+ */
+ @Test
+ public void testSetSelectedIndexInvalid()
+ {
+ initSingleSel();
+ handler.setSelectedIndex(-1);
+ assertEquals("Wrong number of selected rows", 0, table.getSelectedRowCount());
+ }
+
+ /**
+ * Tests whether the handler makes the newly selected row visible.
+ */
+ @Test
+ public void testHandleScrolling()
+ {
+ JViewport vp = EasyMock.createMock(JViewport.class);
+ final Rectangle rect = EasyMock.createMock(Rectangle.class);
+ EasyMock.expect(vp.getViewPosition()).andReturn(new Point(10, 111));
+ EasyMock.expect(vp.getViewPosition()).andReturn(new Point(0, 100));
+ vp.setViewPosition(new Point(10, 100));
+ EasyMock.replay(rect, vp);
+ final int index = 5;
+ final MutableObject scrolledRect = new MutableObject();
+ JTable tab = new JTable(table.getModel())
+ {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Rectangle getCellRect(int row, int column,
+ boolean includeSpacing)
+ {
+ assertEquals("Wrong row", index, row);
+ assertEquals("Wrong column", 0, column);
+ assertTrue("Wrong spacing flag", includeSpacing);
+ return rect;
+ }
+
+ @Override
+ public void scrollRectToVisible(Rectangle aRect)
+ {
+ scrolledRect.setValue(aRect);
+ }
+ };
+ handler = new SwingTableComponentHandlerTestImpl(tab, 0, 0);
+ handler.setMockScrollingToSelectedRow(false);
+ handler.handleScrolling(vp, index);
+ assertSame("Wrong rectangle", rect, scrolledRect.getValue());
+ EasyMock.verify(rect, vp);
+ }
+
+ /**
+ * Tests whether the view port is not modified if the x position did not
+ * change when a cell was made visible.
+ */
+ @Test
+ public void testUpdateViewportNoXChange()
+ {
+ JViewport vp = EasyMock.createMock(JViewport.class);
+ EasyMock.expect(vp.getViewPosition()).andReturn(new Point(10, 100));
+ EasyMock.replay(vp);
+ handler.updateViewport(vp, new Point(10, 50));
+ EasyMock.verify(vp);
+ }
+
+ /**
* Tests querying the selected index.
*/
@Test
@@ -594,10 +666,85 @@
}
/**
+ * A test implementation of the table handler with some mocing facilities.
+ */
+ private static class SwingTableComponentHandlerTestImpl extends
+ SwingTableComponentHandler
+ {
+ /**
+ * A flag whether scrolling to the selected row should be mocked. This
+ * is true per default!
+ */
+ private boolean mockScrollingToSelectedRow;
+
+ /** Stores the index passed to handleScrolling(). */
+ private int scrollingIndex;
+
+ public SwingTableComponentHandlerTestImpl(JTable table,
+ int scrollWidth, int scrollHeight)
+ {
+ super(table, scrollWidth, scrollHeight);
+ mockScrollingToSelectedRow = true;
+ scrollingIndex = -1;
+ }
+
+ /**
+ * Returns a flag whether scrolling to the selected row should be
+ * mocked.
+ *
+ * @return the mocking flag
+ */
+ public boolean isMockScrollingToSelectedRow()
+ {
+ return mockScrollingToSelectedRow;
+ }
+
+ /**
+ * Sets a flag whether scrolling to the selected should be mocked.
+ *
+ * @param mockScrollingToSelectedRow the flag
+ */
+ public void setMockScrollingToSelectedRow(
+ boolean mockScrollingToSelectedRow)
+ {
+ this.mockScrollingToSelectedRow = mockScrollingToSelectedRow;
+ }
+
+ /**
+ * Returns the index passed to handleScrolling().
+ *
+ * @return the scrolling index
+ */
+ public int getScrollingIndex()
+ {
+ return scrollingIndex;
+ }
+
+ /**
+ * Checks the parameters, records this invocation. Optionally this
+ * method is mocked.
+ */
+ @Override
+ void handleScrolling(JViewport vp, int rowIdx)
+ {
+ if (isMockScrollingToSelectedRow())
+ {
+ assertSame("Wrong viewport",
+ ((JScrollPane) getOuterComponent()).getViewport(), vp);
+ scrollingIndex = rowIdx;
+ }
+ else
+ {
+ super.handleScrolling(vp, rowIdx);
+ }
+ }
+ }
+
+ /**
* A table model implementation used for testing. The test table will have a
* model of this type.
*/
- static class TableModelImpl extends SwingTableModel
+ private static class TableModelImpl extends SwingTableModel
{
private static final long serialVersionUID = 8768314516739492104L;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|