dhbw.clippinggorilla.userinterface.windows.GroupProfileWindow.java Source code

Java tutorial

Introduction

Here is the source code for dhbw.clippinggorilla.userinterface.windows.GroupProfileWindow.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package dhbw.clippinggorilla.userinterface.windows;

import com.vaadin.event.ShortcutAction;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.server.ExternalResource;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.PopupView;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.ValoTheme;
import dhbw.clippinggorilla.objects.category.Category;
import dhbw.clippinggorilla.objects.category.CategoryUtils;
import dhbw.clippinggorilla.objects.group.Group;
import dhbw.clippinggorilla.objects.group.GroupInterestProfile;
import dhbw.clippinggorilla.objects.group.GroupInterestProfileUtils;
import dhbw.clippinggorilla.objects.group.GroupUtils;
import dhbw.clippinggorilla.objects.source.Source;
import dhbw.clippinggorilla.objects.source.SourceUtils;
import dhbw.clippinggorilla.utilities.language.Language;
import dhbw.clippinggorilla.utilities.language.Word;
import dhbw.clippinggorilla.utilities.ui.VaadinUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author frank
 */
public class GroupProfileWindow extends Window {

    public static GroupProfileWindow create(Group g, String name, boolean isAdmin, Runnable onClose) {
        return new GroupProfileWindow(createEmptyProfile(g, name), onClose, isAdmin);
    }

    public static GroupProfileWindow show(GroupInterestProfile p, boolean isAdmin, Runnable onClose) {
        return new GroupProfileWindow(p, onClose, isAdmin);
    }

    public GroupProfileWindow(GroupInterestProfile p, Runnable onClose, boolean isAdmin) {
        VerticalLayout profileSettingsLayout = new VerticalLayout();
        GridLayout windowContent;
        Button buttonSave = new Button();

        if (isAdmin) {
            windowContent = new GridLayout(3, 3);

            TextField textFieldName = new TextField();
            Language.set(Word.NAME, textFieldName);
            textFieldName.setWidth("100%");
            textFieldName.setValue(p.getName());
            textFieldName.setMaxLength(255);

            Language.set(Word.SAVE, buttonSave);
            buttonSave.setIcon(VaadinIcons.CHECK);
            buttonSave.addStyleName(ValoTheme.BUTTON_PRIMARY);
            buttonSave.addClickListener(ce -> {
                GroupInterestProfileUtils.changeName(p, textFieldName.getValue());
                GroupInterestProfileUtils.changeSources(p, p.getSources());
                GroupInterestProfileUtils.changeCategories(p, p.getCategories());
                GroupInterestProfileUtils.changeAllTags(p, p.getTags());
                VaadinUtils.infoNotification(Language.get(Word.SUCCESSFULLY_SAVED));
                close();
                onClose.run();
            });

            Label placeholder2 = new Label();
            placeholder2.setWidth("100%");
            windowContent.addComponents(textFieldName, placeholder2);
            windowContent.setComponentAlignment(textFieldName, Alignment.MIDDLE_LEFT);
            windowContent.addComponent(getSources(p, true), 0, 1, 1, 1);
            windowContent.addComponent(getCategories(p, true), 2, 1);
            windowContent.addComponent(getTags(p, true), 0, 2, 2, 2);
        } else {
            windowContent = new GridLayout(3, 2);

            Language.set(Word.CLOSE, buttonSave);
            buttonSave.setIcon(VaadinIcons.CLOSE);
            buttonSave.addStyleName(ValoTheme.BUTTON_PRIMARY);
            buttonSave.addClickListener(ce -> {
                close();
                onClose.run();
            });

            windowContent.addComponent(getSources(p, false), 0, 0, 1, 0);
            windowContent.addComponent(getCategories(p, false), 2, 0);
            windowContent.addComponent(getTags(p, false), 0, 1, 2, 1);
        }

        buttonSave.setClickShortcut(ShortcutAction.KeyCode.ENTER, null);

        Label placeholder = new Label();

        Label labelHelp = new Label(Language.get(Word.HELP_TEXT), ContentMode.HTML);
        labelHelp.setWidth("500px");
        PopupView popupHelp = new PopupView(null, labelHelp);

        Button buttonHelp = new Button(Language.get(Word.HELP), VaadinIcons.QUESTION);
        buttonHelp.addClickListener(ce -> {
            popupHelp.setPopupVisible(true);
        });

        GridLayout footer;
        if (isAdmin) {
            footer = new GridLayout(4, 1);
            footer.addComponents(buttonHelp, popupHelp, placeholder, buttonSave);
            footer.setColumnExpandRatio(2, 5);
        } else {
            footer = new GridLayout(2, 1);
            footer.addComponents(placeholder, buttonSave);
            footer.setColumnExpandRatio(0, 5);

        }
        footer.setSpacing(true);
        footer.setSizeUndefined();
        footer.addStyleName(ValoTheme.WINDOW_BOTTOM_TOOLBAR);
        footer.setWidth("100%");
        footer.addStyleName("menubar");
        footer.setComponentAlignment(buttonSave, Alignment.MIDDLE_CENTER);

        windowContent.setWidth("100%");
        windowContent.setSpacing(true);
        windowContent.setMargin(true);
        windowContent.addStyleName("profiles");
        profileSettingsLayout.addComponents(windowContent, footer);
        profileSettingsLayout.setMargin(false);
        profileSettingsLayout.setSpacing(false);
        profileSettingsLayout.setWidth("100%");

        setContent(profileSettingsLayout);
        center();
        setWidthUndefined();
        setCaption(p.getName());
        setWidth("950px");
    }

