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.WebUiUtils; import io.eguan.webui.WebUiUtils.StringAttributeOperation; import io.eguan.webui.component.window.ErrorWindow; import io.eguan.webui.component.window.SnapshotDeleteWindow; import io.eguan.webui.model.SnapshotModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.Accordion; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.FormLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; /** * The class represents a snapshot item which is a part of a tree items. * * @author oodrive * @author ebredzinski * */ final class SnapshotItemComponent implements TreeItemComponent { private static final Logger LOGGER = LoggerFactory.getLogger(SnapshotItemComponent.class); private final SnapshotModel model; private final Accordion attr; private static final int ATTRIBUTES_INDEX = 0; private static final int CREATE_INDEX = 1; private static final int DELETE_INDEX = 2; SnapshotItemComponent(final SnapshotModel model) { super(); this.model = model; this.attr = new Accordion(); } @Override public final AbstractComponent init() { final AbstractComponent attrlayout = createAttributes(); attr.addTab(attrlayout, "Attributes", WebUiResources.getSettingsSideIcon(), ATTRIBUTES_INDEX); final AbstractComponent createDeviceLayout = createDevice(); attr.addTab(createDeviceLayout, "Create device", WebUiResources.getDeviceSideIcon(), CREATE_INDEX); final AbstractComponent deleteLayout = createDelete(); attr.addTab(deleteLayout, "Delete", WebUiResources.getTrashSideIcon(), DELETE_INDEX); return attr; } /** * Update snapshot attributes */ protected final void updateAttributes() { final boolean isSelected = attr.getSelectedTab().equals(attr.getTab(ATTRIBUTES_INDEX).getComponent()); attr.removeTab(attr.getTab(ATTRIBUTES_INDEX)); final AbstractComponent attrlayout = createAttributes(); attr.addTab(attrlayout, "Attributes", WebUiResources.getSettingsSideIcon(), ATTRIBUTES_INDEX); if (isSelected) { attr.setSelectedTab(attrlayout); } } /** * Create delete tab in the accordion. * * @return the component. */ @SuppressWarnings("serial") private final AbstractComponent createDelete() { final VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); layout.setMargin(true); layout.setSpacing(true); final Label label = new Label("Deleting a snapshot can be done, only if it is not the root snapshot."); label.setWidth(null); layout.addComponent(label); layout.setComponentAlignment(label, Alignment.MIDDLE_CENTER); final Button deleteButton = new Button("Delete"); if (model.getItemUuid().equals(model.getSnapshotParent())) { // Root snapshot can not be deleted deleteButton.setEnabled(false); } layout.addComponent(deleteButton); layout.setComponentAlignment(deleteButton, Alignment.BOTTOM_CENTER); deleteButton.addClickListener(new Button.ClickListener() { @Override public void buttonClick(final ClickEvent event) { try { final SnapshotDeleteWindow deleteWindow = new SnapshotDeleteWindow(model.getItemUuid()); deleteWindow.add(model); } catch (final Exception e) { LOGGER.error("Can not delete snapshot:", e); final ErrorWindow err = new ErrorWindow("Snapshot not deleted: " + e.getMessage()); err.add(model); } } }); return layout; } /** * Create the component to create a device. * * @return the component */ @SuppressWarnings("serial") private final AbstractComponent createDevice() { final VerticalLayout layout = new VerticalLayout(); layout.setMargin(true); layout.setSpacing(true); final FormLayout createDeviceLayout = new FormLayout(); createDeviceLayout.setMargin(true); createDeviceLayout.setWidth(null); createDeviceLayout.setImmediate(true); layout.addComponent(createDeviceLayout); layout.setComponentAlignment(createDeviceLayout, Alignment.MIDDLE_CENTER); // Enter name final TextField deviceName = new TextField("Name", ""); createDeviceLayout.addComponent(deviceName); // Enter size (size of the snapshot by default) final TextField deviceSize = new TextField("Size", Long.toString(model.getSnapshotSize())); createDeviceLayout.addComponent(deviceSize); // Create button final Button create = new Button("Create device"); layout.addComponent(create); layout.setComponentAlignment(create, Alignment.MIDDLE_CENTER); create.addClickListener(new Button.ClickListener() { @Override public void buttonClick(final ClickEvent event) { boolean success = false; try { model.createDevice(deviceName.getValue(), Long.valueOf(deviceSize.getValue())); success = true; Notification.show("New device created", Notification.Type.TRAY_NOTIFICATION); } catch (final NumberFormatException e) { final ErrorWindow err = new ErrorWindow("Size must be a valid number"); err.add(model); } catch (final Exception e) { final ErrorWindow err = new ErrorWindow("Device not created: " + e.getMessage()); err.add(model); } if (success) { // Reset text fields on success deviceName.setValue(""); deviceSize.setValue(Long.toString(model.getSnapshotSize())); } } }); return layout; } /** * Create the component for the snapshot attributes * * @return the component */ private final AbstractComponent createAttributes() { final VerticalLayout layout = new VerticalLayout(); final FormLayout snapshotAttributesLayout = new FormLayout(); snapshotAttributesLayout.setMargin(true); snapshotAttributesLayout.setWidth(null); snapshotAttributesLayout.setImmediate(true); layout.addComponent(snapshotAttributesLayout); layout.setComponentAlignment(snapshotAttributesLayout, Alignment.MIDDLE_CENTER); // Enter NAME WebUiUtils.createFieldString(new StringAttributeOperation() { @Override public void setStringValue(final String value) { model.setSnapshotName(value); } @Override public String getStringValue() { return model.getSnapshotName(); } }, "Name", snapshotAttributesLayout, model); // Enter DESCRIPTION WebUiUtils.createFieldString(new StringAttributeOperation() { @Override public void setStringValue(final String value) { model.setSnapshotDescription(value); } @Override public String getStringValue() { return model.getSnapshotDescription(); } }, "Description", snapshotAttributesLayout, model); // Display UUID (not editable) final TextField snapUUID = new TextField("UUID", model.getItemUuid().toString()); snapUUID.setReadOnly(true); snapUUID.setWidth("300px"); snapshotAttributesLayout.addComponent(snapUUID); // Display size (not editable) final TextField snapSize = new TextField("Size", Long.toString(model.getSnapshotSize())); snapSize.setReadOnly(true); snapSize.setWidth("300px"); snapshotAttributesLayout.addComponent(snapSize); return layout; } }