net.scran24.user.client.survey.prompts.RecipeBrowser.java Source code

Java tutorial

Introduction

Here is the source code for net.scran24.user.client.survey.prompts.RecipeBrowser.java

Source

/*
This file is part of Intake24.
    
 Crown copyright, 2012, 2013, 2014.
    
This software is licensed under the Open Government Licence 3.0:
    
http://www.nationalarchives.gov.uk/doc/open-government-licence/
*/

package net.scran24.user.client.survey.prompts;

import java.util.ArrayList;

import net.scran24.common.client.WidgetFactory;
import net.scran24.user.client.ShepherdTour;
import net.scran24.user.client.survey.RecipeManager;
import net.scran24.user.client.survey.prompts.messages.HelpMessages;
import net.scran24.user.client.survey.prompts.messages.PromptMessages;
import net.scran24.user.shared.Recipe;

import org.pcollections.client.PVector;
import org.pcollections.client.TreePVector;
import org.workcraft.gwt.shared.client.Callback1;

import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;

public class RecipeBrowser extends Composite {

    private static final HelpMessages helpMessages = HelpMessages.Util.getInstance();
    private static final PromptMessages promptMessages = PromptMessages.Util.getInstance();

    private static class RecipeButton {

        public final FlowPanel container;
        public final Label link;
        public final Button deleteButton;

        public RecipeButton(String recipeName) {
            container = new FlowPanel();

            link = new Label(SafeHtmlUtils.htmlEscape(recipeName));
            link.addStyleName("intake24-food-browser-recipe");

            deleteButton = new Button();
            deleteButton.getElement().addClassName("intake24-delete-recipe-button");

            container.add(deleteButton);
            container.add(link);

            hideDeleteButton();
        }

        public void showDeleteButton() {
            deleteButton.getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
        }

        public void hideDeleteButton() {
            deleteButton.getElement().getStyle().setDisplay(Display.NONE);
        }
    }

    final private Callback1<Recipe> onRecipeChosen;

    private final FlowPanel contents = new FlowPanel();
    private final RecipeManager manager;
    private final Button showAllRecipesButton;
    private final Button deleteRecipesButton;
    private boolean deleting = false;

    private FlowPanel recipesPanel;
    private boolean noRecipes;

    private final ArrayList<RecipeButton> recipeButtons = new ArrayList<RecipeButton>();

    public RecipeBrowser(final Callback1<Recipe> onRecipeChosen, final RecipeManager manager) {
        this.onRecipeChosen = onRecipeChosen;
        this.manager = manager;

        contents.addStyleName("intake24-food-browser");

        showAllRecipesButton = WidgetFactory.createButton(
                SafeHtmlUtils.htmlEscape(promptMessages.recipeBrowser_showAllRecipes()), new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        showRecipes(manager.getSavedRecipes());
                        showAllRecipesButton.setVisible(false);
                    }
                });

        showAllRecipesButton.getElement().setId("intake24-recipe-browser-show-all-button");

        deleteRecipesButton = WidgetFactory.createButton(
                SafeHtmlUtils.htmlEscape(promptMessages.recipeBrowser_deleteRecipes()), new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        if (deleting) {
                            deleteRecipesButton.setText(
                                    SafeHtmlUtils.htmlEscape(promptMessages.recipeBrowser_deleteRecipes()));
                            deleting = false;

                            for (RecipeButton r : recipeButtons)
                                r.hideDeleteButton();
                        } else {
                            deleteRecipesButton
                                    .setText(SafeHtmlUtils.htmlEscape(promptMessages.recipeBrowser_done()));
                            deleting = true;

                            for (RecipeButton r : recipeButtons)
                                r.showDeleteButton();
                        }
                    }
                });

        deleteRecipesButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);
        deleteRecipesButton.getElement().setId("intake24-recipe-browser-delete-button");

        initWidget(contents);
    }

    private void showRecipes(PVector<Recipe> recipes) {
        contents.clear();
        recipeButtons.clear();

        showAllRecipesButton.setVisible(true);

        if (!manager.getSavedRecipes().isEmpty()) {
            contents.add(showAllRecipesButton);
            contents.add(deleteRecipesButton);
            noRecipes = false;
        } else
            noRecipes = true;

        if (!recipes.isEmpty()) {
            showAllRecipesButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);

            recipesPanel = new FlowPanel();
            recipesPanel.addStyleName("intake24-food-browser-foods-container");
            recipesPanel.getElement().setId("intake24-recipe-browser-recipes-panel");

            HTMLPanel header = new HTMLPanel("h2",
                    SafeHtmlUtils.htmlEscape(promptMessages.recipeBrowser_yourRecipes()));
            recipesPanel.add(header);

            for (final Recipe recipe : recipes) {
                final RecipeButton recipeBlock = new RecipeButton(recipe.mainFood.description);

                recipeBlock.link.addClickHandler(new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        onRecipeChosen.call(recipe);
                    }
                });

                recipeBlock.deleteButton.addClickHandler(new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        recipeButtons.remove(recipeBlock);
                        recipesPanel.remove(recipeBlock.container);
                        if (!manager.deleteRecipe(recipe.mainFood.link.id))
                            contents.clear();
                    }
                });

                recipesPanel.add(recipeBlock.container);
                recipeButtons.add(recipeBlock);
            }

            contents.add(recipesPanel);
        } else {
            recipesPanel = null;
            showAllRecipesButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.NONE);
        }
    }

    public void lookup(String description) {
        showRecipes(manager.matchRecipes(description));
    }

    public PVector<ShepherdTour.Step> getShepherdTourSteps() {

        PVector<ShepherdTour.Step> result = TreePVector.<ShepherdTour.Step>empty();

        if (noRecipes)
            return result;

        if (recipesPanel != null) {
            ShepherdTour.makeShepherdTarget(recipesPanel);
            result = result.plus(new ShepherdTour.Step("recipeBrowser_recipes",
                    "#intake24-recipe-browser-recipes-panel", helpMessages.recipeBrowser_recipesTitle(),
                    helpMessages.recipeBrowser_recipesDescription()));

            ShepherdTour.makeShepherdTarget(deleteRecipesButton);
            result = result.plus(new ShepherdTour.Step("recipeBrowser_deleteButton",
                    "#intake24-recipe-browser-delete-button", helpMessages.recipeBrowser_deleteButtonTitle(),
                    helpMessages.recipeBrowser_deleteButtonDescription(), "top right", "bottom right"));
        }

        if (showAllRecipesButton.isVisible()) {
            ShepherdTour.makeShepherdTarget(showAllRecipesButton);
            result = result.plus(new ShepherdTour.Step("recipeBrowser_showAllButton",
                    "#intake24-recipe-browser-show-all-button", helpMessages.recipeBrowser_showAllButtonTitle(),
                    helpMessages.recipeBrowser_showAllButtonDescription(), "top right", "bottom right"));

        }

        return result;
    }
}