org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel.java

Source

/*
 * Copyright (c) 2010 Lockheed Martin Corporation
 *
 * 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.eurekastreams.web.client.ui.pages.profile.settings.stream;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.eurekastreams.server.domain.GeneralGadgetDefinition;
import org.eurekastreams.server.domain.gadgetspec.GadgetMetaDataDTO;
import org.eurekastreams.server.domain.stream.plugins.FeedSubscriber;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.StreamPluginsUpdateCanceledEvent;
import org.eurekastreams.web.client.events.data.GotSystemSettingsResponseEvent;
import org.eurekastreams.web.client.jsni.GadgetRenderer;
import org.eurekastreams.web.client.model.BaseModel;
import org.eurekastreams.web.client.model.SystemSettingsModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.form.FormBuilder;
import org.eurekastreams.web.client.ui.common.form.FormBuilder.Method;
import org.eurekastreams.web.client.ui.common.form.elements.BasicCheckBoxFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.BasicDropDownFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.BasicTextBoxFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.JSNICommandFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.UrlValidatorFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.ValueOnlyFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.UrlValidatorFormElement.GenerateUrlCommand;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;

/**
 * Renders a gadget to the screen and sets up the javascript API for stream plugins.
 *
 */
public class StreamPluginConfigurationPanel extends FlowPanel {

    /**
     * The form builder.
     */
    private static FormBuilder formBuilder;

    /**
     * Spinny.
     */
    private static FlowPanel spinny;
    /**
     * The conf values.
     */
    private static HashMap<String, Serializable> confValues;

    /**
     * Gadget renderer.
     */
    private GadgetRenderer gadgetRenderer = new GadgetRenderer();

    /**
     * The current mode of the panel.
     */
    private static Method mode;

    /**
     * Default constructor.
     *
     * @param feedSubscriber
     *            The feed subscriber object, which contains the feed and plugin as well.
     * @param model
     *            The base model.
     * @param metaData
     *            the plugin title.
     */
    public StreamPluginConfigurationPanel(final FeedSubscriber feedSubscriber, final BaseModel model,
            final GadgetMetaDataDTO metaData) {
        this(feedSubscriber.getFeed().getPlugin(), model, feedSubscriber.getConfSettings(), Method.UPDATE,
                feedSubscriber.getId(), metaData);
    }

    /**
     * Default Constructor.
     *
     * @param pluginDefinition
     *            The plugin being configured
     * @param model
     *            The base model.
     * @param metaData
     *            the plugin title.
     */
    public StreamPluginConfigurationPanel(final GeneralGadgetDefinition pluginDefinition, final BaseModel model,
            final GadgetMetaDataDTO metaData) {
        this(pluginDefinition, model, new HashMap<String, Serializable>(), Method.INSERT, null, metaData);
    }