    public Component getSources(GroupInterestProfile profile, boolean isAdmin) {
        VerticalLayout windowLayout = new VerticalLayout();
        windowLayout.setWidth("100%");
        VerticalLayout sourcesLayout = new VerticalLayout();
        sourcesLayout.setWidth("100%");
        Panel sourcesPanel = new Panel(sourcesLayout);

        List<CheckBox> checkBoxes = new ArrayList<>();
        HashMap<String, GridLayout> sourceLayouts = new HashMap<>();
        profile.getSources().entrySet().stream()
                .sorted((e1, e2) -> e1.getKey().getName().compareToIgnoreCase(e2.getKey().getName())).forEach(e -> {
                    Source source = e.getKey();
                    boolean enabled = e.getValue();
                    GridLayout sourceLayout = new GridLayout(5, 1);
                    sourceLayout.setSizeFull();

                    CheckBox sourceSelected = new CheckBox();
                    sourceSelected.setValue(enabled);
                    sourceSelected.addStyleName(ValoTheme.CHECKBOX_LARGE);
                    sourceSelected.addValueChangeListener(v -> profile.getSources().replace(source, v.getValue()));
                    sourceSelected.setEnabled(isAdmin);
                    checkBoxes.add(sourceSelected);

                    Image sourceLogo = new Image();
                    sourceLogo.addStyleName("logosmall");
                    sourceLogo.setSource(new ExternalResource(source.getLogo()));
                    if (isAdmin) {
                        sourceLogo.addClickListener(c -> {
                            sourceSelected.setValue(!sourceSelected.getValue());
                            profile.getSources().replace(source, sourceSelected.getValue());
                        });
                    }
                    VerticalLayout layoutLogo = new VerticalLayout(sourceLogo);
                    layoutLogo.setWidth("150px");
                    layoutLogo.setHeight("50px");
                    layoutLogo.setMargin(false);
                    layoutLogo.setSpacing(false);
                    layoutLogo.setComponentAlignment(sourceLogo, Alignment.MIDDLE_LEFT);

                    Label labelHeadLine = new Label(
                            source.getCategory().getIcon().getHtml() + "  " + source.getName(), ContentMode.HTML);
                    labelHeadLine.addStyleName(ValoTheme.LABEL_H3);

                    Label labelDescription = new Label(source.getDescription(), ContentMode.HTML);
                    labelDescription.setWidth("300px");
                    PopupView popup = new PopupView(null, labelDescription);

                    Button buttonDescription = new Button(VaadinIcons.INFO_CIRCLE_O);
                    buttonDescription.addClickListener(ce -> {
                        popup.setPopupVisible(true);
                    });

                    sourceLayout.addComponents(sourceSelected, layoutLogo, labelHeadLine, popup, buttonDescription);
                    sourceLayout.setComponentAlignment(sourceSelected, Alignment.MIDDLE_CENTER);
                    sourceLayout.setComponentAlignment(layoutLogo, Alignment.MIDDLE_CENTER);
                    sourceLayout.setColumnExpandRatio(2, 5);
                    sourceLayout.setSpacing(true);

                    sourceLayouts.put(source.getName().toLowerCase().replaceAll(" ", "").replaceAll("-", "")
                            .replaceAll("_", ""), sourceLayout);
                    sourcesLayout.addComponent(sourceLayout);
                });

        sourcesPanel.setContent(sourcesLayout);
        sourcesPanel.setHeight("100%");
        sourcesPanel.setCaption(Language.get(Word.SOURCES));
        Language.setCustom(Word.SOURCES, s -> sourcesPanel.setCaption(s));
        windowLayout.addComponent(sourcesPanel);
        windowLayout.setExpandRatio(sourcesPanel, 1);
        windowLayout.setSpacing(false);
        windowLayout.setMargin(false);

        CheckBox checkBoxSelectAll = new CheckBox();
        Language.setCustom(Word.SELECT_ALL, s -> checkBoxSelectAll.setCaption(s));
        checkBoxSelectAll.setWidth("100%");
        checkBoxSelectAll.addValueChangeListener(e -> {
            profile.getSources().replaceAll((c, enabled) -> checkBoxSelectAll.getValue());
            checkBoxes.forEach(c -> c.setValue(checkBoxSelectAll.getValue()));
        });
        checkBoxSelectAll.setEnabled(isAdmin);

        TextField textFieldSearch = new TextField();
        Language.setCustom(Word.SEARCH, s -> textFieldSearch.setPlaceholder(s));
        textFieldSearch.setWidth("100%");
        textFieldSearch.setMaxLength(255);
        textFieldSearch.setPlaceholder(Language.get(Word.SEARCH));
        textFieldSearch.addValueChangeListener(searchValue -> {
            sourceLayouts.forEach((sourceName, sourceLayout) -> {
                if (!sourceName.contains(searchValue.getValue().toLowerCase().replaceAll(" ", "")
                        .replaceAll("-", "").replaceAll("_", ""))) {
                    sourcesLayout.removeComponent(sourceLayout);
                } else {
                    sourcesLayout.addComponent(sourceLayout);
                }
            });
        });

        Label placeholder = new Label();
        placeholder.setWidth("100%");

        GridLayout footer = new GridLayout(3, 1);
        footer.setSpacing(true);
        footer.setMargin(new MarginInfo(true, false, false, false));
        footer.addStyleName("menubar");
        footer.setWidth("100%");
        footer.addComponents(checkBoxSelectAll, textFieldSearch, placeholder);
        footer.setComponentAlignment(checkBoxSelectAll, Alignment.MIDDLE_LEFT);
        footer.setComponentAlignment(textFieldSearch, Alignment.MIDDLE_CENTER);

        windowLayout.addComponent(footer);
        windowLayout.setHeight("350px");
        return windowLayout;
    }

