205 lines
6.2 KiB
Java
205 lines
6.2 KiB
Java
package org.gcube.portlets.user.shareupdates.client.dialog;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
|
|
import org.gcube.portal.databook.shared.Like;
|
|
import org.gcube.portlets.user.shareupdates.client.events.PickedUserEvent;
|
|
import org.gcube.portlets.user.shareupdates.client.form.SingleUserTemplate;
|
|
import org.gcube.portlets.user.shareupdates.shared.PickingUser;
|
|
|
|
import com.google.gwt.core.client.GWT;
|
|
import com.google.gwt.event.dom.client.KeyCodes;
|
|
import com.google.gwt.event.dom.client.KeyDownEvent;
|
|
import com.google.gwt.event.dom.client.KeyDownHandler;
|
|
import com.google.gwt.event.dom.client.MouseOutEvent;
|
|
import com.google.gwt.event.dom.client.MouseOutHandler;
|
|
import com.google.gwt.event.dom.client.MouseOverEvent;
|
|
import com.google.gwt.event.dom.client.MouseOverHandler;
|
|
import com.google.gwt.event.shared.HandlerManager;
|
|
import com.google.gwt.user.client.Event;
|
|
import com.google.gwt.user.client.ui.FocusPanel;
|
|
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
|
|
import com.google.gwt.user.client.ui.PopupPanel;
|
|
import com.google.gwt.user.client.ui.SuggestOracle.Callback;
|
|
import com.google.gwt.user.client.ui.SuggestOracle.Request;
|
|
import com.google.gwt.user.client.ui.SuggestOracle.Response;
|
|
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
|
|
import com.google.gwt.user.client.ui.VerticalPanel;
|
|
|
|
public class PickUsersDialog extends PopupPanel {
|
|
|
|
public final static int ARROW_UP = 38;
|
|
public final static int ARROW_DOWN = 40;
|
|
|
|
public final static int DELETE = KeyCodes.KEY_DELETE;
|
|
public final static int ENTER = KeyCodes.KEY_ENTER;
|
|
public final static int ESCAPE = KeyCodes.KEY_ESCAPE;
|
|
public final static int TAB = KeyCodes.KEY_TAB;
|
|
|
|
private HandlerManager eventBus;
|
|
|
|
private int limit = 10;
|
|
|
|
private final MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
|
|
|
|
private ArrayList<String> users = new ArrayList<String>();
|
|
private int displayIndexSelected;
|
|
|
|
private FocusPanel focusPanel = new FocusPanel();
|
|
private VerticalPanel mainPanel = new VerticalPanel();
|
|
|
|
//needed because is selected when it popups
|
|
private SingleUserTemplate first;
|
|
|
|
public PickUsersDialog(HandlerManager eventBus) {
|
|
super(true, false);
|
|
this.eventBus = eventBus;
|
|
focusPanel.setWidth("525px");
|
|
mainPanel.setWidth("525px");
|
|
setWidth("525px");
|
|
focusPanel.add(mainPanel);
|
|
setWidget(focusPanel);
|
|
setStyleName("pickDialog");
|
|
|
|
oracle.add("Massimiliano Assante");
|
|
oracle.add("Pasquale Pagano");
|
|
oracle.add("Leonardo Candela");
|
|
oracle.add("Anton Ellenbroek");
|
|
oracle.add("Ward Appeltans");
|
|
oracle.add("Gianpaolo Coro");
|
|
oracle.add("Federico De Faveri");
|
|
oracle.add("Marco Pozzi");
|
|
oracle.add("Marino Marini");
|
|
oracle.add("Franco Zoppi");
|
|
oracle.add("Valentina Marioli");
|
|
oracle.add("Antonio Gioia");
|
|
|
|
//remove the first selected when hovering
|
|
focusPanel.addMouseOverHandler(new MouseOverHandler() {
|
|
@Override
|
|
public void onMouseOver(MouseOverEvent event) {
|
|
if (first != null)
|
|
first.removeStyleName("pickperson-selected");
|
|
}
|
|
});
|
|
|
|
focusPanel.addMouseOutHandler(new MouseOutHandler() {
|
|
@Override
|
|
public void onMouseOut(MouseOutEvent event) {
|
|
select(displayIndexSelected);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* called for each keyUp event from the user
|
|
* @param event
|
|
* @param x
|
|
* @param y
|
|
* @param currText
|
|
*/
|
|
public void onKeyUp(Event event, int x, int y, String currText) {
|
|
if (currText.endsWith("@")) { //the only way i found to intercept @
|
|
setPopupPosition(x, y);
|
|
hide();
|
|
} else if (currText.contains("@")) {
|
|
if (pickingUser(currText)) {
|
|
handleNonCharKeys(event);
|
|
}
|
|
} else if (!currText.contains("@"))
|
|
hide();
|
|
}
|
|
|
|
/**
|
|
* split the text and keeps listening for user keyboard events
|
|
* @param currText the text being typed
|
|
*/
|
|
private boolean pickingUser(String currText) {
|
|
String[] toSplit = currText.split("@"); //get the interesting part
|
|
if (toSplit[1].trim().length() > 0) {
|
|
showSuggestions(toSplit[1]);
|
|
return true;
|
|
}
|
|
hide();
|
|
return false;
|
|
}
|
|
/**
|
|
* handles the nonchar events (arrows, esc, enter etc)
|
|
* @param event
|
|
*/
|
|
private void handleNonCharKeys(Event event) {
|
|
switch (event.getKeyCode()) {
|
|
case ARROW_UP:
|
|
if (displayIndexSelected > 0)
|
|
select(--displayIndexSelected);
|
|
break;
|
|
case ARROW_DOWN:
|
|
case TAB:
|
|
if (displayIndexSelected+1 < mainPanel.getWidgetCount())
|
|
select(displayIndexSelected+1);
|
|
break;
|
|
case ESCAPE:
|
|
case DELETE:
|
|
hide();
|
|
case ENTER: //selectd with keyboard
|
|
SingleUserTemplate ut = null;
|
|
if (mainPanel.getWidgetCount() > 0) {
|
|
if (displayIndexSelected < 0 || displayIndexSelected >= mainPanel.getWidgetCount()) //when there's only one left sometimes here i get -sth, no time to see why :)
|
|
ut = (SingleUserTemplate) mainPanel.getWidget(0);
|
|
else
|
|
ut = (SingleUserTemplate) mainPanel.getWidget(displayIndexSelected);
|
|
eventBus.fireEvent(new PickedUserEvent(new PickingUser("id", "username", ut.getFullName(), "thumb")));
|
|
hide();
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void showSuggestions(String query) {
|
|
if (query.length() > 0) {
|
|
oracle.requestSuggestions(new Request(query, limit), new Callback() {
|
|
public void onSuggestionsReady(Request request, Response response) {
|
|
mainPanel.clear();
|
|
int i = 0;
|
|
for (Suggestion s : response.getSuggestions()) {
|
|
if (i == 0) {
|
|
first = getUserTemplate(new PickingUser("", "", s.getDisplayString(), ""), i);
|
|
first.addStyleName("pickperson-selected");
|
|
mainPanel.add(first);
|
|
}
|
|
else
|
|
mainPanel.add(getUserTemplate(new PickingUser("", "", s.getDisplayString(), ""), i));
|
|
i++;
|
|
}
|
|
if (i > 0)
|
|
show();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private SingleUserTemplate getUserTemplate(PickingUser user, int displayIndex) {
|
|
return new SingleUserTemplate(this, user, displayIndex);
|
|
}
|
|
|
|
/**
|
|
* select the user in the model and in the view
|
|
* @param displayIndex
|
|
*/
|
|
public void select(int displayIndex) {
|
|
for (int i = 0; i < mainPanel.getWidgetCount(); i++) {
|
|
SingleUserTemplate ut = (SingleUserTemplate) mainPanel.getWidget(i);
|
|
if (i == displayIndex) {
|
|
ut.addStyleName("pickperson-selected");
|
|
displayIndexSelected = i;
|
|
//GWT.log("Selected: "+ut.getFullName());
|
|
}
|
|
else
|
|
ut.removeStyleName("pickperson-selected");
|
|
}
|
|
}
|
|
}
|