/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.view.component; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Locale; import java.util.Set; import org.eclipse.skalli.model.Member; import org.eclipse.skalli.model.User; import org.eclipse.skalli.services.user.UserServices; import org.eclipse.skalli.view.component.PeopleSearchWindow.IPeopleSelectHandler; import org.eclipse.skalli.view.internal.container.UserContainer; import com.vaadin.data.Item; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; public class UsersPicker extends CustomField implements IPeopleSelectHandler { private static final long serialVersionUID = -8373359795470666228L; private static final String STYLE_TABLE = "usrpk-tbl"; private static final String STYLE_BUTTON = "multitext-btn"; // use the same style as used in multitext component public static final String COLUMN_USER = "user"; public static final String COLUMN_REMOVE = "remove"; private final VerticalLayout layout; private final UsersPickerContainer tableDateSource; private final Collection<Member> members; private boolean modified; private boolean readOnly; private Table table; public UsersPicker(String caption, Collection<Member> members) { modified = false; this.members = members; tableDateSource = UsersPickerContainer.newInstance(new ArrayList<User>()); initializeTableDataSource(); layout = new VerticalLayout(); layout.setWidth("100%"); // do not change that! otherwise right border of table is hidden in IE! renderTable(); setCaption(caption); setCompositionRoot(layout); } private void initializeTableDataSource() { if (members != null) { for (Member member : members) { User user = UserContainer.getUser(member); if (user != null) { tableDateSource.addItem(user); } } } } @SuppressWarnings({ "serial", "deprecation" }) private void renderTable() { table = new Table(); table.addStyleName(STYLE_TABLE); table.setSelectable(true); table.setContainerDataSource(tableDateSource); table.addGeneratedColumn(COLUMN_USER, new Table.ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { String userId = itemId.toString(); User user = UserServices.getUser(userId); PeopleComponent peopleComponent = new PeopleComponent(user); return peopleComponent; } }); if (!readOnly) { table.addGeneratedColumn(COLUMN_REMOVE, new Table.ColumnGenerator() { @Override public Component generateCell(Table source, final Object itemId, Object columnId) { Button b = new Button("remove"); b.setStyleName(Button.STYLE_LINK); b.addStyleName(STYLE_BUTTON); b.setDescription("Remove this member"); b.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { removeItem(itemId); adjustPageLength(table); } }); return b; } }); } table.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN); if (!readOnly) { table.setVisibleColumns(new String[] { COLUMN_USER, COLUMN_REMOVE }); table.setColumnExpandRatio(COLUMN_USER, 0.5f); table.setColumnWidth(COLUMN_REMOVE, 50); table.setColumnHeaders(new String[] { "User", "Remove" }); } else { table.setVisibleColumns(new String[] { COLUMN_USER }); table.setColumnHeaders(new String[] { "User", }); } table.setSelectable(false); table.setWidth("100%"); // do not change that! otherwise right border of table is hidden in IE! table.setReadOnly(readOnly); adjustPageLength(table); layout.addComponent(table); layout.setExpandRatio(table, 1.0f); if (!readOnly) { Button searchButton = new Button("Add user", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { PeopleSearchWindow search = new PeopleSearchWindow(UsersPicker.this, UsersPicker.this); search.show(); adjustPageLength(table); } }); searchButton.setStyle(Button.STYLE_LINK); searchButton.setDescription("Add user"); searchButton.setWidth("80px"); layout.addComponent(searchButton); } } private void removeItem(Object itemId) { if (itemId != null) { tableDateSource.removeItem(itemId); modified = true; } } private void adjustPageLength(Table table) { if (tableDateSource.size() > 0) { table.setPageLength(0); } else { table.setPageLength(1); } } @Override public void onPeopleSelected(Set<User> users) { for (User user : users) { tableDateSource.addItem(user); } modified = true; adjustPageLength(table); } @Override public void commit() throws SourceException, InvalidValueException { // add all existing for (Object itemId : tableDateSource.getItemIds()) { String userId = (String) itemId; Member member = null; for (Member m : members) { if (m.getUserID().equalsIgnoreCase(userId)) { member = m; break; } } if (member == null) { member = new Member((String) itemId); } members.add(member); } // remove all nonexisting Iterator<Member> iterator = members.iterator(); while (iterator.hasNext()) { Member member = iterator.next(); Item item = tableDateSource.getItem(member.getUserID().toLowerCase(Locale.ENGLISH)); if (item == null) { iterator.remove(); } } } @Override public boolean isModified() { return modified; } @Override public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; layout.removeAllComponents(); renderTable(); } @Override public boolean isReadOnly() { return readOnly; } @Override public Class<?> getType() { return Set.class; } }