diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java new file mode 100644 index 0000000..98a1bc0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/dialog/PickUsersDialog.java @@ -0,0 +1,29 @@ +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.form.SingleUserTemplate; + +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + +public class PickUsersDialog extends PopupPanel { + + private VerticalPanel mainPanel = new VerticalPanel(); + + public PickUsersDialog() { + super(true, false); + setWidth("515px"); + setWidget(mainPanel); + setStyleName("pickDialog"); + } + + public void fill(ArrayList users) { + for (String user : users) { + mainPanel.add(new SingleUserTemplate(new Like("", "", new Date(), "", user, ""))); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Div.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Div.java new file mode 100644 index 0000000..cdf15cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Div.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.shareupdates.client.elements; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasText; + +/** + * + * @author Massimiliano Assante, ISTI-CNR + * + */ +public class Div extends HTML implements HasText { + + public Div() { + super(DOM.createElement("div")); + //important to make it act like a textarea + DOM.setElementAttribute(getElement(), "contentEditable", "true"); + } + + public Div(String text) { + this(); + setText(text); + } + + public void setEnabled(boolean enabled) { + DOM.setElementPropertyBoolean(getElement(), "disabled", !enabled); + } +} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Span.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Span.java new file mode 100644 index 0000000..58db362 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/elements/Span.java @@ -0,0 +1,23 @@ +package org.gcube.portlets.user.shareupdates.client.elements; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasText; + +/** + * + * @author Massimiliano Assante, ISTI-CNR + * @version 0.1 Sep 2012 + * + */ +public class Span extends HTML implements HasText { + + public Span() { + super(DOM.createElement("span")); + } + + public Span(String text) { + this(); + setText(text); + } +} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/MyTextArea.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/MyTextArea.java index b97041c..6270e44 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/MyTextArea.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/MyTextArea.java @@ -3,59 +3,103 @@ */ package org.gcube.portlets.user.shareupdates.client.form; +import java.util.ArrayList; + +import org.gcube.portlets.user.shareupdates.client.dialog.PickUsersDialog; +import org.gcube.portlets.user.shareupdates.client.elements.Div; + import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.MultiWordSuggestOracle; +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; /** * @author massi * */ -public class MyTextArea extends TextArea { +public class MyTextArea extends Div { + final MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); + int limit = 10; + void showSuggestions(String query) { + if (query.length() > 0) { + oracle.requestSuggestions(new Request(query, limit), new Callback() { + public void onSuggestionsReady(Request request, Response response) { + for (Suggestion s : response.getSuggestions()) { + GWT.log("s:"+s.getReplacementString()); + } + } + }); + } + } + + PickUsersDialog pickUserDlg = new PickUsersDialog(); /** * */ public MyTextArea() { sinkEvents(Event.ONPASTE); sinkEvents(Event.ONCONTEXTMENU); - } + sinkEvents(Event.ONKEYUP); - /** - * @param element - */ - public MyTextArea(Element element) { - super(element); + ArrayList users = new ArrayList(); + users.add("Massi"); + users.add("Gino"); + users.add("Marco"); + users.add("Franco"); + users.add("Anna"); + users.add("Antonio"); + pickUserDlg.fill(users); + + oracle.add("Massi"); + oracle.add("Gino"); + oracle.add("Marco"); + oracle.add("Franco"); + oracle.add("Anna"); + oracle.add("Antonio"); } /** * paste event overridden */ public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - switch (event.getTypeInt()) { - case Event.ONPASTE: { - final String before = getText(); - GWT.log("BEFORE:" + before); - Timer t = new Timer() { - @Override - public void run() { - String toCheck = getText().replaceAll(before, ""); - ShareUpdateForm.get().checkLink(toCheck); - } - }; - t.schedule(100); - break; - } - case Event.ONCONTEXTMENU: { - removeSampleText(); - break; - } - } + super.onBrowserEvent(event); + switch (event.getTypeInt()) { + case Event.ONPASTE: { + final String before = getText(); + GWT.log("BEFORE:" + before); + Timer t = new Timer() { + @Override + public void run() { + String toCheck = getText().replaceAll(before, ""); + ShareUpdateForm.get().checkLink(toCheck); + } + }; + t.schedule(100); + break; + } + case Event.ONCONTEXTMENU: { + removeSampleText(); + break; + } + case Event.ONKEYUP: { + final String before = getText(); + //showSuggestions(before); + if (before.endsWith("@")) { //the only way i found to intercept @ + pickUserDlg.setPopupPosition(this.getAbsoluteLeft(), this.getAbsoluteTop()+65); + pickUserDlg.show(); + } + break; + } + } } + + + protected void removeSampleText() { if (getText().equals(ShareUpdateForm.SHARE_UPDATE_TEXT) || getText().equals(ShareUpdateForm.ERROR_UPDATE_TEXT) ) { setText(""); diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java new file mode 100644 index 0000000..6ce0d9a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.java @@ -0,0 +1,34 @@ +package org.gcube.portlets.user.shareupdates.client.form; + +import org.gcube.portal.databook.client.GCubeSocialNetworking; +import org.gcube.portal.databook.shared.Like; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Widget; + +public class SingleUserTemplate extends Composite { + + private static LikedTemplateUiBinder uiBinder = GWT + .create(LikedTemplateUiBinder.class); + + interface LikedTemplateUiBinder extends UiBinder { + } + + public SingleUserTemplate(Like like) { + initWidget(uiBinder.createAndBindUi(this)); + if (like.getThumbnailURL() != null) + avatarImage.setUrl(like.getThumbnailURL()); + + avatarImage.setPixelSize(30, 30); + contentArea.setHTML(""+like.getFullName()+" "); + } + @UiField + Image avatarImage; + @UiField + HTML contentArea; +} diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml new file mode 100644 index 0000000..150b506 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/shareupdates/client/form/SingleUserTemplate.ui.xml @@ -0,0 +1,25 @@ + + + +
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java index 01f9a5c..74ef431 100644 --- a/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/shareupdates/server/ShareUpdateServiceImpl.java @@ -98,9 +98,9 @@ public class ShareUpdateServiceImpl extends RemoteServiceServlet implements Shar String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); if (user == null) { _log.warn("USER IS NULL setting test.user and Running OUTSIDE PORTAL"); - user = "test.user"; -// user = "massimiliano.assante"; -// SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec/devVRE"); +// user = "test.user"; + user = "massimiliano.assante"; + SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec/devVRE"); withinPortal = false; } else { diff --git a/src/main/webapp/ShareUpdates.css b/src/main/webapp/ShareUpdates.css index 271d0e0..1ed4f0d 100644 --- a/src/main/webapp/ShareUpdates.css +++ b/src/main/webapp/ShareUpdates.css @@ -137,8 +137,7 @@ a.link:hover { font-size: 13px; padding: 4px 2px; width: 99%; - border-color: #999; - border-width: 1px; + border: 1px solid #999; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; @@ -185,4 +184,68 @@ a.link:hover { transition: background .45s ease-in-out; -moz-transition: background .45s ease-in-out; -webkit-transition: background .45s ease-in-out; +} + + +/* Pick User Dialog part */ + +.pickDialog { + border: 1px solid #333; + background-color: #FFF; + padding: 5px; +} + +.liked-person { + padding-top: 10px; +} + +a.person-link { + font-family: 'Helvetica Neue', Arial, sans-serif; + font-size: 16x; + line-height: 18px; + color: #3B5998; +} + +a.person-link,a.person-link:visited { + cursor: pointer; + cursor: hand; + font-size: 16x; + text-decoration: none; + color: #3B5998; +} + +a.person-link:hover { + opacity: 0.8; + font-size: 16x; + text-decoration: underline; +} + + +.user-table-500 { + margin-top: 3px; + display: table; + width: 500px; + background-clip: border-box; + background-image: none; + background-origin: padding-box; + padding: 12px 7px 3px 7px; +} + +.user-table-row { + display: table-row; + text-align: left; +} + +.user-table-col { + display: table-cell; + text-align: left; +} + +.user-table-col.content { + padding-left: 10px; + vertical-align: top; +} + +.user-table-col.smallphoto { + width: 40px; } \ No newline at end of file