/* * * * 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.data.Property; import com.vaadin.ui.MenuBar; import net.engio.mbassy.listener.Handler; import net.engio.mbassy.listener.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.q3c.krail.core.eventbus.SessionBus; import uk.q3c.krail.core.eventbus.SubscribeTo; import uk.q3c.krail.core.i18n.DescriptionKey; import uk.q3c.krail.core.i18n.LabelKey; import uk.q3c.krail.core.navigate.sitemap.UserSitemapLabelChangeMessage; import uk.q3c.krail.core.navigate.sitemap.UserSitemapStructureChangeMessage; import uk.q3c.krail.core.option.Option; import uk.q3c.krail.core.option.OptionContext; import uk.q3c.krail.core.option.OptionKey; import uk.q3c.util.ID; import javax.annotation.Nonnull; import java.util.Optional; @Listener @SubscribeTo(SessionBus.class) public class DefaultUserNavigationMenu extends MenuBar implements OptionContext, UserNavigationMenu { protected static final OptionKey<Integer> optionKeyMaximumDepth = new OptionKey<>(10, DefaultUserNavigationMenu.class, LabelKey.Maxiumum_Depth, DescriptionKey.Maximum_Menu_Depth); private static Logger log = LoggerFactory.getLogger(DefaultUserNavigationMenu.class); private final Option option; private final UserNavigationMenuBuilder builder; private boolean sorted = true; @Inject protected DefaultUserNavigationMenu(Option option, UserNavigationMenuBuilder builder) { super(); this.option = option; this.builder = builder; setImmediate(true); builder.setUserNavigationMenu(this); setId(ID.getId(Optional.empty(), this)); } @Override public MenuBar getMenuBar() { return this; } @Override public int getOptionMaxDepth() { return option.get(optionKeyMaximumDepth); } @Override public void setOptionMaxDepth(int depth) { option.set(optionKeyMaximumDepth, depth); build(); } @Override public void build() { log.debug("rebuilding"); clear(); builder.build(); } @Override public void clear() { this.removeItems(); log.debug("contents cleared"); } @Handler public void labelsChanged(UserSitemapLabelChangeMessage busMessage) { build(); } @Handler public void structureChanged(UserSitemapStructureChangeMessage busMessage) { build(); } @Override public boolean isSorted() { log.debug("Sorted is {}", sorted); return sorted; } @Override public void setSorted(boolean sorted) { this.sorted = sorted; build(); } @Nonnull @Override public Option getOption() { return option; } @Override public void optionValueChanged(Property.ValueChangeEvent event) { build(); } }