com.ephesoft.gxt.core.client.ui.widget.ScrollableSuggestDisplay.java Source code

Java tutorial

Introduction

Here is the source code for com.ephesoft.gxt.core.client.ui.widget.ScrollableSuggestDisplay.java

Source

/********************************************************************************* 
* Ephesoft is a Intelligent Document Capture and Mailroom Automation program 
* developed by Ephesoft, Inc. Copyright (C) 2015 Ephesoft Inc. 
* 
* This program is free software; you can redistribute it and/or modify it under 
* the terms of the GNU Affero General Public License version 3 as published by the 
* Free Software Foundation with the addition of the following permission added 
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK 
* IN WHICH THE COPYRIGHT IS OWNED BY EPHESOFT, EPHESOFT DISCLAIMS THE WARRANTY 
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. 
* 
* This program is distributed in the hope that it will be useful, but WITHOUT 
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
* FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more 
* details. 
* 
* You should have received a copy of the GNU Affero General Public License along with 
* this program; if not, see http://www.gnu.org/licenses or write to the Free 
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
* 02110-1301 USA. 
* 
* You can contact Ephesoft, Inc. headquarters at 111 Academy Way, 
* Irvine, CA 92617, USA. or at email address info@ephesoft.com. 
* 
* The interactive user interfaces in modified source and object code versions 
* of this program must display Appropriate Legal Notices, as required under 
* Section 5 of the GNU Affero General Public License version 3. 
* 
* In accordance with Section 7(b) of the GNU Affero General Public License version 3, 
* these Appropriate Legal Notices must retain the display of the "Ephesoft" logo. 
* If the display of the logo is not reasonably feasible for 
* technical reasons, the Appropriate Legal Notices must display the words 
* "Powered by Ephesoft". 
********************************************************************************/

package com.ephesoft.gxt.core.client.ui.widget;

import com.ephesoft.gxt.core.client.ui.widget.constant.StyleConstant;
import com.ephesoft.gxt.core.client.ui.widget.util.HTMLDomUtil;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Widget;

/**
 * Implementation of <code> SuggestionDisplay </code> with a Scrollable set of suggestions.
 * 
 * <p>
 * This ensures that <code> SuggestionBox </code> which is used to display suggestions has its pop-up panel with a scroll and handles
 * all the events that are used for scrolling the suggestions.
 * </p>
 * 
 * @author Ephesoft.
 * @version 1.0.
 * 
 */
public class ScrollableSuggestDisplay extends SuggestBox.DefaultSuggestionDisplay {

    /**
     * Reference to the pop-up panel which will be used to display the suggestions.
     */
    private Widget suggestionMenu;

    @Override
    protected Widget decorateSuggestionList(final Widget suggestionList) {
        suggestionMenu = suggestionList;
        return suggestionMenu;
    }

    @Override
    protected void moveSelectionDown() {
        super.moveSelectionDown();
        scrollSelectedItemIntoView();
    }

    @Override
    protected void moveSelectionUp() {
        super.moveSelectionUp();
        scrollSelectedItemIntoView();
    }

    /**
     * Scrolls the selectedItem in to the view. It ensures that selected item is always visible in the SuggestionDisplay.
     */
    private void scrollSelectedItemIntoView() {
        //TODO Refactoring. NULL Checks missing
        if (null != suggestionMenu) {
            final Element divElement = suggestionMenu.getElement();
            final Node tableNode = divElement.getChild(divElement.getChildCount() - 1);
            final NodeList<Node> optionsList = HTMLDomUtil.getGrandChildren(tableNode, 1);
            Element tableRowElement = null;
            if (optionsList != null) {
                for (int optionIndex = 0; optionIndex < optionsList.getLength(); optionIndex++) {
                    tableRowElement = (Element) optionsList.getItem(optionIndex);
                    if (((Element) tableRowElement.getChild(0)).getClassName()
                            .contains(StyleConstant.SUGGEST_BOX_SELECTED_ITEM_CLASS_APPENDER)) {
                        tableRowElement.scrollIntoView();
                        break;
                    }
                }
            }
        }
    }
}