diff --git a/distro/changelog.xml b/distro/changelog.xml
index 3b3de47..fa88b83 100644
--- a/distro/changelog.xml
+++ b/distro/changelog.xml
@@ -1,6 +1,13 @@
-
+ Ported to GWT 2.7.0
+ Fix for Bug #320, Users tagging does not work if @ is in the
+ middle of already typed text
+
+
- Refactored and ported to GWT 2.5.1
+ First Release
diff --git a/pom.xml b/pom.xml
index 14129e3..8173af9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
org.gcube.portlets.widgets
pickitem-widget
- 1.0.0-SNAPSHOT
+ 1.1.0-SNAPSHOT
jar
gCube Pick Item Widget
@@ -24,9 +24,8 @@
- 2.5.1
+ 2.7.0
distro
-
1.7
1.7
${project.build.directory}/${project.build.finalName}
@@ -50,7 +49,7 @@
com.google.gwt
gwt-user
-
+ ${gwtVersion}
provided
diff --git a/src/main/java/org/gcube/portlets/widgets/pickitem/client/PickItem.java b/src/main/java/org/gcube/portlets/widgets/pickitem/client/PickItem.java
index 4032f20..ed648ec 100644
--- a/src/main/java/org/gcube/portlets/widgets/pickitem/client/PickItem.java
+++ b/src/main/java/org/gcube/portlets/widgets/pickitem/client/PickItem.java
@@ -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());
}
});
diff --git a/src/main/java/org/gcube/portlets/widgets/pickitem/client/dialog/PickItemsDialog.java b/src/main/java/org/gcube/portlets/widgets/pickitem/client/dialog/PickItemsDialog.java
index 864a08d..f49ce2a 100644
--- a/src/main/java/org/gcube/portlets/widgets/pickitem/client/dialog/PickItemsDialog.java
+++ b/src/main/java/org/gcube/portlets/widgets/pickitem/client/dialog/PickItemsDialog.java
@@ -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 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
}
diff --git a/src/main/java/org/gcube/portlets/widgets/pickitem/client/events/PickedItemEvent.java b/src/main/java/org/gcube/portlets/widgets/pickitem/client/events/PickedItemEvent.java
index babd879..cba5fed 100644
--- a/src/main/java/org/gcube/portlets/widgets/pickitem/client/events/PickedItemEvent.java
+++ b/src/main/java/org/gcube/portlets/widgets/pickitem/client/events/PickedItemEvent.java
@@ -10,11 +10,16 @@ public class PickedItemEvent extends GwtEvent {
public static Type TYPE = new Type();
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 {
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;
}
}