package cz.nkp.differ.gui.components; import com.vaadin.data.Container; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.DefaultFieldFactory; import com.vaadin.ui.Field; import com.vaadin.ui.Layout; import com.vaadin.ui.Table; import com.vaadin.ui.Table.ColumnGenerator; import com.vaadin.ui.VerticalLayout; import cz.nkp.differ.DifferApplication; import cz.nkp.differ.io.ImageManager; import cz.nkp.differ.model.Image; import cz.nkp.differ.model.User; import java.util.Collections; import java.util.Set; public class UserFilesWidget extends CustomComponent { private static final long serialVersionUID = 4241885952194067796L; private static Logger LOGGER = Logger.getLogger(UserFilesWidget.class); private static int MB_UNIT = 1024 * 1024; private static List<UserFilesWidget> userFileWidgets = new ArrayList<UserFilesWidget>(); private boolean isShort = false; private Table userFilesTable; private BeanItemContainer<Image> fileContainer = null; public UserFilesWidget(boolean isShort) { this.isShort = isShort; userFileWidgets.add(this); setCompositionRoot(createUserFilesWidget()); } protected Layout createUserFilesWidget() { final User loggedUser = DifferApplication.getCurrentApplication().getLoggedUser(); VerticalLayout layout = new VerticalLayout(); DifferApplication app = (DifferApplication) DifferApplication.getCurrentApplication(); List<Image> images = DifferApplication.getImageManager().getImages(app.getLoggedUser()); fileContainer = new BeanItemContainer<Image>(Image.class, images); userFilesTable = new Table("files", fileContainer); userFilesTable.addGeneratedColumn("size", new ColumnGenerator() { @Override public Object generateCell(Table source, Object itemId, Object columnId) { final Image image = (Image) itemId; return String.format("%.2f", ((float) image.getSize()) / MB_UNIT); } }); if (isShort) { userFilesTable.setVisibleColumns(new Object[]{"fileName", "size"}); userFilesTable.setColumnHeaders(new String[]{"file", "size (MB)"}); } else { userFilesTable.setVisibleColumns(new Object[]{"fileName", "size", "shared"}); userFilesTable.setColumnHeaders(new String[]{"file", "size (MB)", "shared"}); } userFilesTable.setTableFieldFactory(new DefaultFieldFactory() { @Override public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) { Field field = super.createField(container, itemId, propertyId, uiContext); final Image image = (Image) itemId; boolean readOnly = (image.getOwnerId() != loggedUser.getId()); if (propertyId.equals("shared")) { CheckBox checkBox = new CheckBox(); checkBox.setReadOnly(readOnly); checkBox.setDescription(null); checkBox.setImmediate(true); checkBox.addListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { DifferApplication.getImageManager().updateImage(image); } }); return checkBox; } field.setHeight(1.5f, UNITS_EM); field.setReadOnly(true); return field; } }); userFilesTable.setSizeUndefined(); userFilesTable.setWidth(450, Component.UNITS_PIXELS); userFilesTable.setColumnExpandRatio("filename", 1.0f); userFilesTable.setPageLength(10); userFilesTable.setSelectable(true); userFilesTable.setImmediate(true); userFilesTable.setNullSelectionAllowed(true); userFilesTable.setMultiSelect(true); userFilesTable.setEditable(true); layout.addComponent(userFilesTable); layout.setMargin(false, true, false, true); layout.setSizeUndefined(); return layout; } public void refresh() { DifferApplication app = DifferApplication.getCurrentApplication(); List<Image> images = DifferApplication.getImageManager().getImages(app.getLoggedUser()); fileContainer.removeAllItems(); fileContainer.addAll(images); userFilesTable.setValue(Collections.emptySet()); } public int removeSelectedImages() { int count = 0; DifferApplication app = DifferApplication.getCurrentApplication(); ImageManager imageManager = DifferApplication.getImageManager(); Set<Image> selectedImages = (Set<Image>) userFilesTable.getValue(); for (Image image : selectedImages) { if (imageManager.deleteImage(app.getLoggedUser(), image)) { count++; } } return count; } public Set<Image> getSelectedImages() { return (Set<Image>) userFilesTable.getValue(); } public void addSelectionListener(ValueChangeListener listener) { userFilesTable.addListener(listener); } }