package io.eguan.webui.component; /* * #%L * Project eguan * %% * Copyright (C) 2012 - 2017 Oodrive * %% * 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. * #L% */ import io.eguan.webui.WebUiResources; import io.eguan.webui.model.AbstractItemModel; import io.eguan.webui.model.DeviceModel; import io.eguan.webui.model.ModelCreator; import io.eguan.webui.model.SnapshotModel; import io.eguan.webui.model.VvrModel; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Tree; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.BaseTheme; /** * The class represents the VVR as a tree of devices and snapshots. * * @author oodrive * @author ebredzinski * */ public class VvrTreeComponent implements VvrComponent { private Tree vvrTree; private final VerticalLayout treeItemlayout; private TreeItemComponent selectedItem; private final Map<UUID, AbstractItemModel> items = new HashMap<>(); public VvrTreeComponent(final VerticalLayout layout) { this.treeItemlayout = layout; } @SuppressWarnings({ "serial" }) @Override public final AbstractComponent createComponent(final VvrModel model, final ModelCreator handler) { vvrTree = new Tree(); vvrTree.setChildrenAllowed(vvrTree, true); vvrTree.setSizeFull(); vvrTree.setImmediate(true); vvrTree.addStyleName(BaseTheme.TREE_CONNECTORS); // Add snapshots on the tree final Set<UUID> snapshotUuidList = model.getSnapshotsList(); for (final UUID snapshotUuid : snapshotUuidList) { addSnapshot(handler.createSnapshotModel(model, snapshotUuid)); } // Add devices on the tree final Set<UUID> deviceUuidList = model.getDevicesList(); for (final UUID deviceUuid : deviceUuidList) { addDevice(handler.createDeviceModel(model, deviceUuid)); } vvrTree.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(final ValueChangeEvent event) { final Object id = vvrTree.getValue(); if (id != null) { if (id instanceof SnapshotModel) { final SnapshotModel snapshotModel = (SnapshotModel) id; treeItemlayout.removeAllComponents(); selectedItem = new SnapshotItemComponent(snapshotModel); treeItemlayout.addComponent(selectedItem.init()); } else if (id instanceof DeviceModel) { final DeviceModel deviceModel = (DeviceModel) id; treeItemlayout.removeAllComponents(); selectedItem = new DeviceItemComponent(deviceModel); treeItemlayout.addComponent(selectedItem.init()); } } else { // Delete all treeItemlayout.removeAllComponents(); } } }); return vvrTree; } /** * Add a new snapshot to the VVR tree. * * @param snapshotModel * the new snapshot */ public final void addSnapshot(final SnapshotModel snapshotModel) { // Add item to the tree vvrTree.addItem(snapshotModel); items.put(snapshotModel.getItemUuid(), snapshotModel); // Configure it final String name = snapshotModel.getSnapshotName(); if (name.isEmpty() || name == null) { vvrTree.setItemCaption(snapshotModel, snapshotModel.getItemUuid().toString()); } else { vvrTree.setItemCaption(snapshotModel, name); } vvrTree.setItemIcon(snapshotModel, WebUiResources.getSnapshotTreeIcon()); vvrTree.setItemIconAlternateText(snapshotModel, "snapshot"); vvrTree.areChildrenAllowed(snapshotModel); vvrTree.expandItemsRecursively(snapshotModel); // Add snapshot parent (if null, node is detached) final UUID newParentId = snapshotModel.getSnapshotParent(); vvrTree.setParent(snapshotModel, items.get(newParentId)); // If child is already present, set its parent. Otherwise it will be set when child will appear final UUID[] childrenDevices = snapshotModel.getSnapshotChildrenDevices(); for (final UUID child : childrenDevices) { final AbstractItemModel childModel = items.get(child); if (childModel != null) { vvrTree.setParent(childModel, snapshotModel); } } final UUID[] childrenSnapshots = snapshotModel.getSnapshotChildrenSnapshots(); for (final UUID child : childrenSnapshots) { final AbstractItemModel childModel = items.get(child); if (childModel != null) { vvrTree.setParent(childModel, snapshotModel); } } } /** * Remove a snapshot from the tree. * * @param uuid * the UUID of the snapshot to remove */ public final void removeSnapshot(final UUID uuid) { final SnapshotModel snapshotModel = (SnapshotModel) items.remove(uuid); final Object parentId = vvrTree.getParent(snapshotModel); // Set snapshot parent to snapshot children final Collection<?> children = vvrTree.getChildren(snapshotModel); if (children != null) { // Copy children in a list final ArrayList<AbstractItemModel> childrenList = new ArrayList<>(); for (final Object child : children) { childrenList.add((AbstractItemModel) child); } // Change their parent for (final AbstractItemModel child : childrenList) { vvrTree.setParent(child, parentId); } } vvrTree.removeItem(snapshotModel); } /** * Modify the name of a snapshot. * * @param snapshotUuid * the UUID of the snapshot to rename * @param name * the new name of the snapshot */ public final void modifySnapshotName(final UUID snapshotUuid, final String name) { final SnapshotModel snapshotModel = (SnapshotModel) items.get(snapshotUuid); // Change name if (name.isEmpty() || name == null) { vvrTree.setItemCaption(snapshotModel, snapshotModel.getItemUuid().toString()); } else { vvrTree.setItemCaption(snapshotModel, name); } modifySnapshotLayout(snapshotUuid); } /** * Modify the description of a snapshot. * * @param snapshotUuid * the UUID of the snapshot * @param description * the new description */ public void modifySnapshotDescription(final UUID snapshotUuid, final String description) { modifySnapshotLayout(snapshotUuid); } /** * Modify the snapshot layout. Reload all the attributes. * * @param snapshotUuid * the snapshot UUID to change */ private final void modifySnapshotLayout(final UUID snapshotUuid) { // Update item layout only if selected final Object id = vvrTree.getValue(); if (id instanceof SnapshotModel) { final SnapshotModel snapshotModel = (SnapshotModel) items.get(snapshotUuid); final SnapshotModel snapshotModelSelected = (SnapshotModel) id; if (snapshotModel.equals(snapshotModelSelected)) { ((SnapshotItemComponent) selectedItem).updateAttributes(); } } } /** * Add a new device to the VVR tree * * @param model * the device model to add */ public final void addDevice(final DeviceModel model) { // Add item to the tree vvrTree.addItem(model); vvrTree.setItemCaption(model, model.getDeviceName()); vvrTree.setItemIcon(model, WebUiResources.getDeviceTreeIcon()); items.put(model.getItemUuid(), model); // Add device parent (if null, node is detached) final UUID newParentId = model.getDeviceParent(); vvrTree.setParent(model, items.get(newParentId)); vvrTree.setItemIconAlternateText(model, "device"); vvrTree.setChildrenAllowed(model, false); } /** * Remove a device from the VVR tree * * @param uuid * the UUID of the device to remove. */ public final void removeDevice(final UUID uuid) { final DeviceModel deviceModel = (DeviceModel) items.remove(uuid); vvrTree.removeItem(deviceModel); } /** * Modify the device name. * * @param deviceUuid * the UUID of the device to rename * @param name * the new name of the device */ public void modifyDeviceName(final UUID deviceUuid, final String name) { final DeviceModel deviceModel = (DeviceModel) items.get(deviceUuid); // Change name if (name.isEmpty() || name == null) { vvrTree.setItemCaption(deviceModel, deviceModel.getItemUuid().toString()); } else { vvrTree.setItemCaption(deviceModel, name); } modifyDeviceLayout(deviceUuid); } /** * Modify the device description. * * @param deviceUuid * the device uuid * @param description * the new description */ public final void modifyDeviceDescription(final UUID deviceUuid, final String name) { modifyDeviceLayout(deviceUuid); } /** * Modify the layout of the device. * * @param deviceUuid * the device UUID */ private final void modifyDeviceLayout(final UUID deviceUuid) { // Update item layout if selected final Object id = vvrTree.getValue(); if (id instanceof DeviceModel) { final DeviceModel snapshotModel = (DeviceModel) items.get(deviceUuid); final DeviceModel snapshotModelSelected = (DeviceModel) id; if (snapshotModel.equals(snapshotModelSelected)) { ((DeviceItemComponent) selectedItem).updateAttributes(); } } } }