    /**
     * Private Constructor, used to switch values between Add and Edit modes.
     *
     * @param pluginDefinition
     *            The current plugin
     * @param model
     *            The base model.
     * @param inConfValues
     *            The configuration values for the feed
     * @param inMode
     *            The mode of the panel
     * @param feedSubId
     *            id of the feed sub.
     * @param metaData
     *            the plugin title.
     */
    private StreamPluginConfigurationPanel(final GeneralGadgetDefinition pluginDefinition, final BaseModel model,
            final HashMap<String, Serializable> inConfValues, final Method inMode, final Long feedSubId,
            final GadgetMetaDataDTO metaData) {
        mode = inMode;
        confValues = inConfValues;

        formBuilder = new FormBuilder("", model, mode);
        this.addStyleName(StaticResourceBundle.INSTANCE.coreCss().streamPluginConfPanel());
        formBuilder.setVisible(false);

        final Integer random = Random.nextInt(10000);

        FlowPanel gadgetDiv = new FlowPanel();
        gadgetDiv.setVisible(false);
        gadgetDiv.getElement().setAttribute("id", "gadget-zone-render-zone-" + random.toString());
        this.add(gadgetDiv);

        spinny = new FlowPanel();
        spinny.addStyleName(StaticResourceBundle.INSTANCE.coreCss().gadgetsGadgetLoading());

        this.add(spinny);

        final BasicCheckBoxFormElement lastCheckBox = new BasicCheckBoxFormElement("Terms of Use", "EUREKA:TOS",
                "I understand that the plugin I am about to configure will import activity "
                        + "into this stream and that the content I am sharing is consistent with the Eureka "
                        + "Streams terms of service.",
                false, mode.equals(Method.UPDATE));

        Session.getInstance().getEventBus().addObserver(GotSystemSettingsResponseEvent.class,
                new Observer<GotSystemSettingsResponseEvent>() {

                    public void update(final GotSystemSettingsResponseEvent event) {
                        lastCheckBox.addAdditionalInstructions(new HTML(event.getResponse().getPluginWarning()));
                    }
                });
        SystemSettingsModel.getInstance().fetch(null, true);

        lastCheckBox.addStyleName(StaticResourceBundle.INSTANCE.coreCss().streamPluginCheckbox());

        formBuilder.setOnCancelHistoryToken(History.getToken());
        formBuilder.addWidget(new PluginMetaDataDescriptionPanel(metaData));
        formBuilder.addLastFormElement(lastCheckBox);

        formBuilder.addFormElement(new ValueOnlyFormElement("EUREKA:GROUP",
                Session.getInstance().getUrlViews().get(Session.getInstance().getUrlViews().size() - 1)));
        formBuilder.addFormElement(new JSNICommandFormElement("EUREKA:FEEDURL", "getFeedCommand"));
        formBuilder.addFormElement(new ValueOnlyFormElement("EUREKA:PLUGINID", pluginDefinition.getId()));
        formBuilder.addFormElement(new ValueOnlyFormElement("EUREKA:PLUGINTITLE", metaData.getTitle()));

        if (mode.equals(Method.UPDATE)) {
            formBuilder.addFormElement(new ValueOnlyFormElement("EUREKA:FEEDSUBID", feedSubId));
        }

        this.add(formBuilder);

        formBuilder.addOnCancelCommand(new Command() {
            public void execute() {
                Session.getInstance().getEventBus().notifyObservers(new StreamPluginsUpdateCanceledEvent());
            }
        });

        setUpAPI();

        gadgetRenderer.registerSingleGadgetInContainer(pluginDefinition.getUrl(), Long.valueOf(random),
                pluginDefinition.getId(), null);

        DeferredCommand.addCommand(new Command() {
            public void execute() {
                // gadgetRenderer.renderGadget(random.toString());
                gadgetRenderer.renderGagdets();
            }
        });
    }

    /**
     * Helper method to check if required text is there and if it is return the required boolean and add a required
     * hidden form element to the form.
     *
     * @param key
     *            the key
     * @param requiredText
     *            the required text.
     * @return the required boolean.
     */
    private static boolean setupRequired(final String key, final String requiredText) {
        boolean required;
        if (requiredText == null || requiredText.equals("")) {
            required = false;
        } else {
            required = true;
            formBuilder.addFormElement(new ValueOnlyFormElement("REQUIRED:" + key, requiredText));
        }

        return required;
    }

    /**
     * Adds a url validator.
     *
     * @param labelVal
     *            the label.
     * @param inKey
     *            the key.
     * @param inValue
     *            the value.
     * @param inInstructions
     *            the instructions.
     * @param requiredText
     *            the required text.
     * @param commandName
     *            the command.
     */
    public static void addUrlValidator(final String labelVal, final String inKey, final String inValue,
            final String inInstructions, final String requiredText, final String commandName) {

        String value = inValue;
        if ((value == null || value.equals("")) && confValues.containsKey(inKey + "original")) {
            value = (String) confValues.get(inKey + "original");
        }

        boolean required = setupRequired(inKey, requiredText);

        UrlValidatorFormElement urlVal = new UrlValidatorFormElement(labelVal, inKey, value, inInstructions,
                required, new GenerateUrlCommand() {
                    public String generateUrl(final String value) {
                        return runJSNICommand(value, commandName);
                    }
                });

        formBuilder.addFormElement(urlVal);
        formBuilder.addFormElement(urlVal.getOriginalValueFormElement());
        hideSpinny();

        // If we're updating, hit the import button.
        if (mode.equals(Method.UPDATE)) {
            urlVal.importUrl();
        }
    }

