package com.constellio.app.ui.pages.management.valueDomains;
import static com.constellio.app.ui.i18n.i18n.$;
import com.constellio.app.ui.entities.MetadataSchemaTypeVO;
import com.constellio.app.ui.framework.buttons.AddButton;
import com.constellio.app.ui.framework.buttons.BaseButton;
import com.constellio.app.ui.framework.buttons.DisplayButton;
import com.constellio.app.ui.framework.buttons.EditButton;
import com.constellio.app.ui.framework.buttons.WindowButton;
import com.constellio.app.ui.framework.buttons.WindowButton.WindowConfiguration;
import com.constellio.app.ui.framework.components.fields.BaseTextField;
import com.constellio.app.ui.framework.containers.ButtonsContainer;
import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
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.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
public class ListValueDomainViewImpl extends BaseViewImpl implements ListValueDomainView {
private final ListValueDomainPresenter presenter;
private VerticalLayout layout;
private Table domainValues;
public ListValueDomainViewImpl() {
presenter = new ListValueDomainPresenter(this);
}
@Override
protected String getTitle() {
return $("ListValueDomainView.viewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
domainValues = buildTable();
layout = new VerticalLayout(buildCreationComponent(), domainValues);
layout.setSpacing(true);
layout.setWidth("100%");
return layout;
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
@Override
public void refreshTable() {
Table table = buildTable();
layout.replaceComponent(domainValues, table);
domainValues = table;
}
private Component buildCreationComponent() {
final TextField valueDomain = new BaseTextField();
valueDomain.setImmediate(true);
final Button create = new AddButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.valueDomainCreationRequested(valueDomain.getValue());
this.setEnabled(false);
}
};
create.setEnabled(false);
valueDomain.addTextChangeListener(new TextChangeListener() {
@Override
public void textChange(TextChangeEvent event) {
if (presenter.canCreate(event.getText())) {
create.setEnabled(true);
} else {
create.setEnabled(false);
}
}
});
HorizontalLayout creation = new HorizontalLayout(valueDomain, create);
creation.setSpacing(true);
return creation;
}
private Table buildTable() {
BeanItemContainer elements = new BeanItemContainer<>(
MetadataSchemaTypeVO.class, presenter.getDomainValues());
ButtonsContainer container = new ButtonsContainer<>(elements, "buttons");
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.displayButtonClicked((MetadataSchemaTypeVO) itemId);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
WindowButton editButton = new WindowButton(
$("edit"), $("ListValueDomainView.labelColumn"), WindowConfiguration.modalDialog("400px", "150px")) {
@Override
protected Component buildWindowContent() {
final MetadataSchemaTypeVO typeVO = (MetadataSchemaTypeVO) itemId;
Label caption = new Label($("ListValueDomainView.labelColumn"));
caption.addStyleName(ValoTheme.LABEL_BOLD);
final BaseTextField title = new BaseTextField();
title.setValue(typeVO.getLabel());
title.setWidth("250px");
BaseButton save = new BaseButton("Save") {
@Override
protected void buttonClick(ClickEvent event) {
presenter.editButtonClicked(typeVO, title.getValue());
getWindow().close();
}
};
save.addStyleName(ValoTheme.BUTTON_PRIMARY);
HorizontalLayout line = new HorizontalLayout(caption, title);
line.setComponentAlignment(caption, Alignment.MIDDLE_LEFT);
line.setSizeUndefined();
line.setSpacing(true);
VerticalLayout window = new VerticalLayout(line, save);
window.setComponentAlignment(save, Alignment.MIDDLE_CENTER);
window.setSpacing(true);
return window;
}
};
editButton.setIcon(EditButton.ICON_RESOURCE);
editButton.addStyleName(ValoTheme.BUTTON_ICON_ONLY);
editButton.addStyleName(ValoTheme.BUTTON_BORDERLESS);
editButton.setIconAlternateText(editButton.getCaption());
return editButton;
}
});
Table table = new Table($("ListValueDomainView.tableTitle", container.size()), container);
table.setPageLength(Math.min(15, container.size()));
table.setVisibleColumns("label", "buttons");
table.setColumnHeader("label", $("ListValueDomainView.labelColumn"));
table.setColumnHeader("buttons", "");
table.setColumnWidth("buttons", 88);
table.setWidth("100%");
return table;
}
}