/*
*
* * Copyright (c) 2016. David Sowerby
* *
* * 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 uk.q3c.krail.core.view.component;
import com.google.inject.Inject;
import com.vaadin.ui.MenuBar.MenuItem;
import uk.q3c.krail.core.navigate.Navigator;
import uk.q3c.krail.core.navigate.sitemap.UserSitemap;
import uk.q3c.krail.core.navigate.sitemap.UserSitemapNode;
import uk.q3c.util.*;
import uk.q3c.util.TreeCopy.SortOption;
import java.util.ArrayList;
import java.util.List;
public class DefaultUserNavigationMenuBuilder implements UserNavigationMenuBuilder {
private final UserSitemap userSitemap;
private final Navigator navigator;
private UserNavigationMenu userNavigationMenu;
@Inject
protected DefaultUserNavigationMenuBuilder(UserSitemap userSitemap, Navigator navigator) {
this.userSitemap = userSitemap;
this.navigator = navigator;
}
@Override
public void build() {
SourceTreeWrapper_BasicForest<UserSitemapNode> source = new SourceTreeWrapper_BasicForest<>(userSitemap
.getForest());
TargetTreeWrapper_MenuBar<UserSitemapNode, MenuItem> target = new TargetTreeWrapper_MenuBar<>
();
UserSitemapNodeCaption nodeCaptionReader = new UserSitemapNodeCaption();
target.setCaptionReader(nodeCaptionReader);
MenuBarNodeModifier nodeModifier = new MenuBarNodeModifier(userNavigationMenu.getMenuBar(), navigator,
nodeCaptionReader, userSitemap);
target.setNodeModifier(nodeModifier);
TreeCopy<UserSitemapNode, MenuItem> treeCopy = new TreeCopy<>(source, target);
treeCopy.setSortOption(SortOption.SORT_SOURCE_NODES);
treeCopy.setMaxDepth(userNavigationMenu.getOptionMaxDepth());
treeCopy.setSorted(userNavigationMenu.isSorted());
List<NodeFilter> filters = new ArrayList<>();
defineFilters(filters);
applyFilters(treeCopy, filters);
treeCopy.copy();
}
/**
* Excludes nodes with positionIndex < 0 and the log out page. Override this to use different filters
*
* @param filters
* the filters to apply
*/
protected void defineFilters(List<NodeFilter> filters) {
filters.add(new LogoutPageFilter());
filters.add(new NoNavFilter());
}
/**
* Applies the filters defined by {@link #defineFilters(List)}
*
* @param treeCopy
* the copy object
* @param filters
* the filters to apply
*/
private void applyFilters(TreeCopy<UserSitemapNode, MenuItem> treeCopy, List<NodeFilter> filters) {
for (NodeFilter filter : filters) {
treeCopy.addSourceFilter(filter);
}
}
@Override
public UserNavigationMenu getUserNavigationMenu() {
return userNavigationMenu;
}
@Override
public void setUserNavigationMenu(UserNavigationMenu userNavigationMenu) {
this.userNavigationMenu = userNavigationMenu;
}
}