package org.ovirt.engine.ui.common.widget.uicommon; import org.ovirt.engine.ui.common.MainTableHeaderlessResources; import org.ovirt.engine.ui.common.MainTableResources; import org.ovirt.engine.ui.common.SubTableHeaderlessResources; import org.ovirt.engine.ui.common.SubTableResources; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.common.uicommon.model.SearchableTableModelProvider; import org.ovirt.engine.ui.common.widget.table.SimpleActionTable; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; /** * Base class for widgets that use {@link SimpleActionTable} to represent UiCommon list models. * * @param <T> * Table row data type. * @param <M> * List model type. */ public abstract class AbstractModelBoundTableWidget<T, M extends SearchableListModel> extends Composite { private final SearchableTableModelProvider<T, M> modelProvider; private final EventBus eventBus; private final boolean useMainTableResources; private final SimpleActionTable<T> table; public AbstractModelBoundTableWidget(SearchableTableModelProvider<T, M> modelProvider, EventBus eventBus, ClientStorage clientStorage, boolean useMainTableResources) { this.modelProvider = modelProvider; this.eventBus = eventBus; this.useMainTableResources = useMainTableResources; this.table = createActionTable(eventBus, clientStorage); initWidget(getWrappedWidget()); } SimpleActionTable<T> createActionTable(EventBus eventBus, ClientStorage clientStorage) { return new SimpleActionTable<T>(modelProvider, getTableHeaderlessResources(), getTableResources(), eventBus, clientStorage) { { if (useTableWidgetForContent()) { enableHeaderContextMenu(); } } }; } /** * Returns {@code true} if table content is provided by the {@link #table} widget itself. * Returns {@code false} if table content is provided by a custom widget, e.g. a tree. */ protected boolean useTableWidgetForContent() { return true; } /** * @return Widget passed to the {@linkplain Composite#initWidget initWidget} method. */ protected Widget getWrappedWidget() { return table; } private Resources getTableResources() { return useMainTableResources ? GWT.<Resources> create(MainTableResources.class) : GWT.<Resources> create(SubTableResources.class); } private Resources getTableHeaderlessResources() { return useMainTableResources ? GWT.<Resources> create(MainTableHeaderlessResources.class) : GWT.<Resources> create(SubTableHeaderlessResources.class); } public M getModel() { return modelProvider.getModel(); } protected EventBus getEventBus() { return eventBus; } public SimpleActionTable<T> getTable() { return table; } /** * Performs initialization of the table widget. */ public abstract void initTable(); public void addModelListeners() { } }