package com.constellio.app.modules.rm.ui.components.document.newFile; import static com.constellio.app.ui.i18n.i18n.$; import java.util.ArrayList; import java.util.List; import com.constellio.app.ui.framework.buttons.BaseButton; import com.constellio.app.ui.framework.components.BaseWindow; import com.constellio.app.ui.framework.components.fields.BaseTextField; import com.constellio.app.ui.handlers.OnEnterKeyHandler; import com.constellio.app.ui.util.FileIconUtils; import com.constellio.model.entities.records.Content; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.server.Resource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; public class NewFileWindowImpl extends BaseWindow implements NewFileWindow { private boolean opened; private List<NewFileCreatedListener> newFileCreatedListeners = new ArrayList<>(); private VerticalLayout mainLayout; private Label errorLabel; private ComboBox extensionField; private ComboBox templateField; private HorizontalLayout labelAndTemplateLayout; private TextField fileNameField; private Button createFileButton; private NewFilePresenter presenter; public NewFileWindowImpl() { setModal(true); setWidth("70%"); setHeight("250px"); setZIndex(null); mainLayout = new VerticalLayout(); mainLayout.setSpacing(true); mainLayout.setWidth("100%"); String title = $("NewFileWindow.title"); setCaption(title); errorLabel = new Label(); errorLabel.addStyleName("error-label"); errorLabel.setVisible(false); extensionField = new ComboBox(); extensionField.setCaption($("NewFileWindow.extension")); templateField = new ComboBox(); templateField.setCaption($("NewFileWindow.templates")); extensionField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { if (extensionField.getValue() != null) { templateField.setValue(null); } } }); templateField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { if (templateField.getValue() != null) { extensionField.setValue(null); } } }); Label label = new Label($("or")); labelAndTemplateLayout = new HorizontalLayout(label, templateField); labelAndTemplateLayout.setWidth("98%"); labelAndTemplateLayout.setSpacing(true); labelAndTemplateLayout.setComponentAlignment(label, Alignment.BOTTOM_CENTER); HorizontalLayout extensionAndTemplateLayout = new HorizontalLayout(extensionField, labelAndTemplateLayout); extensionAndTemplateLayout.setSpacing(true); fileNameField = new BaseTextField(); fileNameField.setCaption($("NewFileWindow.fileName")); fileNameField.setRequired(true); fileNameField.setWidth("98%"); OnEnterKeyHandler onEnterHandler = new OnEnterKeyHandler() { @Override public void onEnterKeyPressed() { presenter.newFileNameSubmitted(); } }; onEnterHandler.installOn(fileNameField); createFileButton = new BaseButton($("NewFileWindow.createFile")) { @Override protected void buttonClick(ClickEvent event) { presenter.newFileNameSubmitted(); } }; createFileButton.addStyleName(ValoTheme.BUTTON_PRIMARY); HorizontalLayout buttonLayout = new HorizontalLayout(); buttonLayout.setWidth("98%"); buttonLayout.addComponent(createFileButton); buttonLayout.setSpacing(true); buttonLayout.setComponentAlignment(createFileButton, Alignment.MIDDLE_CENTER); setContent(mainLayout); mainLayout.addComponents(errorLabel, extensionAndTemplateLayout, fileNameField, buttonLayout); presenter = new NewFilePresenter(this); } @Override public final String getFileName() { return fileNameField.getValue(); } @Override public final String getExtension() { return (String) extensionField.getValue(); } @Override public Content getTemplate() { return (Content) templateField.getValue(); } @Override public void showErrorMessage(String key, Object... args) { errorLabel.setVisible(true); errorLabel.setValue($(key, args)); } @Override public void setSupportedExtensions(List<String> extensions) { for (String extension : extensions) { String extensionCaption = $("NewFileWindow.supportedExtensions." + extension); extensionField.addItem(extension); extensionField.setItemCaption(extension, extensionCaption); Resource extensionIconResource = FileIconUtils.getIcon(extension); if (extensionIconResource != null) { extensionField.setItemIcon(extension, extensionIconResource); } } } @Override public void setTemplates(List<Content> templates) { if (templates.isEmpty()) { labelAndTemplateLayout.setVisible(false); } else { labelAndTemplateLayout.setVisible(true); for (Content template : templates) { templateField.addItem(template); templateField.setItemCaption(template, template.getCurrentVersion().getFilename()); } } } @Override public void addNewFileCreatedListener(NewFileCreatedListener listener) { newFileCreatedListeners.add(listener); } @Override public void removeNewFileCreatedListener(NewFileCreatedListener listener) { newFileCreatedListeners.remove(listener); } @Override public void notifyNewFileCreated(Content content) { for (NewFileCreatedListener newFileCreatedListener : newFileCreatedListeners) { newFileCreatedListener.newFileCreated(content); } } @Override public void open() { opened = true; extensionField.setValue(null); templateField.setValue(null); fileNameField.setValue(null); errorLabel.setVisible(false); extensionField.focus(); // Bugfix for windows opened twice because of ClassBasedViewProvider for (Window window : new ArrayList<>(UI.getCurrent().getWindows())) { if (window instanceof NewFileWindowImpl) { window.close(); } } UI.getCurrent().addWindow(this); } @Override public void setDocumentTypeId(String documentTypeId) { presenter.setTemplatesByDocumentTypeId(documentTypeId); } public String getDocumentTypeId() { return presenter.getDocumentTypeId(); } @Override public boolean isOpened() { return opened; } @Override public void close() { opened = false; super.close(); } }