ru.fly.client.ui.field.datefield.DatePickerField.java Source code

Java tutorial

Introduction

Here is the source code for ru.fly.client.ui.field.datefield.DatePickerField.java

Source

/*
 * Copyright 2015 Valeriy Filatov.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package ru.fly.client.ui.field.datefield;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.*;
import com.google.gwt.user.client.ui.RootPanel;
import ru.fly.client.event.ChangeEvent;
import ru.fly.client.ui.FElement;
import ru.fly.client.ui.field.TriggerField;

import java.util.Date;

/**
 * User: fil
 * Date: 06.08.13
 * Time: 23:05
 */
public class DatePickerField extends TriggerField<Date> {

    private final DateFieldDecor decor = GWT.create(DateFieldDecor.class);

    private FDatePicker datePicker;
    private DateTimeFormat format;

    public DatePickerField() {
        this(DateTimeFormat.getFormat("dd.MM.yyyy"));
    }

    public DatePickerField(DateTimeFormat format) {
        this.format = format;
        addStyleName(decor.css().dateField());
        setWidth(100);
    }

    @Override
    public void onAfterFirstAttach() {
        super.onAfterFirstAttach();
        view.addClassName(decor.css().dateFieldView());
        DOM.setEventListener(view, new EventListener() {
            @Override
            public void onBrowserEvent(Event event) {
                expander.expandCollapse();
            }
        });
        DOM.sinkEvents(view, Event.ONCLICK);
    }

    @Override
    protected FElement buildTriggerElement() {
        FElement ret = DOM.createDiv().cast();
        ret.addClassName(decor.css().dateFieldTrigger());
        FElement trIcon = DOM.createDiv().cast();
        ret.appendChild(trIcon);
        trIcon.setClassName(decor.css().dateFieldTriggerIcon());
        return ret;
    }

    @Override
    protected FElement getExpandedElement() {
        return getDatePicker().getElement().cast();
    }

    protected void onExpand() {
        int left = getAbsoluteLeft() + getWidth() - 130;
        int wndViewHeight = Window.getClientHeight() + Window.getScrollTop();
        getDatePicker().getElement().getStyle().setPosition(Style.Position.ABSOLUTE);
        getDatePicker().getElement().getStyle().setZIndex(10000);
        RootPanel.get().add(getDatePicker());
        if (getElement().getAbsoluteTop() + getHeight() + 170 > wndViewHeight) {
            ((FElement) getDatePicker().getElement()).setPosition(left, getAbsoluteTop() - 170);
        } else {
            ((FElement) getDatePicker().getElement()).setPosition(left, getAbsoluteTop() + getHeight() + 2);
        }
        getDatePicker().setValue(getValue());
    }

    private FDatePicker getDatePicker() {
        if (datePicker == null) {
            datePicker = new FDatePicker() {

            };
            datePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
                @Override
                public void onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent<Date> event) {
                    DatePickerField.this.setValue(datePicker.getValue());
                    expander.collapse();
                }
            });
        }
        return datePicker;
    }

    protected void onCollapse() {
        RootPanel.get().remove(getDatePicker());
    }

    @Override
    public void setValue(Date value) {
        Date old = getValue();
        super.setValue(value);
        if (view != null) {
            if (value == null)
                view.setInnerHTML("");
            else
                view.setInnerHTML(format.format(value));
        }
        if ((old != null && !old.equals(value)) || (value != null && !value.equals(old))) {
            fireEvent(new ChangeEvent<Date>(value));
        }
    }

}