package com.vaadin.tests.components.datefield;

import java.util.Date;

import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItem;
import com.vaadin.tests.components.AbstractTestCase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.DateField;
import com.vaadin.ui.DefaultFieldFactory;
import com.vaadin.ui.Field;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class DateFieldInSubWindow extends AbstractTestCase {

    @SuppressWarnings("serial")
    public class TestCaseWindow extends Window {

        public class MyBean {
            private Date myDate;
            private String myString;

            public Date getMyDate() {
                return myDate;
            }

            public void setMyDate(Date myDate) {
                this.myDate = myDate;
            }

            public String getMyString() {
                return myString;
            }

            public void setMyString(String myString) {
                this.myString = myString;
            }

        }

        private MyBean myBean;

        public TestCaseWindow() {
            super("Test Case Window");
            setModal(true);
            setWidth("400px");
            myBean = new MyBean();

            initWindow();
        }

        protected class CustomerFieldFactory extends DefaultFieldFactory {

            public static final String COMMON_FIELD_WIDTH = "12em";

            @Override
            public Field createField(Item item, Object propertyId,
                    Component uiContext) {
                Field f = super.createField(item, propertyId, uiContext);

                if ("myDate".equals(propertyId)) {
                    ((DateField) f).setResolution(DateField.RESOLUTION_MIN);
                    ((DateField) f).setCaption("This is my date");

                }

                return f;
            }
        }

        protected void initWindow() {
            VerticalLayout layout = (VerticalLayout) getContent();
            layout.setMargin(true);
            layout.setSpacing(true);

            /**
             * This causes the window to add the .v-readonly style!
             */
            setClosable(false);

            CustomerFieldFactory fieldFactory = new CustomerFieldFactory();
            final Form generalForm = new Form();
            {
                generalForm.setCaption("My form");
                generalForm.setWriteThrough(true);
                generalForm.setFormFieldFactory(fieldFactory);

                BeanItem<MyBean> myBeanItem = new BeanItem<MyBean>(myBean);
                generalForm.setItemDataSource(myBeanItem);

                generalForm.setVisibleItemProperties(new String[] { "myDate",
                        "myString" });
                generalForm.setValidationVisible(true);
                addComponent(generalForm);
            }

            HorizontalLayout buttons = new HorizontalLayout();
            {
                buttons.setSpacing(true);

                Button b = new Button("Close", new Button.ClickListener() {

                    public void buttonClick(ClickEvent event) {
                        (getParent()).removeWindow(TestCaseWindow.this);
                    }
                });
                buttons.addComponent(b);
                layout.addComponent(buttons);

            }
        }
    }

    @Override
    public void init() {
        Window mainWindow = new Window();
        setMainWindow(mainWindow);
        Button open = new Button("Open window", new Button.ClickListener() {
            public void buttonClick(ClickEvent event) {
                getMainWindow().addWindow(new TestCaseWindow());
            }
        });

        mainWindow.addComponent(open);
    }

    @Override
    protected String getDescription() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Integer getTicketNumber() {
        return 4582;
    }

}
