dhbw.clippinggorilla.userinterface.views.ClippingView.java Source code

Java tutorial

Introduction

Here is the source code for dhbw.clippinggorilla.userinterface.views.ClippingView.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.views;

import com.vaadin.icons.VaadinIcons;
import com.vaadin.server.ExternalResource;
import com.vaadin.server.Page;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
import dhbw.clippinggorilla.ClippingGorillaUI;
import dhbw.clippinggorilla.objects.article.Article;
import dhbw.clippinggorilla.objects.clipping.Clipping;
import dhbw.clippinggorilla.objects.clipping.ClippingUtils;
import dhbw.clippinggorilla.objects.source.Source;
import dhbw.clippinggorilla.objects.user.User;
import dhbw.clippinggorilla.objects.user.UserUtils;
import dhbw.clippinggorilla.utilities.language.Language;
import dhbw.clippinggorilla.utilities.language.Word;
import dhbw.clippinggorilla.utilities.log.Log;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.EnumSet;

/**
 * This is the class for the Clipping view
 *
 * @author frank
 */
public class ClippingView extends VerticalLayout {

    public static Component getCurrent() {
        return new ClippingView(UserUtils.getCurrent().getLastClipping());
    }

    public enum SortOptions {
        BYPROFILE(Word.PROFILE, VaadinIcons.USER), BYDATE(Word.DATE,
                VaadinIcons.CALENDAR_CLOCK), BYSOURCE(Word.SOURCE, VaadinIcons.NEWSPAPER);

        Word word;
        VaadinIcons icon;

        private SortOptions(Word word, VaadinIcons icon) {
            this.word = word;
            this.icon = icon;
        }

        public String getName() {
            return Language.get(word);
        }

        public VaadinIcons getIcon() {
            return icon;
        }
    }

    VerticalLayout clippingArticlesLayout;

    public ClippingView(Clipping clipping) {
        User user = UserUtils.getCurrent();

        clippingArticlesLayout = new VerticalLayout();
        clippingArticlesLayout.setSpacing(true);
        clippingArticlesLayout.setMargin(false);
        clippingArticlesLayout.setSizeFull();

        HorizontalLayout clippingOptionsLayout = new HorizontalLayout();
        clippingOptionsLayout.setSpacing(true);
        clippingOptionsLayout.setMargin(false);
        clippingOptionsLayout.setWidth("100%");

        ComboBox<SortOptions> comboBoxSortOptions = new ComboBox<>(Language.get(Word.SORT_BY));
        Language.setCustom(Word.SORT_BY, s -> {
            comboBoxSortOptions.setCaption(s);
            comboBoxSortOptions.getDataProvider().refreshAll();
        });
        comboBoxSortOptions.setItems(EnumSet.allOf(SortOptions.class));
        comboBoxSortOptions.setItemCaptionGenerator(s -> s.getName());
        comboBoxSortOptions.setItemIconGenerator(s -> s.getIcon());
        comboBoxSortOptions.setValue(SortOptions.BYPROFILE);
        comboBoxSortOptions.setTextInputAllowed(false);
        comboBoxSortOptions.setEmptySelectionAllowed(false);
        comboBoxSortOptions.addStyleName("comboboxsort");
        comboBoxSortOptions.addValueChangeListener(e -> {
            switch (e.getValue()) {
            case BYDATE:
                createClippingViewByDate(clipping);
                break;
            case BYPROFILE:
                createClippingViewByProfile(clipping);
                break;
            case BYSOURCE:
                createClippingViewBySource(clipping);
                break;
            }
        });

        Button buttonRegenerateClipping = new Button(VaadinIcons.REFRESH);
        buttonRegenerateClipping.addStyleName(ValoTheme.BUTTON_PRIMARY);
        buttonRegenerateClipping.addClickListener(ce -> {
            user.setLastClipping(ClippingUtils.generateClipping(user, false));
            ClippingGorillaUI.getCurrent().setMainContent(ClippingView.getCurrent());
        });

        clippingOptionsLayout.addComponents(comboBoxSortOptions, buttonRegenerateClipping);
        clippingOptionsLayout.setExpandRatio(comboBoxSortOptions, 5);
        clippingOptionsLayout.setComponentAlignment(buttonRegenerateClipping, Alignment.BOTTOM_CENTER);

        addComponents(clippingOptionsLayout, clippingArticlesLayout);

        createClippingViewByProfile(clipping);
        if (clipping.getArticles().keySet().isEmpty() && clipping.getArticlesFromGroup().keySet().isEmpty()) {
            Label labelNoProfile = new Label();
            Language.setCustom(Word.NO_PROFILE_PRESENT, s -> labelNoProfile.setValue(s));
            labelNoProfile.addStyleName(ValoTheme.LABEL_H2);
            clippingArticlesLayout.addComponent(labelNoProfile);
        }
    }

