package com.constellio.app.modules.rm.ui.pages.userDocuments; import static com.constellio.app.ui.i18n.i18n.$; import java.io.File; import java.util.List; import org.vaadin.dialogs.ConfirmDialog; import org.vaadin.easyuploads.MultiFileUpload; import com.constellio.app.modules.rm.ui.components.userDocument.DeclareUserContentContainerButton; import com.constellio.app.ui.entities.ContentVersionVO; import com.constellio.app.ui.entities.MetadataValueVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.UserDocumentVO; import com.constellio.app.ui.framework.buttons.DeleteButton; import com.constellio.app.ui.framework.components.ContentVersionDisplay; import com.constellio.app.ui.framework.components.converters.RecordIdToCaptionConverter; import com.constellio.app.ui.framework.components.fields.upload.BaseMultiFileUpload; import com.constellio.app.ui.framework.components.table.RecordVOSelectionTableAdapter; import com.constellio.app.ui.framework.components.table.RecordVOTable; import com.constellio.app.ui.framework.components.table.SelectionTableAdapter; import com.constellio.app.ui.framework.containers.ButtonsContainer; import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton; import com.constellio.app.ui.framework.containers.RecordVOLazyContainer; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.framework.items.RecordVOItem; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.data.utils.Builder; import com.constellio.model.entities.records.wrappers.UserDocument; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.AbstractSelect.ItemCaptionMode; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.DragAndDropWrapper; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; public class ListUserDocumentsViewImpl extends BaseViewImpl implements ListUserDocumentsView, DropHandler { public static final String STYLE_NAME = "user-documents"; public static final String STYLE_LAYOUT = STYLE_NAME + "-layout"; public static final String TABLE_STYLE_NAME = STYLE_NAME + "-table"; List<RecordVODataProvider> dataProviders; private DragAndDropWrapper dragAndDropWrapper; private VerticalLayout mainLayout; private MultiFileUpload multiFileUpload; private RecordVOLazyContainer userContentContainer; private ButtonsContainer<RecordVOLazyContainer> buttonsContainer; private SelectionTableAdapter userContentSelectTableAdapter; private RecordVOTable userContentTable; private Builder<ContainerButton> classifyButtonFactory; private RecordIdToCaptionConverter recordIdToCaptionConverter = new RecordIdToCaptionConverter(); private ListUserDocumentsPresenter presenter; public ListUserDocumentsViewImpl() { presenter = new ListUserDocumentsPresenter(this); } @Override protected String getTitle() { return $("ListUserDocumentsView.viewTitle"); } @Override protected Component buildMainComponent(ViewChangeEvent event) { if (classifyButtonFactory == null) { classifyButtonFactory = new Builder<ContainerButton>() { @Override public ContainerButton build() { return new DeclareUserContentContainerButton(ListUserDocumentsViewImpl.this); } }; } addStyleName(STYLE_NAME); setCaption($("UserDocumentsWindow.title")); mainLayout = new VerticalLayout(); mainLayout.addStyleName(STYLE_LAYOUT); mainLayout.setSpacing(true); multiFileUpload = new BaseMultiFileUpload() { @Override protected void handleFile(File file, String fileName, String mimeType, long length) { presenter.handleFile(file, fileName, mimeType, length); } }; multiFileUpload.setWidth("100%"); userContentContainer = new RecordVOLazyContainer(dataProviders); buttonsContainer = new ButtonsContainer<RecordVOLazyContainer>(userContentContainer); buttonsContainer.addButton(classifyButtonFactory.build()); buttonsContainer.addButton(new ContainerButton() { @Override protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) { return new DeleteButton() { @Override protected void confirmButtonClick(ConfirmDialog dialog) { RecordVO recordVO = ((RecordVOItem) buttonsContainer.getItem(itemId)).getRecord(); presenter.deleteButtonClicked(recordVO); } }; } }); userContentTable = new RecordVOTable() { @Override protected Component buildMetadataComponent(MetadataValueVO metadataValue, RecordVO recordVO) { Component metadataComponent; if (metadataValue.getMetadata().codeMatches(UserDocument.TITLE)) { metadataComponent = newCaptionComponent(recordVO); } else { metadataComponent = super.buildMetadataComponent(metadataValue, recordVO); } return metadataComponent; } @Override protected String getTitleColumnStyle(RecordVO recordVO) { String style; if (UserDocument.SCHEMA_TYPE.equals(recordVO.getSchema().getTypeCode())) { style = null; } else { style = super.getTitleColumnStyle(recordVO); } return style; } }; userContentTable.setContainerDataSource(buttonsContainer); userContentTable.setWidth("100%"); userContentTable.addStyleName(TABLE_STYLE_NAME); userContentTable.setItemCaptionMode(ItemCaptionMode.PROPERTY); userContentTable.setColumnHeader(ButtonsContainer.DEFAULT_BUTTONS_PROPERTY_ID, ""); userContentSelectTableAdapter = new RecordVOSelectionTableAdapter(userContentTable) { @Override public void selectAll() { presenter.selectAllClicked(); } @Override public void deselectAll() { presenter.deselectAllClicked(); } @Override public boolean isAllItemsSelected() { return presenter.isAllItemsSelected(); } @Override public boolean isAllItemsDeselected() { return presenter.isAllItemsDeselected(); } @Override public boolean isSelected(Object itemId) { RecordVOItem item = (RecordVOItem) buttonsContainer.getItem(itemId); RecordVO recordVO = item.getRecord(); return presenter.isSelected(recordVO); } @Override public void setSelected(Object itemId, boolean selected) { RecordVOItem item = (RecordVOItem) buttonsContainer.getItem(itemId); RecordVO recordVO = item.getRecord(); presenter.selectionChanged(recordVO, selected); adjustSelectAllButton(selected); } }; mainLayout.addComponents(multiFileUpload, userContentSelectTableAdapter); dragAndDropWrapper = new DragAndDropWrapper(mainLayout); dragAndDropWrapper.setSizeFull(); dragAndDropWrapper.setDropHandler(multiFileUpload); return dragAndDropWrapper; } @Override protected void initBeforeCreateComponents(ViewChangeEvent event) { String parameters = event != null ? event.getParameters() : null; presenter.forParams(parameters); } @Override protected boolean isFullWidthIfActionMenuAbsent() { return true; } protected Component newCaptionComponent(RecordVO recordVO) { Component captionComponent; if (recordVO instanceof UserDocumentVO) { UserDocumentVO userDocumentVO = (UserDocumentVO) recordVO; ContentVersionVO contentVersionVO = userDocumentVO.getContent(); if (contentVersionVO != null) { String filename = contentVersionVO.getFileName(); captionComponent = new ContentVersionDisplay(recordVO, contentVersionVO, filename); } else { captionComponent = new Label(""); } } else { captionComponent = new Label(recordIdToCaptionConverter.convertToPresentation(recordVO.getId(), String.class, getLocale())); } return captionComponent; } @Override public void drop(DragAndDropEvent event) { setVisible(true); multiFileUpload.drop(event); } @Override public AcceptCriterion getAcceptCriterion() { return multiFileUpload.getAcceptCriterion(); } public void setClassifyButtonFactory(Builder<ContainerButton> classifyButtonFactory) { this.classifyButtonFactory = classifyButtonFactory; } @Override public void setUserContent(List<RecordVODataProvider> dataProviders) { this.dataProviders = dataProviders; } @Override public void refresh() { for (RecordVODataProvider dataProvider : dataProviders) { dataProvider.fireDataRefreshEvent(); } } @Override protected boolean isBackgroundViewMonitor() { return true; } @Override protected void onBackgroundViewMonitor() { presenter.backgroundViewMonitor(); } }