/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.kaa.server.admin.client.mvp.view.widget;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safecss.shared.SafeStyles;
import com.google.gwt.safecss.shared.SafeStylesBuilder;
import com.google.gwt.safecss.shared.SafeStylesUtils;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.PopupPanel;
import org.kaaproject.kaa.server.admin.client.util.Utils;
public class ActionsLabel extends Label {
private static Template template;
private PopupPanel actionsPopup;
private MenuBar menu = new MenuBar(true);
/**
* UI constructor.
*/
@UiConstructor
public ActionsLabel(String text) {
super();
if (template == null) {
template = GWT.create(Template.class);
}
String definedStyles = getElement().getAttribute("style");
getElement().setAttribute("style",
definedStyles + "; vertical-align:middle;");
Element textElement = DOM.createElement("span");
textElement.setInnerText(text + " ");
DOM.insertChild(getElement(), textElement, 0);
Element caretSpan = DOM.createElement("span");
caretSpan.setClassName(Utils.kaaAdminStyle.caret());
DOM.appendChild(getElement(), caretSpan);
actionsPopup = new PopupPanel(true, false);
actionsPopup.addStyleName(Utils.kaaAdminStyle.actionPopup());
actionsPopup.setWidget(menu);
actionsPopup.addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
// ActionsLabel.this.setDown(false);
}
});
actionsPopup.addAutoHidePartner(getElement());
addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (!actionsPopup.isShowing()) {
// Instantiate the popup and show it.
final Element parent = ActionsLabel.this.getElement();
actionsPopup
.setPopupPositionAndShow(new PopupPanel.PositionCallback() {
public void setPosition(int offsetWidth,
int offsetHeight) {
int left = parent.getAbsoluteLeft();
int top = parent.getAbsoluteTop()
+ parent.getOffsetHeight() + 2;
if (left + actionsPopup.getOffsetWidth() > Window
.getClientWidth()) {
left = parent.getAbsoluteRight()
- actionsPopup.getOffsetWidth();
}
actionsPopup.setPopupPosition(left, top);
}
});
} else {
actionsPopup.hide();
}
}
});
}
public void addMenuItem(String text,
final ActionMenuItemListener listener) {
addMenuItem(null, text, listener);
}
/**
* Add menu item.
*
* @param image the image
* @param text the text
* @param listener the listener
*/
public void addMenuItem(ImageResource image, String text,
final ActionMenuItemListener listener) {
SafeHtml html = null;
if (image != null) {
SafeUri uri = image.getSafeUri();
int left = image.getLeft();
int top = image.getTop();
int width = image.getWidth();
int height = image.getHeight();
int paddingRight = width + 8;
String background = "url(\"" + uri.asString() + "\") no-repeat "
+ (-left + "px ") + (-top + "px");
SafeStylesBuilder builder = new SafeStylesBuilder();
builder.trustedNameAndValue("background", background)
.width(width, Unit.PX).height(height, Unit.PX)
.paddingRight(paddingRight, Unit.PX);
SafeStyles style = SafeStylesUtils.fromTrustedString(builder
.toSafeStyles().asString());
html = template.menuImageItemContent(style, text);
} else {
html = template.menuItemContent(text);
}
MenuItem item = new MenuItem(html, new Command() {
@Override
public void execute() {
if (actionsPopup != null && actionsPopup.isVisible()) {
actionsPopup.hide();
}
listener.onMenuItemSelected();
}
});
menu.addItem(item);
}
public void clearItems() {
menu.clearItems();
}
interface Template extends SafeHtmlTemplates {
@Template("<div tabindex=\"0\" style=\"vertical-align:middle;\">"
+ "<span style='{0}'></span>" + "<span>{1}</span>" + "</div>")
SafeHtml menuImageItemContent(SafeStyles style, String text);
@Template("<div tabindex=\"0\" style=\"vertical-align:middle;\">"
+ "<span>{0}</span>" + "</div>")
SafeHtml menuItemContent(String text);
}
public static interface ActionMenuItemListener {
void onMenuItemSelected();
}
}