com.data2semantics.yasgui.client.tab.optionbar.LinkCreator.java Source code

Java tutorial

Introduction

Here is the source code for com.data2semantics.yasgui.client.tab.optionbar.LinkCreator.java

Source

package com.data2semantics.yasgui.client.tab.optionbar;

/*
 * #%L
 * YASGUI
 * %%
 * Copyright (C) 2013 Laurens Rietveld
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import java.util.Iterator;
import java.util.TreeMap;

import com.smartgwt.client.types.Positioning;
import com.smartgwt.client.widgets.AnimationCallback;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
import com.data2semantics.yasgui.client.View;
import com.data2semantics.yasgui.client.helpers.Helper;
import com.data2semantics.yasgui.client.helpers.JsMethods;
import com.data2semantics.yasgui.client.helpers.TooltipProperties;
import com.data2semantics.yasgui.client.settings.Imgs;
import com.data2semantics.yasgui.client.settings.TooltipText;
import com.data2semantics.yasgui.client.settings.ZIndexes;
import com.data2semantics.yasgui.shared.SettingKeys;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class LinkCreator extends ImgButton {
    private static final int TOOLTIP_VERSION_LINK = 2;
    private View view;
    private Window window;
    private static int WINDOW_WIDTH = 220;
    private static int WINDOW_HEIGHT = 85;
    private static int ICON_WIDTH = 25;
    private static int ICON_HEIGHT = 25;
    private static int ANIMATE_SPEED = 100;
    private static int OFFSET_TOP = 105;
    public static int OFFSET_RIGHT = 20;
    private TextItem urlTextBox;
    private Canvas urlTextBoxAnim;
    private Button shortenUrlButton;

    public LinkCreator(View view) {
        this.view = view;
        setSrc(Imgs.get(Imgs.LINK));
        setWidth(ICON_WIDTH);
        setHeight(ICON_HEIGHT);
        setPosition(Positioning.ABSOLUTE);
        setTop(OFFSET_TOP);
        changeHorizontalOffset();
        setZIndex(ZIndexes.TAB_CONTROLS);
        setShowDown(false);
        setShowRollOver(false);

        addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                window = new Window();
                window.setZIndex(ZIndexes.MODAL_WINDOWS);
                window.setTitle("Get link");
                window.setIsModal(true);
                window.setDismissOnOutsideClick(true);
                window.setShowHeader(false);
                int left = (getAbsoluteLeft() + ICON_WIDTH) - WINDOW_WIDTH;
                int top = getAbsoluteTop() + ICON_HEIGHT;
                window.setRect(left, top, WINDOW_WIDTH, WINDOW_HEIGHT);

                window.setShowMinimizeButton(false);
                window.addItem(getWindowContent());
                window.draw();
            }
        });

    }

    private VLayout getWindowContent() {
        VLayout layout = new VLayout();
        layout.addMember(Helper.getVSpacer());

        layout.addMember(getLinkText());

        HLayout belowLink = new HLayout();
        belowLink.setMargin(4);
        //      belowLink.addMember(getLinkOptions());

        if (view.getSettings().useBitly()) {
            belowLink.addMember(getShortenUrlButton());
        }

        layout.addMember(belowLink);

        layout.addMember(Helper.getVSpacer());

        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
            @Override
            public void execute() {
                updateLinkWithQueryArgs();

            }
        });

        return layout;
    }

    private Button getShortenUrlButton() {
        shortenUrlButton = new Button("Shorten url");
        shortenUrlButton.setWidth(75);
        shortenUrlButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                view.getElements().onLoadingStart("Fetching short url");
                view.getRemoteService().getShortUrl(urlTextBox.getValueAsString(), new AsyncCallback<String>() {
                    public void onFailure(Throwable caught) {
                        view.getElements().onError(caught);
                    }

                    public void onSuccess(String shortUrl) {
                        updateLink(shortUrl);
                        shortenUrlButton.setDisabled(true);
                        view.getElements().onLoadingFinish();
                    }
                });
            }
        });
        return shortenUrlButton;
    }

    private Canvas getLinkText() {
        urlTextBoxAnim = new Canvas();
        urlTextBoxAnim.setWidth100();
        DynamicForm form = new DynamicForm();
        form.setWidth100();

        urlTextBox = new TextItem();
        urlTextBox.setCanEdit(false);
        urlTextBox.setHeight(27);
        urlTextBox.setShowTitle(false);
        urlTextBox.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {
            @Override
            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                urlTextBox.selectValue();
            }
        });
        urlTextBox.setWidth(WINDOW_WIDTH - 15);
        form.setItems(urlTextBox);
        urlTextBoxAnim.addChild(form);
        return urlTextBoxAnim;
    }

    private void updateLinkWithQueryArgs() {
        TreeMap<String, String> args = getQueryArgs();
        updateLink(getLink(args));
    }

    private void updateLink(final String newUrl) {
        if (view.getSettings().useBitly()) {
            shortenUrlButton.setDisabled(false);
        }
        urlTextBoxAnim.animateFade(20, new AnimationCallback() {
            @Override
            public void execute(boolean earlyFinish) {
                urlTextBox.setValue(newUrl);
                urlTextBoxAnim.animateFade(100, new AnimationCallback() {
                    @Override
                    public void execute(boolean earlyFinish) {
                        //nothing
                    }
                }, ANIMATE_SPEED);
            }
        }, ANIMATE_SPEED);
    }

    private TreeMap<String, String> getQueryArgs() {
        TreeMap<String, String> args = new TreeMap<String, String>();
        args.put(SettingKeys.QUERY_STRING, view.getSelectedTabSettings().getQueryString());
        args.put(SettingKeys.ENDPOINT, view.getSelectedTabSettings().getEndpoint());
        args.put(SettingKeys.OUTPUT_FORMAT, view.getSelectedTabSettings().getOutputFormat());
        args.put(SettingKeys.TAB_TITLE, view.getSelectedTabSettings().getTabTitle());
        args.put(SettingKeys.CONTENT_TYPE_SELECT, view.getSelectedTabSettings().getSelectContentType());
        args.put(SettingKeys.CONTENT_TYPE_CONSTRUCT, view.getSelectedTabSettings().getConstructContentType());
        args.put(SettingKeys.REQUEST_METHOD, view.getSelectedTabSettings().getRequestMethod());
        args.putAll(view.getSelectedTabSettings().getQueryArgs());
        return args;
    }

    private String getLink(TreeMap<String, String> args) {
        String url = JsMethods.getLocation();

        //remove these, as we will be adding these again
        url = Helper.removeArgumentsFromUrl(url, args.keySet());
        boolean firstItem = true;
        if (url.contains("?")) {
            firstItem = false;
        }
        Iterator<String> iterator = args.keySet().iterator();
        while (iterator.hasNext()) {
            if (firstItem) {
                url += "?";
                firstItem = false;
            } else {
                url += "&";
            }
            String key = iterator.next();
            String value = URL.encodeQueryString(args.get(key));
            url += key + "=" + value;
        }
        return url;

    }

    public void showToolTips(int fromVersionId) {
        if (fromVersionId <= TOOLTIP_VERSION_LINK) {
            TooltipProperties tProp = new TooltipProperties();
            tProp.setId(getDOM().getId());
            tProp.setContent(TooltipText.LINK_GENERATOR);
            tProp.setMy(TooltipProperties.POS_RIGHT_CENTER);
            tProp.setAt(TooltipProperties.POS_LEFT_CENTER);
            Helper.drawTooltip(tProp);
        }
    }

    /**
     * called on initiation, as well as window resize
     * @param offset
     */
    public void changeHorizontalOffset() {
        int windowWidth = com.google.gwt.user.client.Window.getClientWidth();
        setLeft(windowWidth - ICON_WIDTH - OFFSET_RIGHT);//compensate for smargwt scrollbar, so subtract some more
    }
}