/* @VaadinApache2LicenseForJavaFiles@ */ package com.vaadin.terminal.gwt.client.ui.panel; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.SimplePanel; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.Focusable; import com.vaadin.terminal.gwt.client.ui.Icon; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate; public class VPanel extends SimplePanel implements ShortcutActionHandlerOwner, Focusable { public static final String CLASSNAME = "v-panel"; ApplicationConnection client; String id; final Element captionNode = DOM.createDiv(); private final Element captionText = DOM.createSpan(); private Icon icon; final Element bottomDecoration = DOM.createDiv(); final Element contentNode = DOM.createDiv(); private Element errorIndicatorElement; ShortcutActionHandler shortcutHandler; int scrollTop; int scrollLeft; private TouchScrollDelegate touchScrollDelegate; public VPanel() { super(); DivElement captionWrap = Document.get().createDivElement(); captionWrap.appendChild(captionNode); captionNode.appendChild(captionText); captionWrap.setClassName(CLASSNAME + "-captionwrap"); captionNode.setClassName(CLASSNAME + "-caption"); contentNode.setClassName(CLASSNAME + "-content"); bottomDecoration.setClassName(CLASSNAME + "-deco"); getElement().appendChild(captionWrap); /* * Make contentNode focusable only by using the setFocus() method. This * behaviour can be changed by invoking setTabIndex() in the serverside * implementation */ contentNode.setTabIndex(-1); getElement().appendChild(contentNode); getElement().appendChild(bottomDecoration); setStyleName(CLASSNAME); DOM.sinkEvents(getElement(), Event.ONKEYDOWN); DOM.sinkEvents(contentNode, Event.ONSCROLL | Event.TOUCHEVENTS); addHandler(new TouchStartHandler() { public void onTouchStart(TouchStartEvent event) { getTouchScrollDelegate().onTouchStart(event); } }, TouchStartEvent.getType()); } /** * Sets the keyboard focus on the Panel * * @param focus * Should the panel have focus or not. */ public void setFocus(boolean focus) { if (focus) { getContainerElement().focus(); } else { getContainerElement().blur(); } } /* * (non-Javadoc) * * @see com.vaadin.terminal.gwt.client.Focusable#focus() */ public void focus() { setFocus(true); } @Override protected Element getContainerElement() { return contentNode; } void setCaption(String text) { DOM.setInnerHTML(captionText, text); } void setErrorIndicatorVisible(boolean showError) { if (showError) { if (errorIndicatorElement == null) { errorIndicatorElement = DOM.createSpan(); DOM.setElementProperty(errorIndicatorElement, "className", "v-errorindicator"); DOM.sinkEvents(errorIndicatorElement, Event.MOUSEEVENTS); sinkEvents(Event.MOUSEEVENTS); } DOM.insertBefore(captionNode, errorIndicatorElement, captionText); } else if (errorIndicatorElement != null) { DOM.removeChild(captionNode, errorIndicatorElement); errorIndicatorElement = null; } } void setIconUri(String iconUri, ApplicationConnection client) { if (iconUri == null) { if (icon != null) { DOM.removeChild(captionNode, icon.getElement()); icon = null; } } else { if (icon == null) { icon = new Icon(client); DOM.insertChild(captionNode, icon.getElement(), 0); } icon.setUri(iconUri); } } @Override public void onBrowserEvent(Event event) { super.onBrowserEvent(event); final Element target = DOM.eventGetTarget(event); final int type = DOM.eventGetType(event); if (type == Event.ONKEYDOWN && shortcutHandler != null) { shortcutHandler.handleKeyboardEvent(event); return; } if (type == Event.ONSCROLL) { int newscrollTop = DOM.getElementPropertyInt(contentNode, "scrollTop"); int newscrollLeft = DOM.getElementPropertyInt(contentNode, "scrollLeft"); if (client != null && (newscrollLeft != scrollLeft || newscrollTop != scrollTop)) { scrollLeft = newscrollLeft; scrollTop = newscrollTop; client.updateVariable(id, "scrollTop", scrollTop, false); client.updateVariable(id, "scrollLeft", scrollLeft, false); } } else if (captionNode.isOrHasChild(target)) { if (client != null) { client.handleTooltipEvent(event, this); } } } protected TouchScrollDelegate getTouchScrollDelegate() { if (touchScrollDelegate == null) { touchScrollDelegate = new TouchScrollDelegate(contentNode); } return touchScrollDelegate; } public ShortcutActionHandler getShortcutActionHandler() { return shortcutHandler; } }