svn changeset:18218/svn branch:6.6tags/6.7.0.beta1
@@ -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 |
@@ -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); | |||
} | |||
} |
@@ -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; | |||
} | |||
} |