All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.knightsoftnet.mtwidgets.client.ui.widget.AbstractWebShimedMinMaxTextBox Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You 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 de.knightsoftnet.mtwidgets.client.ui.widget;

import de.knightsoftnet.mtwidgets.client.jswrapper.JQuery;
import de.knightsoftnet.mtwidgets.client.ui.widget.resourceloader.WebshimResources;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.text.shared.Parser;
import com.google.gwt.text.shared.Renderer;

import elemental2.dom.HTMLInputElement;

import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * html5 date box for input with webshim fallback if not supported by browser.
 *
 * @author Manfred Tremmel
 *
 */
public abstract class AbstractWebShimedMinMaxTextBox extends AbstractMinMaxTextBox {

  final boolean nativeSupport;

  /**
   * constructor.
   *
   * @param pelement input element
   * @param ptype type of the input element
   * @param pnumberRenderer number renderer
   * @param pnumberParser number parser
   * @param pkeyPressHandler key press handler
   */
  public AbstractWebShimedMinMaxTextBox(final HTMLInputElement pelement, final String ptype,
      final Renderer pnumberRenderer, final Parser pnumberParser,
      final KeyPressHandler pkeyPressHandler) {
    super(pelement, ptype, pnumberRenderer, pnumberParser, pkeyPressHandler);
    this.nativeSupport = this.isNative();
  }

  /**
   * constructor.
   *
   * @param pelement input element
   * @param ptype type of the input element
   * @param pnumberRenderer number renderer
   * @param pnumberParser number parser
   * @param pplainNumberRenderer number renderer for internal usage
   * @param pplainNumberParser number parser for internal usage
   * @param pkeyPressHandler key press handler
   */
  public AbstractWebShimedMinMaxTextBox(final HTMLInputElement pelement, final String ptype,
      final Renderer pnumberRenderer, final Parser pnumberParser,
      final Renderer pplainNumberRenderer, final Parser pplainNumberParser,
      final KeyPressHandler pkeyPressHandler) {
    super(pelement, ptype, pnumberRenderer, pnumberParser, pplainNumberRenderer, pplainNumberParser,
        pkeyPressHandler);
    this.nativeSupport = this.isNative();
  }

  /**
   * constructor.
   *
   * @param pnumberRenderer number renderer
   * @param pnumberParser number parser
   * @param pkeyPressHandler key press handler
   */
  public AbstractWebShimedMinMaxTextBox(final Renderer pnumberRenderer,
      final Parser pnumberParser, final KeyPressHandler pkeyPressHandler) {
    super(pnumberRenderer, pnumberParser, pkeyPressHandler);
    this.nativeSupport = this.isNative();
  }

  /**
   * constructor.
   *
   * @param pnumberRenderer number renderer
   * @param pnumberParser number parser
   * @param pplainNumberRenderer number renderer for internal usage
   * @param pplainNumberParser number parser for internal usage
   * @param pkeyPressHandler key press handler
   */
  public AbstractWebShimedMinMaxTextBox(final Renderer pnumberRenderer,
      final Parser pnumberParser, final Renderer pplainNumberRenderer,
      final Parser pplainNumberParser, final KeyPressHandler pkeyPressHandler) {
    super(pnumberRenderer, pnumberParser, pplainNumberRenderer, pplainNumberParser,
        pkeyPressHandler);
    this.nativeSupport = this.isNative();
  }

  @Override
  protected void onEnsureDebugId(final String pbaseId) {
    super.onEnsureDebugId(pbaseId);
    if (!this.nativeSupport) {
      WebshimResources.whenReady(event -> {
        Scheduler.get().scheduleFixedDelay(() -> {
          this.getJQueryElement().updatePolyfill();
          GWT.log("Initialize webshim for: " + getElement().getId());
          try {
            this.getJQueryElement().getShadowElement().addEventListener("change",
                listener -> ValueChangeEvent.fire(this, getValue()));
          } catch (final Exception exception) {
            GWT.log(exception.getMessage());
          }
          return false;
        }, 1000);
      });
    }
  }

  private boolean isNative() {
    final String rememberValue = getInputElement().value;
    getInputElement().value = "x";
    final String dateInput = getInputElement().value;
    getInputElement().value = rememberValue;
    return !StringUtils.equals(dateInput, "x");
  }

  @Override
  public void setValue(final T value, final boolean fireEvents) {
    final T oldValue = getValue();
    final String renderedDate = numberRenderer.render(value);
    getInputElement().value = renderedDate;
    if (!this.nativeSupport && WebshimResources.isInitialized()) {
      this.getJQueryElement().val(renderedDate);
    }
    if (fireEvents) {
      ValueChangeEvent.fireIfNotEqual(this, oldValue, value);
    }
  }

  @Override
  public void setMin(final T pmin) {
    super.setMin(pmin);
    this.updateAttribute("min", numberRenderer.render(pmin));
  }

  @Override
  public void setMax(final T pmax) {
    super.setMax(pmax);
    this.updateAttribute("max", numberRenderer.render(pmax));
  }

  @Override
  public void setStep(final Integer pstep) {
    super.setStep(pstep);
    this.updateAttribute("step", Objects.toString(pstep, null));
  }

  private void updateAttribute(final String pattr, final String pvalue) {
    if (!this.nativeSupport && WebshimResources.isInitialized()) {
      if (StringUtils.isEmpty(pvalue)) {
        this.getJQueryElement().removeAttr(pattr);
      } else {
        this.getJQueryElement().attr(pattr, pvalue);
      }
    }
  }

  private JQuery getJQueryElement() {
    return JQuery.$("#" + getElement().getId());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy