Fix for Bug #320, Users tagging does not work if @ is in the middle of already typed text

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/pickitem-widget@117242 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Massimiliano Assante 2015-07-14 17:21:21 +00:00
parent 1718317ebb
commit 907f72de81
5 changed files with 72 additions and 34 deletions

View File

@ -1,6 +1,13 @@
<ReleaseNotes>
<Changeset component="org.gcube.portlets.widgets.pickitem.0-4-0"
<Changeset component="portlets-widgets.pickitem-widget.1-1-0"
date="2015-07-14">
<Change>Ported to GWT 2.7.0</Change>
<Change>Fix for Bug #320, Users tagging does not work if @ is in the
middle of already typed text</Change>
</Changeset>
<Changeset component="portlets-widgets.pickitem-widget.1-0-0"
date="2013-10-21">
<Change>Refactored and ported to GWT 2.5.1</Change>
<Change>First Release</Change>
</Changeset>
</ReleaseNotes>

View File

@ -11,7 +11,7 @@
<groupId>org.gcube.portlets.widgets</groupId>
<artifactId>pickitem-widget</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gCube Pick Item Widget</name>
<description>
@ -24,9 +24,8 @@
</scm>
<properties>
<!-- Convenience property to set the GWT version -->
<gwtVersion>2.5.1</gwtVersion>
<gwtVersion>2.7.0</gwtVersion>
<distroDirectory>distro</distroDirectory>
<!-- GWT needs at least java 1.6 -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
@ -50,7 +49,7 @@
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<!-- "provided" so that we don't deploy -->
<version>${gwtVersion}</version>
<scope>provided</scope>
</dependency>
</dependencies>

View File

@ -53,7 +53,7 @@ public class PickItem implements EntryPoint {
tb.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
pickUserDlg.onKeyUp(event.getNativeKeyCode(), tb.getAbsoluteLeft(), popUpY, tb.getText());
pickUserDlg.onKeyPress(-1, event.getNativeKeyCode(), tb.getAbsoluteLeft(), popUpY, tb.getText());
}
});

View File

@ -9,6 +9,7 @@ import org.gcube.portlets.widgets.pickitem.client.uibinder.SelectableItem;
import org.gcube.portlets.widgets.pickitem.client.uibinder.WithPhotoTemplate;
import org.gcube.portlets.widgets.pickitem.shared.ItemBean;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
@ -17,6 +18,7 @@ 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.Window;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.PopupPanel;
@ -54,7 +56,7 @@ public class PickItemsDialog extends PopupPanel {
private FocusPanel focusPanel = new FocusPanel();
private VerticalPanel mainPanel = new VerticalPanel();
private String triggerChar;
private char triggerChar;
private ArrayList<ItemBean> users;
//needed because is selected when it popups
@ -65,7 +67,7 @@ public class PickItemsDialog extends PopupPanel {
static {
CssAndImages.INSTANCE.css().ensureInjected();
}
/**
* @param triggerChar the 'single char' used to trigger the items list show, e.g. '@', '#' ....
* @param the list of user to pick
@ -80,7 +82,7 @@ public class PickItemsDialog extends PopupPanel {
throw new IllegalArgumentException("width must be greater than 199");
}
this.eventBus = eventBus;
this.triggerChar = ""+triggerChar;
this.triggerChar = triggerChar;
this.includeTriggerChar = false;
this.hasPhoto = false;
this.users = users;
@ -132,51 +134,68 @@ public class PickItemsDialog extends PopupPanel {
public void withTriggerCharIncluded() {
includeTriggerChar = true;
}
private void handleMouseDown() {
SelectableItem ut = (SelectableItem) mainPanel.getWidget(displayIndexSelected);
eventBus.fireEvent(new PickedItemEvent(new ItemBean("id", "username", ut.getItemName(), "thumb"), this.triggerChar));
eventBus.fireEvent(new PickedItemEvent(new ItemBean("id", "username", ut.getItemName(), "thumb"), this.triggerChar, itemCursorIndexStart, itemCursorIndexEnd));
hide();
select(0); //RESET
}
private int itemCursorIndexEnd;
private int itemCursorIndexStart = -1;
boolean handleNonCharKeys = false;
/**
* called for each keyUp event from the user
* called for each onKeyPress event from the user
* @param keyCode the event keycode
* @param x
* @param y
* @param currText
*/
public void onKeyUp(int keyCode, int x, int y, String currText) {
if (currText.endsWith(triggerChar)) { //the only way i found to intercept the triggerChar
public void onKeyPress(int cursorPos, int keyCode, int x, int y, String currText) {
char ch = (char) keyCode;
if (ch == triggerChar) {
setPopupPosition(x, y);
hide();
}
handleNonCharKeys = false;
this.itemCursorIndexStart = cursorPos;
}
else {
String last5 = (currText.length() > 5) ? currText.substring(currText.length()-5): currText;
if (last5.contains(triggerChar)) {
if (pickingUser(currText)) {
handleNonCharKeys(keyCode);
itemCursorIndexEnd = cursorPos;
currText = currText.substring(itemCursorIndexStart, cursorPos)+ch;
if (currText.contains(""+triggerChar) && currText.length() > 1) {
if (pickingUser(currText.substring(1))) {
handleNonCharKeys = true;
}
} else if (!last5.contains(triggerChar))
} else if (!currText.contains(""+triggerChar)) {
hide();
handleNonCharKeys = false;
}
}
}
/**
* called for each onKeyUp event from the user
* @param keyCode the event keycode
*/
public void onKeyUp(int keyCode) {
if (handleNonCharKeys)
handleNonCharKeys(keyCode);
}
/**
* split the text and keeps listening for user keyboard events
* @param currText the text being typed
*/
private boolean pickingUser(String currText) {
int tPos = currText.lastIndexOf(triggerChar);
String toSplit = currText.substring(tPos);
String[] splitted = toSplit.split(triggerChar); //get the interesting part
if (splitted[1].trim().length() > 0) {
if (currText.trim().length() > 0) {
if (includeTriggerChar)
showSuggestions(triggerChar+splitted[1]);
showSuggestions(triggerChar+currText);
else
showSuggestions(splitted[1]);
showSuggestions(currText);
return true;
}
hide();
@ -207,7 +226,7 @@ public class PickItemsDialog extends PopupPanel {
ut = (SelectableItem) mainPanel.getWidget(0);
else
ut = (SelectableItem) mainPanel.getWidget(displayIndexSelected);
eventBus.fireEvent(new PickedItemEvent(new ItemBean("id", "username", ut.getItemName(), "thumb"), this.triggerChar));
eventBus.fireEvent(new PickedItemEvent(new ItemBean("id", "username", ut.getItemName(), "thumb"), this.triggerChar, itemCursorIndexStart, itemCursorIndexEnd));
hide();
select(0); //RESET
}

View File

@ -10,11 +10,16 @@ public class PickedItemEvent extends GwtEvent<PickedItemEventHandler> {
public static Type<PickedItemEventHandler> TYPE = new Type<PickedItemEventHandler>();
private ItemBean item;
private String triggerChar;
public PickedItemEvent(ItemBean item, String triggerChar) {
private char triggerChar;
private int itemCursorIndexStart;
private int itemCursorIndexEnd;
public PickedItemEvent(ItemBean item, char triggerChar, int itemCursorIndexStart, int itemCursorIndexEnd) {
super();
this.item = item;
this.triggerChar = triggerChar;
this.itemCursorIndexStart = itemCursorIndexStart;
this.itemCursorIndexEnd = itemCursorIndexEnd;
}
@Override
@ -26,12 +31,20 @@ public class PickedItemEvent extends GwtEvent<PickedItemEventHandler> {
protected void dispatch(PickedItemEventHandler handler) {
handler.onSelectedItem(this);
}
public int getItemCursorIndexStart() {
return itemCursorIndexStart;
}
public int getItemCursorIndexEnd() {
return itemCursorIndexEnd;
}
public ItemBean getSelectedItem() {
return item;
}
public String getTriggerChar() {
public char getTriggerChar() {
return triggerChar;
}
}