    public Component getCategories(GroupInterestProfile profile, boolean isAdmin) {
        Map<Category, Boolean> categories = profile.getCategories();
        VerticalLayout categoriesLayout = new VerticalLayout();
        categoriesLayout.setWidth("100%");
        Panel categoriesPanel = new Panel(categoriesLayout);

        categories.entrySet().stream().sorted((e1, e2) -> e1.getKey().getName().compareTo(e2.getKey().getName()))
                .forEach(e -> {
                    Category category = e.getKey();
                    boolean enabled = e.getValue();
                    GridLayout categoryLayout = new GridLayout(3, 1);
                    categoryLayout.setWidth("100%");

                    CheckBox categorySelected = new CheckBox();
                    categorySelected.setValue(enabled);
                    categorySelected.addStyleName(ValoTheme.CHECKBOX_LARGE);
                    categorySelected.addValueChangeListener(v -> categories.replace(category, v.getValue()));
                    categorySelected.setEnabled(isAdmin);

                    Label categoryIcon = new Label(category.getIcon().getHtml(), ContentMode.HTML);
                    categoryIcon.addStyleName(ValoTheme.LABEL_H3);
                    categoryIcon.addStyleName(ValoTheme.LABEL_NO_MARGIN);

                    Label categoryName = new Label(category.getName(), ContentMode.HTML);
                    Language.setCustom(null, s -> categoryName.setValue(category.getName()));
                    categoryName.addStyleName(ValoTheme.LABEL_H3);
                    categoryName.addStyleName(ValoTheme.LABEL_NO_MARGIN);

                    categoryLayout.addComponents(categorySelected, categoryIcon, categoryName);
                    categoryLayout.setComponentAlignment(categorySelected, Alignment.MIDDLE_CENTER);
                    categoryLayout.setComponentAlignment(categoryIcon, Alignment.MIDDLE_LEFT);
                    categoryLayout.setComponentAlignment(categoryName, Alignment.MIDDLE_LEFT);
                    categoryLayout.setColumnExpandRatio(2, 5);
                    categoryLayout.setSpacing(true);

                    categoriesLayout.addComponent(categoryLayout);
                });

        categoriesPanel.setContent(categoriesLayout);
        categoriesPanel.setHeight("100%");
        categoriesPanel.setCaption(Language.get(Word.CATEGORIES));
        Language.setCustom(Word.CATEGORIES, s -> categoriesPanel.setCaption(s));

        return categoriesPanel;
    }

