/* * Copyright 2014-2016 CyberVision, Inc. * * 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 org.kaaproject.kaa.server.admin.client.mvp.activity; import com.google.gwt.activity.shared.AbstractActivity; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.place.shared.Place; import com.google.gwt.user.cellview.client.TreeNode; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.web.bindery.event.shared.EventBus; import org.kaaproject.kaa.server.admin.client.mvp.ClientFactory; import org.kaaproject.kaa.server.admin.client.mvp.event.data.DataEvent; import org.kaaproject.kaa.server.admin.client.mvp.event.data.DataEventHandler; import org.kaaproject.kaa.server.admin.client.mvp.place.TreePlace; import org.kaaproject.kaa.server.admin.client.mvp.view.NavigationView; import java.util.ArrayList; import java.util.List; public class NavigationActivity extends AbstractActivity implements NavigationView.Presenter { private final ClientFactory clientFactory; private final NavigationView navigationView; protected List<HandlerRegistration> registrations = new ArrayList<HandlerRegistration>(); private TreePlace pendingPlace; /** * Instantiates a new NavigationActivity. */ public NavigationActivity(ClientFactory clientFactory, EventBus eventBus) { this.clientFactory = clientFactory; this.navigationView = clientFactory.getNavigationView(); this.navigationView.setPresenter(this); this.navigationView.setEventBus(eventBus); } /** * On place changed. * * @param place the place. */ public void onPlaceChanged(TreePlace place) { TreePlace selected = navigationView.getSelectionModel().getSelectedObject(); if (!place.equals(selected)) { pendingPlace = place; selectPlace(place); } } private void selectPlace(TreePlace place) { TreeNode node = navigationView.getMenuTree().getRootTreeNode(); if (openNode(node, place)) { navigationView.getSelectionModel().setSelected(place, true); pendingPlace = null; } else { navigationView.getSelectionModel().clear(); } } private boolean openNode(TreeNode node, TreePlace place) { int childCount = node.getChildCount(); for (int i = 0; i < childCount; i++) { if (node.getChildValue(i).equals(place)) { //node.setChildOpen(i, true, true); return true; } else if (!node.isChildLeaf(i)) { boolean wasOpen = node.isChildOpen(i); TreeNode child = node.setChildOpen(i, true); if (child != null && openNode(child, place)) { return true; } else if (!wasOpen) { node.setChildOpen(i, false); } } } return false; } private void refreshTree() { TreeNode node = navigationView.getMenuTree().getRootTreeNode(); refreshTree(node); } private void refreshTree(TreeNode node) { int childCount = node.getChildCount(); for (int i = 0; i < childCount; i++) { if (!node.isChildLeaf(i) && node.isChildOpen(i)) { node.setChildOpen(i, false); TreeNode child = node.setChildOpen(i, true); if (child != null) { refreshTree(child); } } } } @Override public void start(AcceptsOneWidget containerWidget, com.google.gwt.event.shared.EventBus eventBus) { containerWidget.setWidget(navigationView.asWidget()); registrations.add(navigationView.getSelectionModel().addSelectionChangeHandler( new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { TreePlace place = navigationView.getSelectionModel().getSelectedObject(); if (place != null) { goTo(place); TreePlace current = (TreePlace) clientFactory.getPlaceController().getWhere(); if (!current.equals(place)) { navigationView.getSelectionModel().setSelected(current, true); } } } } )); registrations.add(eventBus.addHandler(DataEvent.getType(), new DataEventHandler() { @Override public void onDataChanged(DataEvent event) { if (event.refreshTree()) { refreshTree(); if (pendingPlace != null) { selectPlace(pendingPlace); } } } })); } @Override public void onStop() { for (HandlerRegistration registration : registrations) { registration.removeHandler(); } registrations.clear(); } @Override public void goTo(Place place) { clientFactory.getPlaceController().goTo(place); } }