From 907f72de8193a273119c15cfe10907767459dfb9 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Tue, 14 Jul 2015 17:21:21 +0000 Subject: [PATCH] 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 --- distro/changelog.xml | 11 +++- pom.xml | 7 +-- .../widgets/pickitem/client/PickItem.java | 2 +- .../client/dialog/PickItemsDialog.java | 63 ++++++++++++------- .../client/events/PickedItemEvent.java | 23 +++++-- 5 files changed, 72 insertions(+), 34 deletions(-) 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; } }