    public void createClippingViewByProfile(Clipping clipping) {
        clippingArticlesLayout.removeAllComponents();
        clipping.getArticles().entrySet().stream().forEach(p -> {
            VerticalLayout layoutProfile = new VerticalLayout();
            layoutProfile.setSpacing(true);
            layoutProfile.setMargin(true);
            layoutProfile.addStyleName("tags");
            layoutProfile.setWidth("100%");
            if (p.getValue().isEmpty()) {
                Label labelNoArticles = new Label();
                Language.setCustom(Word.NO_ARTICLES_PRESENT, s -> labelNoArticles.setValue(s));
                labelNoArticles.addStyleName(ValoTheme.LABEL_H3);
                layoutProfile.addComponent(labelNoArticles);
            } else {
                p.getValue().forEach(a -> layoutProfile.addComponent(createClippingRow(a)));
            }
            Panel panelProfile = new Panel(p.getKey().getName(), layoutProfile);
            clippingArticlesLayout.addComponent(panelProfile);
        });
        clipping.getArticlesFromGroup().entrySet().stream().forEach(p -> {
            VerticalLayout layoutProfile = new VerticalLayout();
            layoutProfile.setSpacing(true);
            layoutProfile.setMargin(true);
            layoutProfile.addStyleName("tags");
            layoutProfile.setWidth("100%");
            if (p.getValue().isEmpty()) {
                Label labelNoArticles = new Label();
                Language.setCustom(Word.NO_ARTICLES_PRESENT, s -> labelNoArticles.setValue(s));
                labelNoArticles.addStyleName(ValoTheme.LABEL_H3);
                layoutProfile.addComponent(labelNoArticles);
            } else {
                p.getValue().forEach(a -> layoutProfile.addComponent(createClippingRow(a)));
            }
            Panel panelProfile = new Panel(
                    Language.get(Word.GROUP) + " " + p.getKey().getGroup().getName() + ": " + p.getKey().getName(),
                    layoutProfile);
            Language.setCustom(Word.GROUP, s -> panelProfile
                    .setCaption(s + " " + p.getKey().getGroup().getName() + ": " + p.getKey().getName()));
            clippingArticlesLayout.addComponent(panelProfile);
        });
    }

    public void createClippingViewByDate(Clipping clipping) {
        clippingArticlesLayout.removeAllComponents();
        if (ClippingUtils.isEmpty(clipping)) {
            Label labelNoArticles = new Label();
            Language.setCustom(Word.NO_ARTICLES_PRESENT, s -> labelNoArticles.setValue(s));
            labelNoArticles.addStyleName(ValoTheme.LABEL_H3);
            clippingArticlesLayout.addComponent(labelNoArticles);
        }
        clipping.getArticles().entrySet().stream().flatMap(e -> e.getValue().stream()).sorted(
                (a1, a2) -> (-1) * a1.getPublishedAtAsLocalDateTime().compareTo(a2.getPublishedAtAsLocalDateTime()))
                .forEach(a -> clippingArticlesLayout.addComponent(createClippingRow(a)));
        clipping.getArticlesFromGroup().entrySet().stream().flatMap(e -> e.getValue().stream()).sorted(
                (a1, a2) -> (-1) * a1.getPublishedAtAsLocalDateTime().compareTo(a2.getPublishedAtAsLocalDateTime()))
                .forEach(a -> clippingArticlesLayout.addComponent(createClippingRow(a)));
    }

    public void createClippingViewBySource(Clipping clipping) {
        clippingArticlesLayout.removeAllComponents();
        if (ClippingUtils.isEmpty(clipping)) {
            Label labelNoArticles = new Label();
            Language.setCustom(Word.NO_ARTICLES_PRESENT, s -> labelNoArticles.setValue(s));
            labelNoArticles.addStyleName(ValoTheme.LABEL_H3);
            clippingArticlesLayout.addComponent(labelNoArticles);
        }
        clipping.getArticles().entrySet().stream().flatMap(e -> e.getValue().stream()).sorted(
                (a1, a2) -> a1.getSourceAsSource().getName().compareToIgnoreCase(a2.getSourceAsSource().getName()))
                .forEach(a -> clippingArticlesLayout.addComponent(createClippingRow(a)));
        clipping.getArticlesFromGroup().entrySet().stream().flatMap(e -> e.getValue().stream()).sorted(
                (a1, a2) -> a1.getSourceAsSource().getName().compareToIgnoreCase(a2.getSourceAsSource().getName()))
                .forEach(a -> clippingArticlesLayout.addComponent(createClippingRow(a)));
    }

