package org.ovirt.engine.ui.webadmin.section.main.view.tab.virtualMachine; import java.util.ArrayList; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.models.vms.SnapshotModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmSnapshotListModel; import org.ovirt.engine.ui.webadmin.idhandler.ElementIdHandler; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.virtualMachine.SubTabVirtualMachineSnapshotPresenter; import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView; import org.ovirt.engine.ui.webadmin.uicommon.model.SearchableDetailModelProvider; import org.ovirt.engine.ui.webadmin.widget.action.UiCommandButtonDefinition; import org.ovirt.engine.ui.webadmin.widget.table.ActionCellTable; import org.ovirt.engine.ui.webadmin.widget.table.OrderedMultiSelectionModel; import org.ovirt.engine.ui.webadmin.widget.table.column.SafeHtmlColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.TextColumnWithTooltip; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.AbstractDataProvider; import com.google.gwt.view.client.CellPreviewEvent; import com.google.gwt.view.client.DefaultSelectionEventManager; import com.google.gwt.view.client.DefaultSelectionEventManager.EventTranslator; import com.google.gwt.view.client.DefaultSelectionEventManager.SelectAction; import com.google.gwt.view.client.HasData; import com.google.inject.Inject; public class SubTabVirtualMachineSnapshotView extends AbstractSubTabTableView<VM, SnapshotModel, VmListModel, VmSnapshotListModel> implements SubTabVirtualMachineSnapshotPresenter.ViewDef { interface ViewUiBinder extends UiBinder<Widget, SubTabVirtualMachineSnapshotView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } interface ViewIdHandler extends ElementIdHandler<SubTabVirtualMachineSnapshotView> { ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); } ActionCellTable<String> applicationsTable; @UiField HorizontalPanel mainContainer; @UiField SimplePanel snapshotsTableContainer; @UiField SimplePanel applicationsTableContainer; @Inject public SubTabVirtualMachineSnapshotView(SearchableDetailModelProvider<SnapshotModel, VmListModel, VmSnapshotListModel> modelProvider) { super(modelProvider); ViewIdHandler.idHandler.generateAndSetIds(this); initSnapshotsTable(); initApplicationsTable(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); snapshotsTableContainer.add(getTable()); applicationsTableContainer.add(applicationsTable); mainContainer.setCellWidth(snapshotsTableContainer, "50%"); mainContainer.setCellWidth(applicationsTableContainer, "50%"); } private void initSnapshotsTable() { // Create a selection event manager (to disable 'current' snapshot selection) DefaultSelectionEventManager<SnapshotModel> selectionEventManager = DefaultSelectionEventManager.createCustomManager(new EventTranslator<SnapshotModel>() { @Override public boolean clearCurrentSelection(CellPreviewEvent<SnapshotModel> event) { return true; } @Override public SelectAction translateSelectionEvent(CellPreviewEvent<SnapshotModel> event) { if (event.getValue().getIsCurrent()) { return SelectAction.IGNORE; } return SelectAction.DEFAULT; } }); // Set selection mode, disable multiselection and first row ('current' snapshot) OrderedMultiSelectionModel<SnapshotModel> selectionModel = getTable().getSelectionModel(); selectionModel.setDisabledRows(0); getTable().setTableSelectionModel(selectionModel, selectionEventManager); getTable().setMultiSelectionDisabled(true); TextColumnWithTooltip<SnapshotModel> nameColumn = new TextColumnWithTooltip<SnapshotModel>() { @Override public String getValue(SnapshotModel object) { if (object.getDate() == null) { return "Current"; } DateTimeFormat format = DateTimeFormat.getFormat("yyyy-MMM-dd, HH:mm:ss"); return format.format(object.getDate()); } }; getTable().addColumn(nameColumn, "Date"); SafeHtmlColumn<SnapshotModel> descriptionColumn = new SafeHtmlColumn<SnapshotModel>() { @Override public final SafeHtml getValue(SnapshotModel object) { // Get raw description string (ignore < and > characters). // Customize description style as needed. String descriptionStr = SafeHtmlUtils.fromString(object.getDescriptionValue()).asString(); if (object.getIsCurrent()) descriptionStr = "<b><font color=gray>" + descriptionStr + "</font></b>"; if (object.getIsPreviewed()) descriptionStr = "<b><font color=orange>" + descriptionStr + "</font></b>"; return SafeHtmlUtils.fromTrustedString(descriptionStr); } }; getTable().addColumn(descriptionColumn, "Description"); TextColumnWithTooltip<SnapshotModel> diskColumn = new TextColumnWithTooltip<SnapshotModel>() { @Override public String getValue(SnapshotModel object) { return object.getParticipantDisks(); } }; getTable().addColumn(diskColumn, "Disks"); getTable().addActionButton(new UiCommandButtonDefinition<SnapshotModel>("Create") { @Override protected UICommand resolveCommand() { return getDetailModel().getNewCommand(); } }); getTable().addActionButton(new UiCommandButtonDefinition<SnapshotModel>("Preview") { @Override protected UICommand resolveCommand() { return getDetailModel().getPreviewCommand(); } }); getTable().addActionButton(new UiCommandButtonDefinition<SnapshotModel>("Commit") { @Override protected UICommand resolveCommand() { return getDetailModel().getCommitCommand(); } }); getTable().addActionButton(new UiCommandButtonDefinition<SnapshotModel>("Undo") { @Override protected UICommand resolveCommand() { return getDetailModel().getUndoCommand(); } }); getTable().addActionButton(new UiCommandButtonDefinition<SnapshotModel>("Delete") { @Override protected UICommand resolveCommand() { return getDetailModel().getRemoveCommand(); } }); } private void initApplicationsTable() { applicationsTable = new ActionCellTable<String>(new AbstractDataProvider<String>() { @Override protected void onRangeChanged(HasData<String> display) { } }, GWT.<Resources> create(SubTableResources.class)); TextColumnWithTooltip<String> nameColumn = new TextColumnWithTooltip<String>() { @Override public String getValue(String object) { return object; } }; applicationsTable.addColumn(nameColumn, "Installed Applications"); applicationsTable.setWidth("100%"); applicationsTable.setRowData(new ArrayList<String>()); getDetailModel().getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { PropertyChangedEventArgs pcArgs = (PropertyChangedEventArgs) args; if ("Apps".equals(pcArgs.PropertyName)) { applicationsTable.setRowData(Linq.ToList(getDetailModel().getApps())); } } }); } }