package com.mycompany; import java.text.SimpleDateFormat; import com.mycompany.ScheduleView.MovieEvent; import com.mycompany.data.DataProvider.Movie; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptAll; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.server.ExternalResource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.DragAndDropWrapper; import com.vaadin.ui.DragAndDropWrapper.DragStartMode; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Image; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class MovieDetailsWindow extends Window { Label synopsis = new Label(); public MovieDetailsWindow(Movie movie, MovieEvent event) { VerticalLayout l = new VerticalLayout(); l.setSpacing(true); setCaption(movie.title); setContent(l); center(); setCloseShortcut(KeyCode.ESCAPE, null); setResizable(false); setClosable(false); addStyleName("no-vertical-drag-hints"); addStyleName("no-horizontal-drag-hints"); HorizontalLayout details = new HorizontalLayout(); details.setSpacing(true); details.setMargin(true); l.addComponent(details); final Image coverImage = new Image("", new ExternalResource( movie.posterUrl)); final Button more = new Button("More…"); DragAndDropWrapper cover = new DragAndDropWrapper(coverImage); cover.setDragStartMode(DragStartMode.NONE); cover.setWidth("200px"); cover.setHeight("270px"); cover.addStyleName("cover"); cover.setDropHandler(new DropHandler() { @Override public void drop(DragAndDropEvent event) { DragAndDropWrapper d = (DragAndDropWrapper) event .getTransferable().getSourceComponent(); if (d == event.getTargetDetails().getTarget()) return; Movie m = (Movie) d.getData(); coverImage.setSource(new ExternalResource(m.posterUrl)); coverImage.setAlternateText(m.title); setCaption(m.title); updateSynopsis(m, false); more.setVisible(true); } @Override public AcceptCriterion getAcceptCriterion() { return AcceptAll.get(); } }); details.addComponent(cover); FormLayout fields = new FormLayout(); fields.setWidth("35em"); fields.setSpacing(true); fields.setMargin(true); details.addComponent(fields); Label label; if (event != null) { SimpleDateFormat df = new SimpleDateFormat(); df.applyPattern("dd-mm-yyyy"); label = new Label(df.format(event.start)); label.setSizeUndefined(); label.setCaption("Date"); fields.addComponent(label); df.applyPattern("hh:mm a"); label = new Label(df.format(event.start)); label.setSizeUndefined(); label.setCaption("Starts"); fields.addComponent(label); label = new Label(df.format(event.end)); label.setSizeUndefined(); label.setCaption("Ends"); fields.addComponent(label); } label = new Label(movie.duration + " minutes"); label.setSizeUndefined(); label.setCaption("Duration"); fields.addComponent(label); synopsis.setData(movie.synopsis); synopsis.setCaption("Synopsis"); updateSynopsis(movie, false); fields.addComponent(synopsis); more.addStyleName("link"); fields.addComponent(more); more.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { updateSynopsis(null, true); event.getButton().setVisible(false); } }); HorizontalLayout footer = new HorizontalLayout(); footer.addStyleName("footer"); footer.setWidth("100%"); footer.setMargin(true); Button ok = new Button("Close"); ok.addStyleName("wide"); ok.addStyleName("default"); ok.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { close(); } }); footer.addComponent(ok); footer.setComponentAlignment(ok, Alignment.TOP_RIGHT); l.addComponent(footer); } public void updateSynopsis(Movie m, boolean expand) { String synopsisText = synopsis.getData().toString(); if (m != null) { synopsisText = m.synopsis; synopsis.setData(m.synopsis); } if (!expand) { synopsisText = synopsisText.length() > 300 ? synopsisText .substring(0, 300) + "…" : synopsisText; } synopsis.setValue(synopsisText); } }