    /**
     * Adds a text box.
     *
     * @param size
     *            the size.
     * @param labelVal
     *            the label.
     * @param inKey
     *            the key.
     * @param inValue
     *            the value.
     * @param inInstructions
     *            the instructions.
     * @param requiredText
     *            the required text.
     */
    public static void addTextBox(final int size, final String labelVal, final String inKey, final String inValue,
            final String inInstructions, final String requiredText) {
        String value = inValue;
        if ((value == null || value.equals("")) && confValues.containsKey(inKey)) {
            value = (String) confValues.get(inKey);
        }

        boolean required = setupRequired(inKey, requiredText);

        formBuilder.addFormElement(
                new BasicTextBoxFormElement(size, true, labelVal, inKey, value, inInstructions, required));
        hideSpinny();
    }

    /**
     * Adds a checkbox.
     *
     * @param labelVal
     *            the label.
     * @param inKey
     *            the key.
     * @param inInstructions
     *            the instructions.
     * @param requiredText
     *            the required text.
     * @param inChecked
     *            checked.
     */
    public static void addCheckBox(final String labelVal, final String inKey, final String inInstructions,
            final String requiredText, final boolean inChecked) {
        boolean checked = inChecked;
        if (confValues.containsKey(inKey)) {
            checked = Boolean.valueOf((String) confValues.get(inKey));
        }
        boolean required = setupRequired(inKey, requiredText);

        formBuilder
                .addFormElement(new BasicCheckBoxFormElement(labelVal, inKey, inInstructions, required, checked));
        hideSpinny();
    }

    /**
     * Adds a drop down.
     *
     * @param labelVal
     *            the label.
     * @param inKey
     *            the key.
     * @param values
     *            the values.
     * @param inCurrentValue
     *            the current value.
     * @param inInstructions
     *            the instructions.
     * @param requiredText
     *            required text.
     */
    public static void addDropDown(final String labelVal, final String inKey, final String[] values,
            final String inCurrentValue, final String inInstructions, final String requiredText) {
        String currentValue = inCurrentValue;
        if ((currentValue == null || currentValue.equals("")) && confValues.containsKey(inKey)) {
            currentValue = (String) confValues.get(inKey);
        }
        List<String> valuesList = new ArrayList<String>();
        for (int i = 0; i < values.length; i++) {
            valuesList.add(values[i]);
        }

        boolean required = setupRequired(inKey, requiredText);

        formBuilder.addFormElement(
                new BasicDropDownFormElement(labelVal, inKey, valuesList, currentValue, inInstructions, required));
        hideSpinny();
    }

    /**
     * Gets the form value.
     *
     * @param key
     *            key.
     * @return value.
     */
    public static String getFormValue(final String key) {
        return formBuilder.getFormValue(key).toString();
    }

    /**
     * Hide the spinny.
     */
    private static void hideSpinny() {
        formBuilder.setVisible(true);
        spinny.setVisible(false);
    }

    /**
     * Runs a JSNI command.
     *
     * @param value
     *            the value to pass in it.
     * @param commandName
     *            the command name.
     * @return the return value.
     */
    private static native String runJSNICommand(final String value, final String commandName)
    /*-{
     return $wnd[commandName](value);
    }-*/;

    /**
     * Set up the API for the gadget to use.
     */
    private static native void setUpAPI()
    /*-{
    $wnd.gwt_getFormValue = function(key) {
       return @org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel::getFormValue(Ljava/lang/String;)(key);
    }
        
    $wnd.gwt_registerGetFeedCallback = function(func) {
       eval("$wnd['getFeedCommand'] = " + func);
    }
        
    $wnd.gwt_addUrlValidator = function(label, key, value, instructions, required, command) {
          var commandName = "urlValidator"+Math.floor(Math.random()*10000);
          eval("$wnd['" + commandName + "'] = " + command);
            @org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel::addUrlValidator(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(label, key, value, instructions, required, commandName);
    }
        
    $wnd.gwt_addTextBox = function(size, label, key, value, instructions, required) {
            @org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel::addTextBox(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(size, label, key, value, instructions, required);
    }
        
    $wnd.gwt_addCheckBox = function(label, key, value, instructions, required, checked) {
            @org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel::addCheckBox(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)(label, key, value, instructions, required, checked);
    }
        
    $wnd.gwt_addDropDown = function(label, key, values, currentValue, instructions, required) {
            @org.eurekastreams.web.client.ui.pages.profile.settings.stream.StreamPluginConfigurationPanel::addDropDown(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(label, key, values, currentValue, instructions, required);
    }
        
    }-*/;
}