package kornell.gui.client.util.forms.formfield; import java.util.HashMap; import java.util.Map; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.Typeahead; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.Widget; import kornell.api.client.Callback; import kornell.api.client.KornellSession; import kornell.core.entity.Person; import kornell.core.to.PeopleTO; import kornell.core.to.PersonTO; import kornell.core.util.StringUtils; import kornell.gui.client.util.forms.FormHelper; public class PeopleMultipleSelect extends Composite { private FormHelper formHelper = GWT.create(FormHelper.class); private KornellSession session; private TextBox search; private MultiWordSuggestOracle oracle; private ListBox multipleSelect; private Map<String, Person> oraclePeople; public PeopleMultipleSelect(KornellSession session) { this.session = session; } @Override public Widget asWidget() { return getPeopleMultipleSelectPanel(); } private FlowPanel getPeopleMultipleSelectPanel() { FlowPanel courseClassAdminsPanel = new FlowPanel(); courseClassAdminsPanel.addStyleName("fieldPanel"); courseClassAdminsPanel.add(getTypeAheadPanel()); FlowPanel multipleSelectPanel = getMultipleSelectPanel(); courseClassAdminsPanel.add(multipleSelectPanel); return courseClassAdminsPanel; } private FlowPanel getMultipleSelectPanel() { FlowPanel multipleSelectPanel = new FlowPanel(); multipleSelect = new ListBox(true); multipleSelect.addStyleName("selectField"); multipleSelectPanel.add(multipleSelect); Button btnRemove = new Button("Remover"); btnRemove.addStyleName("btnSelected btnStandard"); btnRemove.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { while (multipleSelect.getSelectedIndex() != -1) { multipleSelect.removeItem(multipleSelect.getSelectedIndex()); } } }); multipleSelectPanel.add(btnRemove); return multipleSelectPanel; } private FlowPanel getTypeAheadPanel() { FlowPanel typeaheadPanel = new FlowPanel(); Typeahead typeahead = new Typeahead(); search = new TextBox(); search.addStyleName("textField"); search.setPlaceholder("Digite o nome de usuário a adicionar"); search.addKeyUpHandler(new KeyUpHandler() { String currentSearch = ""; String previousSearch = ""; Timer searchChangesTimer = new Timer() { @Override public void run() { searchChanged(currentSearch); } }; @Override public void onKeyUp(KeyUpEvent event) { currentSearch = search.getText(); if (currentSearch.length() >= 1 && (!currentSearch.equals(previousSearch) || event.getNativeKeyCode() == 86 || event.getNativeKeyCode() == 17)) { searchChangesTimer.cancel(); searchChangesTimer.schedule(100); } previousSearch = currentSearch; } }); typeahead.add(search); oracle = (MultiWordSuggestOracle) typeahead.getSuggestOracle(); typeaheadPanel.add(typeahead); Button btnAdd = new Button("Adicionar"); btnAdd.addStyleName("btnAction btnStandard"); btnAdd.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addAdmin(); } }); typeaheadPanel.add(btnAdd); return typeaheadPanel; } private void searchChanged(final String searchStr) { session.people().findBySearchTerm(searchStr, session.getInstitution().getUUID(), new Callback<PeopleTO>() { @Override public void ok(PeopleTO to) { oraclePeople = new HashMap<String, Person>(); oracle.clear(); String username, oracleStr = ""; Person person; int i = 0; for (PersonTO personTO : to.getPeopleTO()) { person = personTO.getPerson(); username = personTO.getUsername(); oracleStr = username + (StringUtils.isSome(person.getFullName()) ? " (" + person.getFullName() + ")" : ""); oracle.add(oracleStr); oraclePeople.put(username, person); if (++i == 10) break; } if(to.getPeopleTO().size() == 1){ Person p = oraclePeople.get(searchStr); if(p != null){ search.setText(oracleStr); } } } }); } private void addAdmin() { String item = search.getText().split(" \\(")[0]; if (oraclePeople != null && oraclePeople.containsKey(item)) { if (!formHelper.isItemInListBox(search.getText(), multipleSelect)) { Person person = (Person) oraclePeople.get(item); multipleSelect.addItem(search.getText(), person.getUUID()); } search.setText(""); } } public ListBox getMultipleSelect() { return multipleSelect; } public void addItem(String item, String uuid) { multipleSelect.addItem(item, uuid); } }