/* * Copyright (c) 2016 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.wicket.markup.html.table; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.obiba.wicket.extensions.ajax.markup.html.AjaxDropDownMultipleChoice; class ColumnSelectorPanel<T> extends Panel { private static final long serialVersionUID = 1L; private final EntityListTablePanel<T> table; ColumnSelectorPanel(String id, EntityListTablePanel<T> tablePanel) { super(id); table = tablePanel; final ColumnSelectionModel model = new ColumnSelectionModel(table.getColumnProvider()); add(new AjaxDropDownMultipleChoice("selector", model.getSelectable(), model.getSelected()) { private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") @Override protected void onSelectionUpdate(List selected, Object selection, AjaxRequestTarget target) { List<IColumn<T>> columns = new ArrayList<IColumn<T>>(selected.size()); // Add all the required columns. columns.addAll(table.getColumnProvider().getRequiredColumns()); // Add the selected columns for(SelectableColumn selectable : (List<SelectableColumn>) selected) { columns.add(selectable.column); } table.updateColumns(columns, target); } }); } protected class ColumnSelectionModel extends Model { private static final long serialVersionUID = 1L; private final List<SelectableColumn> selected; private final List<SelectableColumn> unselected; private final List<SelectableColumn> selectable; public ColumnSelectionModel(IColumnProvider provider) { List<IColumn> required = provider.getRequiredColumns(); List<IColumn> defaultSelected = provider.getDefaultColumns(); List<IColumn> available = provider.getAdditionalColumns(); int size = (defaultSelected == null ? 5 : defaultSelected.size()) + (available == null ? 5 : available.size()); selected = new ArrayList<SelectableColumn>(size); unselected = new ArrayList<SelectableColumn>(size); selectable = new ArrayList<SelectableColumn>(size); int index = 0; if(defaultSelected != null) { for(IColumn column : defaultSelected) { if(required.contains(column)) continue; String name = table.getColumnHeaderName(column); if(name != null) { selected.add(new SelectableColumn(column, index++, true)); } } } if(available != null) { for(IColumn column : available) { String name = table.getColumnHeaderName(column); if(name != null) { unselected.add(new SelectableColumn(column, index++, false)); } } } selectable.addAll(selected); selectable.addAll(unselected); } public List<SelectableColumn> getSelected() { return selected; } public List<SelectableColumn> getUnselected() { return unselected; } public List<SelectableColumn> getSelectable() { return selectable; } public boolean isSelected(SelectableColumn column) { return selected.contains(column); } public void setSelected(SelectableColumn column) { selected.add(column); unselected.remove(column); } } protected class SelectableColumn implements Serializable { private static final long serialVersionUID = 1L; private final IColumn<T> column; private final int position; private boolean selected = true; public SelectableColumn(IColumn<T> column, int position) { this(column, position, true); } public SelectableColumn(IColumn<T> column, int position, boolean selected) { this.column = column; this.position = position; this.selected = selected; } protected boolean isSelected() { return selected; } protected void setSelected(boolean selected) { this.selected = selected; } protected IColumn<T> getColumn() { return column; } protected int getPosition() { return position; } @Override public String toString() { return table.getColumnHeaderName(column); } } }