edu.ucdenver.bios.glimmpseweb.client.shared.GlimmpseFeedbackPanel.java Source code

Java tutorial

Introduction

Here is the source code for edu.ucdenver.bios.glimmpseweb.client.shared.GlimmpseFeedbackPanel.java

Source

/*
 * User Interface for the GLIMMPSE Software System.  Allows
 * users to perform power, sample size, and detectable difference
 * calculations. 
 * 
 * Copyright (C) 2010 Regents of the University of Colorado.  
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package edu.ucdenver.bios.glimmpseweb.client.shared;

import java.text.ParseException;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

import edu.ucdenver.bios.glimmpseweb.client.GlimmpseConstants;
import edu.ucdenver.bios.glimmpseweb.client.GlimmpseWeb;
import edu.ucdenver.bios.glimmpseweb.client.TextValidation;

/**
 * Comment and Bug reporting form for GLIMMPSE.
 * Depends on formmail.php script from http://www.tectite.com
 * @author Sarah Kreidler
 *
 */
public class GlimmpseFeedbackPanel extends Composite {

    private static final String FORMMAIL_URI = GlimmpseWeb.constants.formmailURI();

    // form for sending feedback via formmail.php
    protected FormPanel feedbackForm = new FormPanel("_self");
    protected Hidden envReportHidden = new Hidden("env_report");
    protected Hidden goodUrlHidden = new Hidden("good_url");
    protected Hidden badUrlHidden = new Hidden("bad_url");
    protected Hidden recipientsHidden = new Hidden("recipients");
    protected Hidden mailOptionsHidden = new Hidden("mail_options");
    protected Hidden contactHidden = new Hidden("contact");
    // input fields
    protected TextBox nameTextBox = new TextBox();
    protected TextBox emailAddressTextBox = new TextBox();
    protected HTML emailErrorHTML = new HTML();
    protected ListBox subjectListBox = new ListBox();
    protected RadioButton contactYesRadioButton = new RadioButton("contactGroup", GlimmpseWeb.constants.yes());
    protected RadioButton contactNoRadioButton = new RadioButton("contactGroup", GlimmpseWeb.constants.no());
    protected ListBox browserListBox = new ListBox();
    protected TextBox browserOtherTextBox = new TextBox();
    protected ListBox versionListBox = new ListBox();
    protected TextArea messageTextArea = new TextArea();
    protected Button submitButton = new Button(GlimmpseWeb.constants.submit(), new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            submitFeedback();
        }
    });

    public GlimmpseFeedbackPanel() {

        /* setup the hidden fields */
        envReportHidden.setValue("REMOTE_HOST,REMOTE_ADDR," + "HTTP_USER_AGENT,AUTH_TYPE,REMOTE_USER");
        goodUrlHidden.setValue("/feedbackSuccess.html");
        badUrlHidden.setValue("/feedbackError.html");
        recipientsHidden.setValue(GlimmpseWeb.constants.feedbackEmailAddress());
        mailOptionsHidden.setValue("Exclude=email;realname");

        VerticalPanel panel = new VerticalPanel();

        HTML header = new HTML(GlimmpseWeb.constants.feedbackHeader());
        HTML description = new HTML(GlimmpseWeb.constants.feedbackDescription());

        // assign names to form widgets
        nameTextBox.setName("FullName");
        emailAddressTextBox.setName("EmailAddr");
        browserOtherTextBox.setName("browserOther");
        versionListBox.setName("version");
        messageTextArea.setName("message");

        // build subject listbox
        subjectListBox.addItem(GlimmpseWeb.constants.feedbackTypeGeneral());
        subjectListBox.addItem(GlimmpseWeb.constants.feedbackTypeFeature());
        subjectListBox.addItem(GlimmpseWeb.constants.feedbackTypeBug());
        subjectListBox.setName("subject");

        // build browser listbox
        browserListBox.addItem(GlimmpseWeb.constants.browserChromeLabel());
        browserListBox.addItem(GlimmpseWeb.constants.browserIELabel());
        browserListBox.addItem(GlimmpseWeb.constants.browserFirefoxLabel());
        browserListBox.addItem(GlimmpseWeb.constants.browserOperaLabel());
        browserListBox.addItem(GlimmpseWeb.constants.browserSafariLabel());
        browserListBox.addItem(GlimmpseWeb.constants.other());
        browserListBox.setName("browser");
        // build version listbox
        versionListBox.addItem("2.0.0 beta");
        versionListBox.addItem("1.1.0");
        versionListBox.addItem(GlimmpseWeb.constants.notSure());
        // callbacks on radio buttons
        contactYesRadioButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                setContact("Yes");
            }
        });
        contactNoRadioButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                setContact("No");
            }
        });
        // validation callbacks on required fields
        nameTextBox.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                checkComplete();
            }
        });
        emailAddressTextBox.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                TextBox tb = (TextBox) event.getSource();
                try {
                    TextValidation.parseEmail(tb.getText());
                    TextValidation.displayOkay(emailErrorHTML, "");
                } catch (ParseException pe) {
                    TextValidation.displayError(emailErrorHTML, GlimmpseWeb.constants.errorInvalidEmail());
                    tb.setText("");
                }
                checkComplete();
            }
        });
        messageTextArea.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                checkComplete();
            }
        });

        // build the form
        feedbackForm.setAction(FORMMAIL_URI);
        feedbackForm.setMethod(FormPanel.METHOD_POST);
        VerticalPanel formContainer = new VerticalPanel();
        // add hidden fields
        formContainer.add(envReportHidden);
        formContainer.add(goodUrlHidden);
        formContainer.add(badUrlHidden);
        formContainer.add(recipientsHidden);
        formContainer.add(mailOptionsHidden);
        formContainer.add(contactHidden);
        // select feature, bug, or comment
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackTypeLabel()));
        formContainer.add(subjectListBox);
        // enter name
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackNameLabel()));
        formContainer.add(nameTextBox);
        // enter email
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackEmailLabel()));
        HorizontalPanel emailPanel = new HorizontalPanel();
        emailPanel.add(emailAddressTextBox);
        emailPanel.add(emailErrorHTML);
        formContainer.add(emailPanel);
        // enter if contact is okay
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackMayWeContactLabel()));
        Grid yesNoContainer = new Grid(1, 2);
        contactYesRadioButton.setValue(true);
        yesNoContainer.setWidget(0, 0, contactYesRadioButton);
        yesNoContainer.setWidget(0, 1, contactNoRadioButton);
        formContainer.add(yesNoContainer);
        // browser select with other
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackBrowserLabel()));
        formContainer.add(browserListBox);
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackOtherLabel()));
        formContainer.add(browserOtherTextBox);
        // version dropdown
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackVersionLabel()));
        formContainer.add(versionListBox);
        // actual message contents
        formContainer.add(buildInputQuestion(GlimmpseWeb.constants.feedbackContentsLabel()));
        formContainer.add(messageTextArea);
        formContainer.add(submitButton);
        // add the container to the form
        feedbackForm.setWidget(formContainer);

        // layout the overall panel
        panel.add(header);
        panel.add(description);
        panel.add(feedbackForm);

        // set style
        header.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_HEADER);
        description.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_DESCRIPTION);
        subjectListBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        nameTextBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        emailAddressTextBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        yesNoContainer.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        browserListBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        browserOtherTextBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        versionListBox.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_RESPONSE);
        messageTextArea.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_MESSAGE);
        submitButton.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_SUBMIT);
        emailErrorHTML.setStyleName(GlimmpseConstants.STYLE_MESSAGE);

        checkComplete();
        initWidget(panel);
    }

    /**
     * Convenience routine to build the html label and set style
     * @param value string value
     * @return HTML widget
     */
    private HTML buildInputQuestion(String value) {
        HTML valueHTML = new HTML(value);
        valueHTML.setStyleName(GlimmpseConstants.STYLE_FEEDBACK_QUESTION);
        return valueHTML;
    }

    /**
     * Set the contact value to yes or no.
     */
    private void setContact(String value) {
        contactHidden.setValue(value);
    }

    /**
     * submit the form to the formmail script
     */
    private void submitFeedback() {
        feedbackForm.submit();
        feedbackForm.reset();
    }

    /**
     * Verify that all required information has been specified
     */
    private void checkComplete() {
        boolean complete = (nameTextBox.getValue() != null && !nameTextBox.getValue().isEmpty()
                && emailAddressTextBox.getValue() != null && !emailAddressTextBox.getValue().isEmpty()
                && messageTextArea.getValue() != null && !messageTextArea.getValue().isEmpty());

        submitButton.setEnabled(complete);
    }

}