From 3e72d59d1c03da9a88e2ad981e668e4ba5a605bb Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Wed, 15 Jul 2015 16:37:33 +0000 Subject: [PATCH] Fixes for Bug #320, Users tagging does not work if @ is in the middle of already typed text git-svn-id: https://svn.research-infrastructures.eu/d4science/gcube/trunk/portlets/user/share-updates@117260 82a268e6-3cf1-43bd-a215-b396298e98cf --- .settings/org.eclipse.wst.common.component | 3 + .../client/view/SuperPosedTextArea.java | 70 +++++++++++-------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 092711b..cfc5846 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -7,6 +7,9 @@ uses + + uses + diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SuperPosedTextArea.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SuperPosedTextArea.java index b158682..392aade 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SuperPosedTextArea.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/view/SuperPosedTextArea.java @@ -4,6 +4,7 @@ package org.gcube.portlets.user.shareupdates.client.view; import java.util.ArrayList; +import java.util.HashSet; import org.gcube.portlets.user.shareupdates.client.ShareUpdateService; import org.gcube.portlets.user.shareupdates.client.ShareUpdateServiceAsync; @@ -36,7 +37,7 @@ public class SuperPosedTextArea extends TextArea { public final static int ARROW_UP = 38; public final static int ARROW_DOWN = 40; - private ArrayList mentionedUsers = new ArrayList(); + private HashSet mentionedUsers = new HashSet(); private ArrayList hashtags = new ArrayList(); /** @@ -44,9 +45,10 @@ public class SuperPosedTextArea extends TextArea { */ public SuperPosedTextArea() { sinkEvents(Event.ONPASTE); - sinkEvents(Event.ONKEYUP); + sinkEvents(Event.ONKEYPRESS); sinkEvents(Event.ONCONTEXTMENU); sinkEvents(Event.ONKEYDOWN); + sinkEvents(Event.ONKEYUP); //get the users shareupdateService.getPortalUsers(new AsyncCallback>() { @Override @@ -69,8 +71,8 @@ public class SuperPosedTextArea extends TextArea { public void onFailure(Throwable caught) { } }); - - DOM.setElementAttribute(getElement(), "id", "postTextArea"); + + getElement().setAttribute("id", "postTextArea"); bind(); } @@ -100,10 +102,15 @@ public class SuperPosedTextArea extends TextArea { t.schedule(100); break; } + case Event.ONKEYPRESS: { + pickUserDlg.onKeyPress(this.getCursorPos(), event.getKeyCode(), this.getAbsoluteLeft(), this.getAbsoluteTop()+this.getOffsetHeight(), getText()); + pickHashtagDlg.onKeyPress(this.getCursorPos(), event.getKeyCode(), this.getAbsoluteLeft(), this.getAbsoluteTop()+this.getOffsetHeight(), getText()); + break; + } case Event.ONKEYUP: { injectInDiv(getText()); - pickUserDlg.onKeyUp(event.getKeyCode(), this.getAbsoluteLeft(), this.getAbsoluteTop()+this.getOffsetHeight(), getText()); - pickHashtagDlg.onKeyUp(event.getKeyCode(), this.getAbsoluteLeft(), this.getAbsoluteTop()+this.getOffsetHeight(), getText()); + pickUserDlg.onKeyUp(event.getKeyCode()); + pickHashtagDlg.onKeyUp(event.getKeyCode()); break; } case Event.ONCONTEXTMENU: { @@ -115,7 +122,7 @@ public class SuperPosedTextArea extends TextArea { //avoid the arrow up to move the cursor at the beginning of the textbox and the TAB to move around inputs and enter to go newline if (event.getKeyCode() == ARROW_UP || event.getKeyCode() == KeyCodes.KEY_TAB || event.getKeyCode() == KeyCodes.KEY_ENTER) { DOM.eventCancelBubble(event, true); - DOM.eventPreventDefault(event); + event.preventDefault(); return; } } @@ -123,7 +130,7 @@ public class SuperPosedTextArea extends TextArea { //avoid the arrow up to move the cursor at the beginning of the textbox and the TAB to move around inputs and enter to go newline if (event.getKeyCode() == ARROW_UP || event.getKeyCode() == KeyCodes.KEY_TAB || event.getKeyCode() == KeyCodes.KEY_ENTER) { DOM.eventCancelBubble(event, true); - DOM.eventPreventDefault(event); + event.preventDefault(); return; } } @@ -142,20 +149,21 @@ public class SuperPosedTextArea extends TextArea { DOM.getElementById("highlighter").setInnerHTML(""); } private void injectInDiv(String textAreaText) { + GWT.log("# injectInDiv: "+textAreaText); String text; // parse the text: - // replace all the line braks by
, and all the double spaces by the html version   + // replace all the line breaks by
, and all the double spaces by the html version   text = textAreaText.replaceAll("(\r\n|\n)","
"); text = text.replaceAll("\\s\\s","  "); - + for (String mentionedUser : mentionedUsers) { text = text.replaceAll(mentionedUser,""+mentionedUser+""); } - -// for (String hashtag : hashtags) { -// text = text.replaceAll(hashtag,""+hashtag+""); -// } - + + for (String hashtag : hashtags) { + text = text.replaceAll(hashtag,""+hashtag+""); + } + // re-inject the processed text into the div DOM.getElementById("highlighter").setInnerHTML(text); } @@ -167,28 +175,28 @@ public class SuperPosedTextArea extends TextArea { eventBus.addHandler(PickedItemEvent.TYPE, new PickedItemEventHandler() { @Override public void onSelectedItem(PickedItemEvent event) { - String triggerChar = event.getTriggerChar(); + + char triggerChar = event.getTriggerChar(); String toAdd = event.getSelectedItem().getAlternativeName(); - if (triggerChar.compareTo("#") == 0) { //has to be treated differently becase the # char remain present in the text unlike the @ + if (triggerChar == '#') { //has to be treated differently becase the # char remain present in the text unlike the @ hashtags.add(toAdd); - - int tPos = getText().lastIndexOf(triggerChar); - setText(getText().substring(0, tPos) + toAdd); - Element highDiv = DOM.getElementById("highlighter"); - tPos = highDiv.getInnerHTML().lastIndexOf(triggerChar); - highDiv.setInnerHTML(highDiv.getInnerHTML().substring(0, tPos) + toAdd); + String preceedingPart = getText().substring(0, event.getItemCursorIndexStart()); + String afterPart = getText().substring(event.getItemCursorIndexEnd()+1); + //GWT.log("# BEFORE: "+preceedingPart); + setText(preceedingPart + toAdd + " " + afterPart); + injectInDiv(getText()); } - if (event.getTriggerChar().compareTo("@") == 0) { + if (triggerChar == '@') { + GWT.log("GOT @ EVENT! "+ event.getSelectedItem().getAlternativeName()); mentionedUsers.add(toAdd); - String[] toSplit = getText().split(triggerChar); //get the preceeding part - setText(toSplit[0]+toAdd); - Element highDiv = DOM.getElementById("highlighter"); + String preceedingPart = getText().substring(0, event.getItemCursorIndexStart()); + String afterPart = getText().substring(event.getItemCursorIndexEnd()+1); + + setText(preceedingPart + toAdd + " " + afterPart); + injectInDiv(getText()); - String[] htmlToSplit = highDiv.getInnerHTML().split(triggerChar); //get the preceeding part - String highLightedUser = ""+toAdd+""; - highDiv.setInnerHTML(htmlToSplit[0]+highLightedUser); } } }); @@ -203,7 +211,7 @@ public class SuperPosedTextArea extends TextArea { GWT.log(toReturn.toString()); return toReturn; } - + public ArrayList getHashtags() { ArrayList toReturn = new ArrayList(); for (String hashtag : hashtags) {