com.googlecode.mgwt.ui.client.widget.input.search.MSearchBox.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.mgwt.ui.client.widget.input.search.MSearchBox.java

Source

/*
 * Copyright 2010 Daniel Kurka
 *
 * 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 com.googlecode.mgwt.ui.client.widget.input.search;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiFactory;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
import com.google.gwt.user.client.ui.HasName;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.TextBox;

import com.googlecode.mgwt.dom.client.event.tap.TapEvent;
import com.googlecode.mgwt.dom.client.event.tap.TapHandler;
import com.googlecode.mgwt.ui.client.MGWT;
import com.googlecode.mgwt.ui.client.widget.base.HasPlaceHolder;
import com.googlecode.mgwt.ui.client.widget.button.ButtonBase;

/**
 * A search widget
 *
 * @author Daniel Kurka Date: 30.05.2010
 */
public class MSearchBox extends Composite implements HasText, HasName, HasValue<String>, HasPlaceHolder {

    public static class MSearchBoxButton extends ButtonBase {
        public MSearchBoxButton() {
            this(DEFAULT_APPEARANCE);
        }

        public MSearchBoxButton(MSearchBoxAppearance appearance) {
            super(appearance);
            setElement(appearance.uiBinder().createAndBindUi(this));
        }
    }

    private class SearchBoxChangeHandler implements KeyUpHandler {

        @Override
        public void onKeyUp(KeyUpEvent event) {
            if (!MGWT.getFormFactor().isDesktop()) {
                if (textBox.getValue().length() > 0) {
                    clearButton.setVisible(true);
                } else {
                    clearButton.setVisible(false);
                }
            }
        }
    }

    private static final MSearchBoxAppearance DEFAULT_APPEARANCE = GWT.create(MSearchBoxAppearance.class);

    @UiField
    public TextBox textBox;

    @UiField
    public ButtonBase clearButton;

    @UiField
    public FormPanel form;

    private HandlerRegistration clearButtonHandler;
    private HandlerRegistration boxHandler;
    private MSearchBoxAppearance appearance;

    public MSearchBox() {
        this(DEFAULT_APPEARANCE);
    }

    public MSearchBox(MSearchBoxAppearance appearance) {
        this.appearance = appearance;
        initWidget(this.appearance.uiBinderBox().createAndBindUi(this));

        form.addSubmitHandler(new SubmitHandler() {
            @Override
            public void onSubmit(SubmitEvent event) {
                event.cancel();
            }
        });

        textBox.getElement().setAttribute("autocapitalize", "off");
        textBox.getElement().setAttribute("autocorrect", "off");
        textBox.getElement().setAttribute("type", "search");
        setPlaceHolder("Search");

        textBox.addKeyUpHandler(new KeyUpHandler() {

            @Override
            public void onKeyUp(KeyUpEvent event) {
                if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
                    fireEvent(new SearchSubmitEvent(getValue()));
                    return;
                }

                Scheduler.get().scheduleDeferred(new ScheduledCommand() {

                    @Override
                    public void execute() {
                        ValueChangeEvent.fire(MSearchBox.this, getValue());
                    }
                });
            }
        });
        setValue("");
    }

    public HandlerRegistration addSearchSubmitHandler(SearchSubmitHandler handler) {
        return addHandler(handler, SearchSubmitEvent.getType());
    }

    public HandlerRegistration addSearchClearHandler(SearchClearHandler handler) {
        return addHandler(handler, SearchClearEvent.getType());
    }

    @Override
    protected void onAttach() {
        super.onAttach();

        clearButtonHandler = clearButton.addTapHandler(new TapHandler() {

            @Override
            public void onTap(TapEvent event) {
                clearSearchField();
            }
        });

        boxHandler = textBox.addKeyUpHandler(new SearchBoxChangeHandler());
    }

    @Override
    protected void onDetach() {
        super.onDetach();
        clearButtonHandler.removeHandler();
        boxHandler.removeHandler();
    }

    @Override
    public void setPlaceHolder(String text) {
        textBox.getElement().setAttribute("placeholder", text);
    }

    private void clearSearchField() {
        textBox.setValue("", false);
        clearButton.setVisible(false);
        fireEvent(new SearchClearEvent());
        ValueChangeEvent.fire(this, "");
    }

    @Override
    public String getPlaceHolder() {
        return textBox.getElement().getAttribute("placeholder");
    }

    @Override
    public String getText() {
        return textBox.getText();
    }

    @Override
    public void setText(String text) {
        textBox.setText(text);
    }

    @Override
    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler) {
        return addHandler(handler, ValueChangeEvent.getType());
    }

    @Override
    public void setName(String name) {
        textBox.setName(name);
    }

    @Override
    public String getName() {
        return textBox.getName();
    }

    @Override
    public String getValue() {
        return textBox.getValue();
    }

    @Override
    public void setValue(String value) {
        setValue(value, false);
    }

    @Override
    public void setValue(String value, boolean fireEvents) {
        textBox.setValue(value, false);
        if (value == null || "".equals(value)) {
            clearButton.setVisible(false);
        }
        if (fireEvents) {
            ValueChangeEvent.fire(this, getValue());
        }
    }

    @UiFactory
    public MSearchBoxAppearance getAppearance() {
        return appearance;
    }
}