/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.webui.supervisor; import com.vaadin.ui.Component; import com.vaadin.ui.MenuBar; import com.vaadin.ui.VerticalLayout; import java.io.Serializable; final public class TaskManager extends VerticalLayout { interface BlockProducer extends Serializable { Component createBlock(); } static class ExecutionsBlockProducer implements BlockProducer { @Override public Component createBlock() { return new ExecutionsPanel(); } } static class ExceptionsBlockProducer implements BlockProducer { @Override public Component createBlock() { return new ExceptionsPanel(); } } Component currentBlock; final MenuBar menu = new MenuBar(); public TaskManager() { setSizeFull(); setMargin(false); setSpacing(false); menu.setWidth(100, UNITS_PERCENTAGE); menu.addStyleName("submenu"); addComponent(menu); setExpandRatio(menu, 0.001f); addBlock("Исполняемые процессы", new ExecutionsBlockProducer()); addBlock("Ошибки исполнения", new ExceptionsBlockProducer()); } void createBlock(final BlockProducer blockProducer) { currentBlock = blockProducer.createBlock(); addComponent(currentBlock); setExpandRatio(currentBlock, 0.999f); } private void addBlock(final String title, final BlockProducer blockProducer) { final MenuBar.MenuItem item = menu.addItem(title, new BlockSelector(blockProducer)); if (currentBlock == null) { item.setEnabled(false); createBlock(blockProducer); } } class BlockSelector implements MenuBar.Command { final BlockProducer blockProducer; BlockSelector(BlockProducer blockProducer) { this.blockProducer = blockProducer; } @Override public void menuSelected(final MenuBar.MenuItem selectedItem) { for (MenuBar.MenuItem i : menu.getItems()) { i.setEnabled(i != selectedItem); } if (currentBlock != null) { removeComponent(currentBlock); } createBlock(blockProducer); } } }