Java tutorial
/* * 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; } }