//package pt.ist.vaadinframework.ui.fields;
//
//import java.io.Serializable;
//import java.util.Arrays;
//import java.util.EventObject;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Map.Entry;
//import java.util.ResourceBundle;
//import java.util.Set;
//
//import org.apache.commons.lang.StringUtils;
//
//import pt.ist.fenixWebFramework.services.Service;
//import pt.ist.vaadinframework.ui.TransactionalForm;
//import pt.ist.vaadinframework.ui.layout.ControlsLayout;
//
//import com.vaadin.data.Container;
//import com.vaadin.data.Container.ItemSetChangeEvent;
//import com.vaadin.data.Container.ItemSetChangeListener;
//import com.vaadin.data.Item;
//import com.vaadin.data.Property;
//import com.vaadin.data.util.DomainContainer;
//import com.vaadin.data.util.DomainItem;
//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.CustomField;
//import com.vaadin.ui.FormFieldFactory;
//import com.vaadin.ui.HorizontalLayout;
//import com.vaadin.ui.Table;
//import com.vaadin.ui.Table.ColumnGenerator;
//import com.vaadin.ui.TableFieldFactory;
//import com.vaadin.ui.VerticalLayout;
//import com.vaadin.ui.Window;
//import com.vaadin.ui.themes.BaseTheme;
//
//public class TableContainerEditor extends CustomField {
// public static class CreateRequestEvent extends EventObject {
// public CreateRequestEvent(DomainContainer container) {
// super(container);
// }
//
// public DomainContainer getContainer() {
// return (DomainContainer) super.getSource();
// }
// }
//
// public interface CreateRequestListener extends Serializable {
// public void creationRequest(CreateRequestEvent event);
// }
//
// public static class GeneratedColumnActionEvent implements Serializable {
// private final Table source;
// private final Object itemId;
// private final Object columnId;
//
// public GeneratedColumnActionEvent(Table source, Object itemId, Object columnId) {
// this.source = source;
// this.itemId = itemId;
// this.columnId = columnId;
// }
//
// public Table getSource() {
// return source;
// }
//
// public Object getItemId() {
// return itemId;
// }
//
// public Object getColumnId() {
// return columnId;
// }
// }
//
// public interface GeneratedColumnActionListener extends Serializable {
// public void generatedColumnClick(GeneratedColumnActionEvent event);
// }
//
// public class ElementEditOrCreateWindow extends Window {
// public ElementEditOrCreateWindow(String caption, Item item) {
// super(caption);
// getContent().setSizeUndefined();
// TransactionalForm form = new TransactionalForm(bundle);
// form.setWriteThrough(false);
// form.setFormFieldFactory((FormFieldFactory) table.getTableFieldFactory());
// form.setItemDataSource(item, Arrays.asList(properties));
// form.addSubmitButton();
// form.addClearButton();
// form.addCancelButton();
// addComponent(form);
// center();
// }
// }
//
// private final Table table;
//
// private final ControlsLayout buttons;
//
// private Map<String, GeneratedColumnActionListener> generatedColumnListeners;
//
// private final String[] properties;
//
// private final ResourceBundle bundle;
//
// public TableContainerEditor(ResourceBundle bundle, String... properties) {
// this.bundle = bundle;
// this.properties = properties;
// VerticalLayout layout = new VerticalLayout();
// table = new Table();
// layout.addComponent(table);
// table.setPageLength(0);
// table.setSizeFull();
// table.setVisible(table.getContainerDataSource().size() != 0);
// table.addListener(new ItemSetChangeListener() {
// @Override
// public void containerItemSetChange(ItemSetChangeEvent event) {
// table.setValue(event.getContainer().size() != 0);
// }
// });
// buttons = new ControlsLayout();
// layout.addComponent(buttons);
// setCompositionRoot(layout);
// }
//
// @Override
// public void attach() {
// super.attach();
// refreshGeneratedColumn();
// }
//
// public void addCreatorButton(String caption, final CreateRequestListener listener) {
// Button creator = new Button(caption);
// buttons.addComponent(creator);
// creator.addListener(new ClickListener() {
// public void buttonClick(ClickEvent event) {
// listener.creationRequest(new CreateRequestEvent((DomainContainer) getPropertyDataSource()));
// }
// });
// }
//
// public void addCreatorButton(final String caption) {
// addCreatorButton(caption, new CreateRequestListener() {
// public void creationRequest(CreateRequestEvent event) {
// DomainItem item = (DomainItem) event.getContainer().addItem();
// getApplication().getMainWindow().addWindow(new ElementEditOrCreateWindow(caption, item));
// }
// });
// }
//
// public void addGeneratedButton(String caption, GeneratedColumnActionListener listener) {
// if (generatedColumnListeners == null) {
// generatedColumnListeners = new HashMap<String, GeneratedColumnActionListener>();
// }
// generatedColumnListeners.put(caption, listener);
// if (table.removeGeneratedColumn(StringUtils.EMPTY)) {
// refreshGeneratedColumn();
// }
// }
//
// public void addEditButton(final String caption) {
// addGeneratedButton(caption, new GeneratedColumnActionListener() {
// @Override
// public void generatedColumnClick(GeneratedColumnActionEvent event) {
// Item item = event.getSource().getContainerDataSource().getItem(event.getItemId());
// getApplication().getMainWindow().addWindow(new ElementEditOrCreateWindow(caption, item));
// }
// });
// }
//
// public void addDeleteButton(final String caption) {
// addGeneratedButton(caption, new GeneratedColumnActionListener() {
// @Override
// public void generatedColumnClick(GeneratedColumnActionEvent event) {
// deleteElement(event.getSource().getContainerDataSource(), event.getItemId());
// }
// });
// }
//
// @Service
// private static void deleteElement(Container container, Object itemId) {
// // FIXME: side effects on remove wont work on service restart
// container.removeItem(itemId);
// }
//
// private void refreshGeneratedColumn() {
// if (generatedColumnListeners != null && !generatedColumnListeners.isEmpty()) {
// table.addGeneratedColumn(StringUtils.EMPTY, new ColumnGenerator() {
// public Component generateCell(Table source, Object itemId, Object columnId) {
// HorizontalLayout actions = new HorizontalLayout();
// actions.setSpacing(true);
// final GeneratedColumnActionEvent columnEvent = new GeneratedColumnActionEvent(source, itemId, columnId);
// for (final Entry<String, GeneratedColumnActionListener> column : generatedColumnListeners.entrySet()) {
// Button action = new Button(column.getKey());
// actions.addComponent(action);
// action.addStyleName(BaseTheme.BUTTON_LINK);
// action.addListener(new ClickListener() {
// public void buttonClick(ClickEvent event) {
// column.getValue().generatedColumnClick(columnEvent);
// }
// });
// }
// return actions;
// }
// });
// }
// }
//
// public void setEditable(boolean editable) {
// table.setEditable(editable);
// }
//
// public void setTableFieldFactory(TableFieldFactory fieldFactory) {
// table.setTableFieldFactory(fieldFactory);
// }
//
// @Override
// public void setPropertyDataSource(Property newDataSource) {
// if (newDataSource instanceof DomainContainer) {
// DomainContainer container = (DomainContainer) newDataSource;
// container.setContainerProperties(properties);
// super.setPropertyDataSource(newDataSource);
// table.setContainerDataSource(container);
// // i'd prefer that a table listener would handle this automatically
// table.setVisible(table.getContainerDataSource().size() != 0);
// } else {
// throw new UnsupportedOperationException();
// }
// }
//
// @Override
// public Class<?> getType() {
// return Set.class;
// }
// }