    private static GroupInterestProfile createEmptyProfile(Group g, String name) {
        Map<Source, Boolean> sources = new HashMap<>();
        Map<Category, Boolean> categories = new HashMap<>();
        Set<String> tags = new HashSet<>();

        SourceUtils.getSources().forEach(s -> sources.put(s, Boolean.FALSE));
        CategoryUtils.getCategories().forEach(c -> categories.put(c, Boolean.FALSE));
        return GroupUtils.createNewProfile(g, name, sources, tags, categories);
    }

    HashMap<GroupInterestProfile, VerticalLayout> includedTagsLayouts = new HashMap<>();
    HashMap<GroupInterestProfile, VerticalLayout> excludedTagsLayouts = new HashMap<>();

    public Component getTags(GroupInterestProfile profile, boolean isAdmin) {
        GridLayout allTagsLayout = new GridLayout(2, 1);
        Panel allTagsPanel = new Panel(allTagsLayout);
        allTagsPanel.setWidth("100%");
        allTagsPanel.setHeight("265px");
        allTagsPanel.setCaption(Language.get(Word.TAGS));
        Language.setCustom(Word.TAGS, s -> allTagsPanel.setCaption(s));

        VerticalLayout includedTagsLayout = new VerticalLayout();
        includedTagsLayouts.put(profile, includedTagsLayout);
        includedTagsLayout.setWidth("100%");
        includedTagsLayout.addStyleName("tags");
        Label labelIncludedTags = new Label(Language.get(Word.INCLUDE_TAGS));//Evtl only included
        Language.setCustom(Word.INCLUDE_TAGS, s -> labelIncludedTags.setValue(s));
        if (isAdmin) {
            Component addIncludeTagGroup = getAddTagGroup(profile, true);
            includedTagsLayout.addComponents(labelIncludedTags, addIncludeTagGroup);
            includedTagsLayout.setComponentAlignment(addIncludeTagGroup, Alignment.MIDDLE_CENTER);
        } else {
            includedTagsLayout.addComponents(labelIncludedTags);
        }
        includedTagsLayout.setComponentAlignment(labelIncludedTags, Alignment.MIDDLE_CENTER);

        VerticalLayout excludedTagsLayout = new VerticalLayout();
        excludedTagsLayouts.put(profile, excludedTagsLayout);
        excludedTagsLayout.setWidth("100%");
        excludedTagsLayout.addStyleName("tags");
        Label labelExcludedTags = new Label(Language.get(Word.EXCLUDE_TAGS));//Evtl only included
        Language.setCustom(Word.EXCLUDE_TAGS, s -> labelExcludedTags.setValue(s));
        if (isAdmin) {
            Component addExcludeTagGroup = getAddTagGroup(profile, false);
            excludedTagsLayout.addComponents(labelExcludedTags, addExcludeTagGroup);
            excludedTagsLayout.setComponentAlignment(addExcludeTagGroup, Alignment.MIDDLE_CENTER);
        } else {
            excludedTagsLayout.addComponents(labelExcludedTags);
        }
        excludedTagsLayout.setComponentAlignment(labelExcludedTags, Alignment.MIDDLE_CENTER);

        profile.getTags().forEach((tag, included) -> addRow(profile, included, tag, isAdmin));

        allTagsLayout.addComponents(includedTagsLayout, excludedTagsLayout);
        allTagsLayout.setWidth("100%");
        return allTagsPanel;
    }