    public Component createClippingRow(Article a) {
        Image imageNewsImage = new Image();
        String url = a.getUrlToImage();
        if (url == null || url.isEmpty()) {
            url = a.getSourceAsSource().getLogo().toExternalForm();
        }
        imageNewsImage.setSource(new ExternalResource(url));
        imageNewsImage.addStyleName("articleimage");

        VerticalLayout layoutNewsImage = new VerticalLayout(imageNewsImage);
        layoutNewsImage.setMargin(false);
        layoutNewsImage.setSpacing(false);
        layoutNewsImage.setWidth("200px");
        layoutNewsImage.setHeight("150px");
        layoutNewsImage.setComponentAlignment(imageNewsImage, Alignment.MIDDLE_CENTER);

        Label labelHeadLine = new Label(a.getTitle(), ContentMode.HTML);
        labelHeadLine.addStyleName(ValoTheme.LABEL_H2);
        labelHeadLine.addStyleName(ValoTheme.LABEL_NO_MARGIN);
        labelHeadLine.setWidth("100%");

        Label labelDescription = new Label(a.getDescription(), ContentMode.HTML);
        labelDescription.setWidth("100%");

        Image imageSource = new Image();
        Source s = a.getSourceAsSource();
        URL logo = null;
        if (s != null) {
            logo = s.getLogo();
        } else {
            Log.error("Source is null: " + a.getSource());
            return new Label("INTERNAL ERROR");
        }
        if (logo != null) {
            imageSource.setSource(new ExternalResource(logo));
        } else {
            Log.error("Sourcelogo is null: " + s.getName());
        }
        imageSource.setHeight("30px");
        Label labelSource = new Label(a.getSourceAsSource().getName());
        labelSource.addStyleName(ValoTheme.LABEL_SMALL);

        LocalDateTime time = a.getPublishedAtAsLocalDateTime();
        DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
        formatter.withZone(ZoneId.of("Europe/Berlin"));
        Label labelDate = new Label(time.format(formatter));
        labelDate.addStyleName(ValoTheme.LABEL_SMALL);

        Label labelAuthor = new Label();
        labelAuthor.addStyleName(ValoTheme.LABEL_SMALL);
        labelAuthor.setWidth("100%");
        if (a.getAuthor() != null && !a.getAuthor().isEmpty()) {
            labelAuthor.setValue(a.getAuthor());
        }

        Button openWebsite = new Button(VaadinIcons.EXTERNAL_LINK);
        openWebsite.addClickListener(e -> UI.getCurrent().getPage().open(a.getUrl(), "_blank", false));

        HorizontalLayout layoutArticleOptions = new HorizontalLayout();
        layoutArticleOptions.setWidth("100%");
        layoutArticleOptions.addComponents(imageSource, labelSource, labelDate, labelAuthor, openWebsite);
        layoutArticleOptions.setComponentAlignment(imageSource, Alignment.MIDDLE_CENTER);
        layoutArticleOptions.setComponentAlignment(labelSource, Alignment.MIDDLE_CENTER);
        layoutArticleOptions.setComponentAlignment(labelDate, Alignment.MIDDLE_CENTER);
        layoutArticleOptions.setComponentAlignment(labelAuthor, Alignment.MIDDLE_LEFT);
        layoutArticleOptions.setComponentAlignment(openWebsite, Alignment.MIDDLE_CENTER);
        layoutArticleOptions.setExpandRatio(labelAuthor, 5);

        VerticalLayout layoutNewsText = new VerticalLayout(labelHeadLine, labelDescription, layoutArticleOptions);
        layoutNewsText.setMargin(false);
        layoutNewsText.setWidth("100%");

        HorizontalLayout layoutClipping = new HorizontalLayout();
        layoutClipping.setWidth("100%");
        layoutClipping.setMargin(true);
        layoutClipping.addComponents(layoutNewsImage, layoutNewsText);
        layoutClipping.setComponentAlignment(layoutNewsImage, Alignment.MIDDLE_CENTER);
        layoutClipping.setExpandRatio(layoutNewsText, 5);
        layoutClipping.addStyleName(ValoTheme.LAYOUT_CARD);
        layoutClipping.addStyleName("tags");
        return layoutClipping;
    }

}