From a6197b4df19e4c93fec76821a9b627b4be0d25ca Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Tue, 12 Apr 2011 07:48:20 +0000 Subject: [PATCH] merged [18197],[18217] from 6.5 branch svn changeset:18218/svn branch:6.6 --- .../terminal/gwt/client/ui/VScrollTable.java | 4 + src/com/vaadin/ui/Table.java | 75 +++++++++++++- .../components/table/ColumnReorderEvent.java | 97 +++++++++++++++++++ 3 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 tests/src/com/vaadin/tests/components/table/ColumnReorderEvent.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index c16741523d..8efd582fe6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -107,6 +107,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, public static final String HEADER_CLICK_EVENT_ID = "handleHeaderClick"; public static final String FOOTER_CLICK_EVENT_ID = "handleFooterClick"; public static final String COLUMN_RESIZE_EVENT_ID = "columnResize"; + public static final String COLUMN_REORDER_EVENT_ID = "columnReorder"; private static final double CACHE_RATE_DEFAULT = 2; @@ -1329,6 +1330,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } } client.updateVariable(paintableId, "columnorder", columnOrder, false); + if (client.hasEventListeners(this, COLUMN_REORDER_EVENT_ID)) { + client.sendPendingVariableChanges(); + } } @Override diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 89f50f01ab..290aa1cf09 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -2117,6 +2117,9 @@ public class Table extends AbstractSelect implements Action.Container, idsTemp[i] = columnIdMap.get(ids[i].toString()); } setColumnOrder(idsTemp); + if (hasListeners(ColumnReorderEvent.class)) { + fireEvent(new ColumnReorderEvent(this)); + } } catch (final Exception e) { // FIXME: Handle exception logger.log(Level.FINER, @@ -3850,7 +3853,7 @@ public class Table extends AbstractSelect implements Action.Container, new Class[] { HeaderClickEvent.class }); } catch (final java.lang.NoSuchMethodException e) { // This should never happen - throw new java.lang.RuntimeException(); + throw new java.lang.RuntimeException(e); } } @@ -3890,7 +3893,7 @@ public class Table extends AbstractSelect implements Action.Container, new Class[] { FooterClickEvent.class }); } catch (final java.lang.NoSuchMethodException e) { // This should never happen - throw new java.lang.RuntimeException(); + throw new java.lang.RuntimeException(e); } } @@ -4081,7 +4084,7 @@ public class Table extends AbstractSelect implements Action.Container, new Class[] { ColumnResizeEvent.class }); } catch (final java.lang.NoSuchMethodException e) { // This should never happen - throw new java.lang.RuntimeException(); + throw new java.lang.RuntimeException(e); } } @@ -4176,4 +4179,70 @@ public class Table extends AbstractSelect implements Action.Container, removeListener(VScrollTable.COLUMN_RESIZE_EVENT_ID, ColumnResizeEvent.class, listener); } + + /** + * This event is fired when a columns are reordered by the end user user. + */ + public static class ColumnReorderEvent extends Component.Event { + public static final Method METHOD; + + static { + try { + METHOD = ColumnReorderListener.class.getDeclaredMethod( + "columnReorder", + new Class[] { ColumnReorderEvent.class }); + } catch (final java.lang.NoSuchMethodException e) { + // This should never happen + throw new java.lang.RuntimeException(e); + } + } + + /** + * Constructor + * + * @param source + * The source of the event + */ + public ColumnReorderEvent(Component source) { + super(source); + } + + } + + /** + * Interface for listening to column reorder events. + */ + public interface ColumnReorderListener extends Serializable { + + /** + * This method is triggered when the column has been reordered + * + * @param event + */ + public void columnReorder(ColumnReorderEvent event); + } + + /** + * Adds a column reorder listener to the Table. A column reorder listener is + * called when a user reorders columns. + * + * @param listener + * The listener to attach to the Table + */ + public void addListener(ColumnReorderListener listener) { + addListener(VScrollTable.COLUMN_REORDER_EVENT_ID, + ColumnReorderEvent.class, listener, ColumnReorderEvent.METHOD); + } + + /** + * Removes a column reorder listener from the Table. + * + * @param listener + * The listener to remove + */ + public void removeListener(ColumnReorderListener listener) { + removeListener(VScrollTable.COLUMN_REORDER_EVENT_ID, + ColumnReorderEvent.class, listener); + } + } diff --git a/tests/src/com/vaadin/tests/components/table/ColumnReorderEvent.java b/tests/src/com/vaadin/tests/components/table/ColumnReorderEvent.java new file mode 100644 index 0000000000..4c1fc70e5e --- /dev/null +++ b/tests/src/com/vaadin/tests/components/table/ColumnReorderEvent.java @@ -0,0 +1,97 @@ +package com.vaadin.tests.components.table; + +import com.vaadin.data.Item; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Table; + +@SuppressWarnings("serial") +public class ColumnReorderEvent extends TestBase { + + private Label order = new Label("Column order"); + + @Override + protected void setup() { + + HorizontalLayout widths = new HorizontalLayout(); + widths.setSpacing(true); + widths.setWidth("50%"); + + order.setCaption("Column 1 width"); + widths.addComponent(order); + + addComponent(widths); + + Table table1 = initTable(); + addComponent(table1); + + order.setValue(aToString(table1.getVisibleColumns())); + + } + + private String aToString(Object[] visibleColumns) { + StringBuilder sb = new StringBuilder(); + for (Object object : visibleColumns) { + sb.append(object.toString()); + sb.append(" | "); + } + return sb.toString(); + } + + @Override + protected String getDescription() { + return "Test ColumnReorderEvents"; + } + + @Override + protected Integer getTicketNumber() { + return 6283; + } + + private static final int ROWS = 100; + + private Table initTable() { + final Table table = new Table(); + table.setWidth("100%"); + table.setImmediate(true); + + IndexedContainer idx = new IndexedContainer(); + idx.addContainerProperty("firstname", String.class, null); + idx.addContainerProperty("lastname", String.class, null); + + Item i = idx.addItem(1); + i.getItemProperty("firstname").setValue("John"); + i.getItemProperty("lastname").setValue("Johnson"); + + i = idx.addItem(2); + i.getItemProperty("firstname").setValue("Jane"); + i.getItemProperty("lastname").setValue("Janeine"); + + for (int index = 3; index < ROWS; index++) { + i = idx.addItem(index); + i.getItemProperty("firstname").setValue("Jane"); + i.getItemProperty("lastname").setValue("Janeine"); + } + + idx.addContainerProperty("property", String.class, "foobar"); + + table.setContainerDataSource(idx); + + table.setColumnHeader("firstname", "FirstName"); + table.setColumnHeader("lastname", "LastName"); + + table.addListener(new Table.ColumnReorderListener() { + public void columnReorder( + com.vaadin.ui.Table.ColumnReorderEvent event) { + order.setValue(aToString(table.getVisibleColumns())); + } + }); + + table.setColumnReorderingAllowed(true); + + return table; + } + +} -- 2.39.5