/** * */ package org.gcube.portlets.user.shareupdates.client.form; import org.gcube.portlets.user.shareupdates.client.dialog.PickUsersDialog; import org.gcube.portlets.user.shareupdates.client.elements.ContentEditDiv; import org.gcube.portlets.user.shareupdates.client.elements.Span; import org.gcube.portlets.user.shareupdates.client.elements.TagBox; import org.gcube.portlets.user.shareupdates.client.events.PickedUserEvent; import org.gcube.portlets.user.shareupdates.client.events.PickedUserEventHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; /** * @author massi * */ public class SmartTextArea extends ContentEditDiv { private final HandlerManager eventBus = new HandlerManager(null); public final static int ARROW_UP = 38; public final static int ARROW_DOWN = 40; PickUsersDialog pickUserDlg = new PickUsersDialog(eventBus); /** * */ public SmartTextArea() { bind(); sinkEvents(Event.ONPASTE); sinkEvents(Event.ONCONTEXTMENU); sinkEvents(Event.ONKEYUP); sinkEvents(Event.ONKEYDOWN); } /** * events binder */ private void bind() { eventBus.addHandler(PickedUserEvent.TYPE, new PickedUserEventHandler() { @Override public void onSelectedUser(PickedUserEvent event) { String[] toSplit = getHTML().split("@"); //get the interesting part TagBox span = new TagBox(event.getSelectedUser().getFullName()); setHTML(toSplit[0]); getElement().appendChild(span.getElement()); getElement().appendChild(new Span(" ").getElement()); setEndOfContenteditable(); } }); } /** * paste and other events 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; } case Event.ONKEYUP: { pickUserDlg.onKeyUp(event, this.getAbsoluteLeft(), this.getAbsoluteTop()+65, getText()); break; } case Event.ONKEYDOWN: { //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); return; } break; } } DomEvent.fireNativeEvent(event, this, this.getElement()); } protected void removeSampleText() { if (getText().equals(ShareUpdateForm.SHARE_UPDATE_TEXT) || getText().equals(ShareUpdateForm.ERROR_UPDATE_TEXT) ) { setText(""); addStyleName("dark-color"); removeStyleName("error"); } } }