org.opennms.features.topology.app.internal.gwt.client.VSearchBox.java Source code

Java tutorial

Introduction

Here is the source code for org.opennms.features.topology.app.internal.gwt.client.VSearchBox.java

Source

/*******************************************************************************
 * This file is part of OpenNMS(R).
 *
 * Copyright (C) 2013-2014 The OpenNMS Group, Inc.
 * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 *
 * OpenNMS(R) 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 OpenNMS(R).  If not, see:
 *      http://www.gnu.org/licenses/
 *
 * For more information contact:
 *     OpenNMS(R) Licensing <license@opennms.org>
 *     http://www.opennms.org/
 *     http://www.opennms.com/
 *******************************************************************************/

package org.opennms.features.topology.app.internal.gwt.client;

import java.util.List;
import java.util.Map;

import org.opennms.features.topology.app.internal.gwt.client.ui.SearchTokenField;
import org.opennms.features.topology.app.internal.gwt.client.ui.SearchTokenField.CollapseCallback;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.TextBoxBase;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class VSearchBox extends Composite implements SelectionHandler<SuggestOracle.Suggestion>, KeyUpHandler {

    private HandlerRegistration m_windowResizeRegistration;

    public class DefaultCenterOnCallback implements SearchTokenField.CenterOnSuggestionCallback {

        @Override
        public void onCenter(SearchSuggestion searchSuggestion) {
            m_connector.centerOnSuggestion(searchSuggestion);
        }
    }

    public class RemoteSuggestOracle extends SuggestOracle {

        private Timer m_keyTimer = new Timer() {
            @Override
            public void run() {
            }
        };

        RemoteSuggestOracle() {
        }

        @Override
        public boolean isDisplayStringHTML() {
            return true;
        }

        @Override
        public void requestSuggestions(final Request request, final Callback callback) {

            m_keyTimer.cancel();

            m_keyTimer = new Timer() {
                @Override
                public void run() {
                    m_connector.query(request, callback, m_indexFrom, m_indexTo);

                }
            };

            m_keyTimer.schedule(1500);

        }
    }

    private Map<String, String> m_valueMap;

    private int m_indexFrom = 0;
    private int m_indexTo = 0;

    private boolean m_isMultiValued = true;
    private SearchBoxConnector m_connector;
    private static VSearchComboBoxUiBinder uiBinder = GWT.create(VSearchComboBoxUiBinder.class);

    interface VSearchComboBoxUiBinder extends UiBinder<Widget, VSearchBox> {
    }

    @UiField
    FlowPanel m_componentHolder;

    FlowPanel m_scrollContainer;
    VerticalPanel m_focusedContainer;

    SuggestBox m_suggestBox;

    public VSearchBox() {
        initWidget(uiBinder.createAndBindUi(this));
    }

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

    @Override
    public void onLoad() {
        m_componentHolder.clear();
        this.setStyleName("topology-search");
        final TextBoxBase textField = new TextBox();
        textField.setWidth("245px");
        textField.setStyleName("topology-search-box");
        textField.getElement().setAttribute("placeholder", "Search...");
        textField.setFocus(true);
        RemoteSuggestOracle oracle = new RemoteSuggestOracle();

        m_suggestBox = new SuggestBox(oracle, textField);

        m_suggestBox.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>() {
            @Override
            public void onSelection(SelectionEvent<SuggestOracle.Suggestion> event) {
                SearchSuggestion selectedItem = (SearchSuggestion) event.getSelectedItem();
                textField.setText("");
                m_connector.addToFocus(selectedItem);
            }
        });

        if (m_isMultiValued) {
            m_suggestBox.setStyleName("multivalue");
        }

        m_suggestBox.addStyleName("wideTextField");
        m_suggestBox.addSelectionHandler(this);
        m_suggestBox.addKeyUpHandler(this);

        m_componentHolder.setWidth("245px");
        m_componentHolder.add(m_suggestBox);

        if (m_focusedContainer == null) {
            m_focusedContainer = new VerticalPanel();
            m_scrollContainer = new FlowPanel();
            m_scrollContainer.add(m_focusedContainer);

        }

        m_focusedContainer.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
        m_focusedContainer.setTitle("Focused Vertices");
        m_componentHolder.add(m_scrollContainer);

        Timer timer = new Timer() {

            @Override
            public void run() {
                updateScrollPanelSize();
            }
        };

        timer.schedule(1000);

        m_windowResizeRegistration = Window.addResizeHandler(new ResizeHandler() {
            @Override
            public void onResize(ResizeEvent event) {
                updateScrollPanelSize();
            }
        });

    }

    private void updateScrollPanelSize() {
        Element topologyComponent = DOM.getElementById("TopologyComponent");
        int topoHeight = topologyComponent.getOffsetHeight();
        int containerHeight = topoHeight - (m_focusedContainer.getElement().getOffsetTop() + 5);
        int tableHeight = m_focusedContainer.getOffsetHeight();

        if (containerHeight >= 0) {
            m_scrollContainer.setHeight("" + Math.min(containerHeight, tableHeight) + "px");

            if (tableHeight > containerHeight) {
                m_scrollContainer.getElement().getStyle().setOverflowY(Style.Overflow.SCROLL);
            } else {
                m_scrollContainer.getElement().getStyle().setOverflowY(Style.Overflow.HIDDEN);
            }
        }

    }

    public static native void debug(Object obj) /*-{
                                                $wnd.console.debug(obj);
                                                }-*/;

    @Override
    public void onSelection(SelectionEvent<SuggestOracle.Suggestion> event) {
        SuggestOracle.Suggestion suggestion = event.getSelectedItem();
    }

    @Override
    public void onKeyUp(KeyUpEvent event) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void setSearchBoxConnector(SearchBoxConnector connector) {
        m_connector = connector;
    }

    public void setFocused(List<SearchSuggestion> focused) {
        m_focusedContainer.clear();
        if (focused == null) {
            log("Focus list for searchbox is null");
            updateScrollPanelSize();
            return;
        }
        log(focused);
        for (SearchSuggestion searchSuggestion : focused) {
            SearchTokenField field = new SearchTokenField(searchSuggestion);
            field.setRemoveCallback(new SearchTokenField.RemoveCallback() {
                @Override
                public void onRemove(SearchSuggestion searchSuggestion) {
                    m_connector.removeFocused(searchSuggestion);
                }
            });
            field.setCenterOnCallback(new DefaultCenterOnCallback());
            if (searchSuggestion.isCollapsible()) {
                field.setCollapseCallback(new CollapseCallback() {
                    @Override
                    public void onCollapse(SearchSuggestion searchSuggestion) {
                        m_connector.toggleSuggestionCollapse(searchSuggestion);
                        // Update the state of the local object
                        searchSuggestion.setCollapsed(!searchSuggestion.isCollapsed());
                    }
                });
            }

            m_focusedContainer.add(field);
        }

        updateScrollPanelSize();

    }

    private static native void log(Object message) /*-{
                                                   $wnd.console.debug(message);
                                                   }-*/;

}