/*******************************************************************************
* 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.Set;
import java.util.TreeSet;
import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.model.User;
import org.eclipse.skalli.view.internal.container.UserContainer;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.ListSelect;
import com.vaadin.ui.NativeButton;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class PeopleSearchWindow extends Window {
private static final long serialVersionUID = -2022741177097739042L;
private final ThemeResource ICON_BUTTON_ADD_SELECTED = new ThemeResource("icons/button/ok.png"); //$NON-NLS-1$
private static final String STYLE_USER_DOSEARCH = "pplsrch-dosearch"; //$NON-NLS-1$
private final IPeopleSelectHandler selectHandler;
private ListSelect list;
private TextField searchField;
private final IndexedContainer dataSource = new IndexedContainer();
private VerticalLayout root;
private final Component parent;
public PeopleSearchWindow(Component parent, IPeopleSelectHandler selectHandler) {
this.parent = parent;
this.selectHandler = selectHandler;
createContents();
}
private void createContents() {
setModal(true);
setCaption("Search people...");
setWidth("310px"); //$NON-NLS-1$
setHeight("400px"); //$NON-NLS-1$
root = new VerticalLayout();
root.setMargin(true);
root.setSpacing(true);
HorizontalLayout search = new HorizontalLayout();
search.setSpacing(true);
searchField = new TextField("Search for:");
searchField.setWidth("20em"); //$NON-NLS-1$
searchField.setImmediate(true);
searchField.addListener(new ValueChangeListener() {
@Override
public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
search((String) searchField.getValue());
list.focus();
}
});
search.addComponent(searchField);
search.setComponentAlignment(searchField, Alignment.BOTTOM_LEFT);
search.setExpandRatio(searchField, 1.0f);
Button searchButton = new NativeButton("", new Button.ClickListener() { //$NON-NLS-1$
@Override
public void buttonClick(ClickEvent event) {
search((String) searchField.getValue());
}
});
searchButton.setDescription("Search");
searchButton.setStyleName(STYLE_USER_DOSEARCH);
search.addComponent(searchButton);
search.setComponentAlignment(searchButton, Alignment.BOTTOM_LEFT);
search.setExpandRatio(searchButton, 0);
root.addComponent(search);
list = new ListSelect("Search results:", dataSource);
list.setSizeFull();
list.setMultiSelect(true);
list.setImmediate(true);
HorizontalLayout buttons = new HorizontalLayout();
buttons.setSpacing(true);
Button addButton = new Button("Add");
addButton.setIcon(ICON_BUTTON_ADD_SELECTED);
addButton.setDescription("Adds the selected person to the list.");
addButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Set<User> values = (Set<User>) list.getValue();
if (selectHandler != null && values != null) {
selectHandler.onPeopleSelected(values);
list.removeAllItems();
searchField.setValue(""); //$NON-NLS-1$
searchField.focus();
}
}
});
buttons.addComponent(addButton);
Button addAndCloseButton = new Button("Add & Close");
addAndCloseButton.setIcon(ICON_BUTTON_ADD_SELECTED);
addAndCloseButton.setDescription("Adds the selected person to the list and closes the dialog.");
addAndCloseButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Set<User> values = (Set<User>) list.getValue();
if (selectHandler != null && values != null) {
selectHandler.onPeopleSelected(values);
close();
}
}
});
buttons.addComponent(addAndCloseButton);
root.addComponent(list);
root.addComponent(buttons);
root.setSizeFull();
root.setExpandRatio(list, 1);
// root.setStyleName(STYLE_LAYOUT);
setContent(root);
searchField.focus();
}
private void search(String searchText) {
dataSource.removeAllItems();
if (StringUtils.isNotEmpty(searchText)) {
TreeSet<User> sorted = new TreeSet<User>(UserContainer.findUsers(searchText));
for (User user : sorted) {
dataSource.addItem(user);
}
if (sorted.size() == 1) {
list.select(sorted.iterator().next());
}
}
}
public void show() {
parent.getWindow().addWindow(this);
}
public static interface IPeopleSelectHandler {
public void onPeopleSelected(Set<User> users);
}
}