org.kaaproject.avro.ui.gwt.client.widget.ActionsButton.java Source code

Java tutorial

Introduction

Here is the source code for org.kaaproject.avro.ui.gwt.client.widget.ActionsButton.java

Source

/*
 * Copyright 2014-2015 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.avro.ui.gwt.client.widget;

import org.kaaproject.avro.ui.gwt.client.util.Utils;

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.event.shared.HandlerRegistration;
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.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ToggleButton;

public class ActionsButton extends ToggleButton {

    private static Template template;
    private PopupPanel actionsPopup;

    private MenuBar menu = new MenuBar(true);

    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);

    }

    @UiConstructor
    public ActionsButton(ImageResource imageResource, String text) {
        super();
        if (template == null) {
            template = GWT.create(Template.class);
        }
        getElement().getStyle().setPaddingRight(20, Unit.PX);
        int index = 0;
        if (imageResource != null) {
            getElement().getStyle().setPaddingLeft(20, Unit.PX);
            SafeUri uri = imageResource.getSafeUri();
            int width = imageResource.getWidth();
            int height = imageResource.getHeight();
            int paddingLeft = width;
            String background = "url(\"" + uri.asString() + "\") no-repeat scroll right center";
            Element imageSpan = DOM.createElement("span");
            imageSpan.setInnerText(" ");
            imageSpan.getStyle().setProperty("background", background);
            imageSpan.getStyle().setWidth(width, Unit.PX);
            imageSpan.getStyle().setHeight(height, Unit.PX);
            imageSpan.getStyle().setPaddingLeft(paddingLeft, Unit.PX);
            imageSpan.getStyle().setMarginRight(10, Unit.PX);
            DOM.insertChild(getElement(), imageSpan, index++);
        }

        Element caretSpan = DOM.createElement("span");
        caretSpan.setClassName(Utils.avroUiStyle.buttonCaret());
        DOM.insertChild(getElement(), caretSpan, index);
        Element textElement = DOM.createElement("span");
        textElement.setInnerText(text);
        DOM.insertChild(caretSpan, textElement, 0);

        actionsPopup = new PopupPanel(true, false);
        actionsPopup.addStyleName(Utils.avroUiStyle.actionPopup());
        actionsPopup.setWidget(menu);
        actionsPopup.addCloseHandler(new CloseHandler<PopupPanel>() {
            @Override
            public void onClose(CloseEvent<PopupPanel> event) {
                ActionsButton.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 = ActionsButton.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 HandlerRegistration addMenuItem(String text, final ActionMenuItemListener listener) {
        return addMenuItem(null, text, listener);
    }

    public HandlerRegistration 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);
        }
        final MenuItem item = new MenuItem(html, new Command() {

            @Override
            public void execute() {
                if (actionsPopup != null && actionsPopup.isVisible())
                    actionsPopup.hide();
                listener.onMenuItemSelected();
            }

        });

        menu.addItem(item);
        HandlerRegistration registration = new HandlerRegistration() {

            @Override
            public void removeHandler() {
                menu.removeItem(item);

            }
        };
        return registration;
    }

    public void clearItems() {
        menu.clearItems();
    }

    public static interface ActionMenuItemListener {
        void onMenuItemSelected();
    }
}