    private Component getAddTagGroup(GroupInterestProfile profile, boolean included) {
        CssLayout newTagGroup = new CssLayout();
        newTagGroup.addStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP);

        TextField textFieldTag = new TextField();
        textFieldTag.setWidth("325px");
        textFieldTag.setMaxLength(255);
        Language.setCustom(Word.NEW_TAG, s -> textFieldTag.setPlaceholder(s));

        Button buttonAddTag = new Button(VaadinIcons.PLUS);
        buttonAddTag.addStyleName(ValoTheme.BUTTON_PRIMARY);
        buttonAddTag.setClickShortcut(ShortcutAction.KeyCode.ENTER, null);
        buttonAddTag.addClickListener(event -> {
            addRow(profile, included, textFieldTag.getValue(), true);
            profile.getTags().put(textFieldTag.getValue(), included);
            textFieldTag.clear();
        });
        textFieldTag.addFocusListener(f -> buttonAddTag.setClickShortcut(ShortcutAction.KeyCode.ENTER, null));
        textFieldTag.addBlurListener(f -> buttonAddTag.removeClickShortcut());

        newTagGroup.addComponents(textFieldTag, buttonAddTag);
        newTagGroup.setWidth("100%");
        return newTagGroup;
    }

    private void addRow(GroupInterestProfile profile, boolean included, String value, boolean isAdmin) {
        GridLayout tagLayout = new GridLayout(2, 1);
        tagLayout.setWidth("100%");

        Label labelTagName = new Label(value, ContentMode.HTML);
        labelTagName.setWidth("100%");
        labelTagName.addStyleName(ValoTheme.LABEL_H3);
        labelTagName.addStyleName(ValoTheme.LABEL_NO_MARGIN);
        tagLayout.addComponent(labelTagName);
        tagLayout.setComponentAlignment(labelTagName, Alignment.MIDDLE_LEFT);

        if (isAdmin) {
            Button buttonDeleteTag = new Button(VaadinIcons.TRASH);
            buttonDeleteTag.addStyleName(ValoTheme.BUTTON_DANGER);
            buttonDeleteTag.addClickListener(ev -> {
                profile.getTags().remove(value);
                if (included) {
                    includedTagsLayouts.get(profile).removeComponent(tagLayout);
                } else {
                    excludedTagsLayouts.get(profile).removeComponent(tagLayout);
                }
            });
            tagLayout.addComponent(buttonDeleteTag);
            tagLayout.setComponentAlignment(buttonDeleteTag, Alignment.MIDDLE_RIGHT);
        }

        tagLayout.setWidth("100%");
        tagLayout.setColumnExpandRatio(0, 5);
        tagLayout.setSpacing(true);
        tagLayout.setMargin(false);

        if (included) {
            if (isAdmin) {
                includedTagsLayouts.get(profile).addComponent(tagLayout, 2);
            } else {
                includedTagsLayouts.get(profile).addComponent(tagLayout, 1);
            }
        } else {
            if (isAdmin) {
                excludedTagsLayouts.get(profile).addComponent(tagLayout, 2);
            } else {
                excludedTagsLayouts.get(profile).addComponent(tagLayout, 1);
            }
        }
    }

}