Skip to content

Commit

Permalink
webadmin: add NoSelection mode to OvirtSelectionModel
Browse files Browse the repository at this point in the history
GWT provides NoSelectionModel for cases where the view should not be
updated. This possibility was missing in the Ovirt's higher-order
selection model.
  • Loading branch information
rszwajko committed May 13, 2022
1 parent cc8a3dd commit 339abfa
Showing 1 changed file with 49 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,34 +1,48 @@
package org.ovirt.engine.ui.uicommonweb.models;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.NoSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;

/**
* Higher-order {@link SelectionModel} that delegates to either {@linkplain SingleSelectionModel single}
* or {@linkplain OrderedMultiSelectionModel multi} selection model implementation, depending on the
* {@code singleSelectionOnly} parameter.
* or {@linkplain OrderedMultiSelectionModel multi} or {@linkplain NoSelectionModel }selection model implementation.
*
* @param <T> Type of items tracked by the selection model.
*/
public class OvirtSelectionModel<T> implements SelectionModel<T> {

private enum Mode {
SINGLE_SELECTION,
MULTI_SELECTION,
NO_SELECTION
}

private final SelectionModel<T> delegate;
private final boolean singleSelectionOnly;
private final Mode mode;

public OvirtSelectionModel(boolean singleSelectionOnly) {
this.singleSelectionOnly = singleSelectionOnly;
this.mode = singleSelectionOnly ? Mode.SINGLE_SELECTION : Mode.MULTI_SELECTION;
this.delegate = singleSelectionOnly
? new SingleSelectionModel<>(new QueryableEntityKeyProvider<>())
: new OrderedMultiSelectionModel<>(new QueryableEntityKeyProvider<>());

}

public OvirtSelectionModel() {
this.mode = Mode.NO_SELECTION;
this.delegate = new NoSelectionModel<>();
}


@Override
public HandlerRegistration addSelectionChangeHandler(Handler handler) {
return delegate.addSelectionChangeHandler(handler);
Expand Down Expand Up @@ -58,22 +72,34 @@ public Object getKey(T item) {
* Clear the current selection.
*/
public void clear() {
if (singleSelectionOnly) {
switch (mode) {
case SINGLE_SELECTION:
asSingleSelectionModel().clear();
} else {
break;
case MULTI_SELECTION:
asMultiSelectionModel().clear();
break;
case NO_SELECTION:
// no selection to clear
break;
}
}

/**
* @return List of currently selected items. If {@code singleSelectionOnly}
* is {@code false}, the list order reflects the order in which items were
* @return List of currently selected items. If {@code #isMultiSelectionOnly}
* is {@code true}, the list order reflects the order in which items were
* selected.
*/
public List<T> getSelectedObjects() {
return singleSelectionOnly
? new ArrayList<>(((SingleSelectionModel<T>) delegate).getSelectedSet())
: ((OrderedMultiSelectionModel<T>) delegate).getSelectedList();
switch (mode) {
case SINGLE_SELECTION:
return new ArrayList<>(asSingleSelectionModel().getSelectedSet());
case MULTI_SELECTION:
return asMultiSelectionModel().getSelectedList();
case NO_SELECTION:
default:
return Collections.emptyList();
}
}

/**
Expand All @@ -87,38 +113,42 @@ public T getFirstSelectedObject() {

/**
* @return Delegate selection model as {@link SingleSelectionModel}.
* Don't call this if {@link #singleSelectionOnly} is {@code false}.
* Call this if {@link #isSingleSelectionOnly()} is {@code true}.
*/
public SingleSelectionModel<T> asSingleSelectionModel() {
assert singleSelectionOnly : "singleSelectionOnly value mismatch"; //$NON-NLS-1$
assert isSingleSelectionOnly(): "singleSelectionOnly value mismatch"; //$NON-NLS-1$
return (SingleSelectionModel<T>) delegate;
}

/**
* @return Delegate selection model as {@link OrderedMultiSelectionModel}.
* Don't call this if {@link #singleSelectionOnly} is {@code true}.
* Call this if {@link #isMultiSelectionOnly()} is {@code true}.
*/
public OrderedMultiSelectionModel<T> asMultiSelectionModel() {
assert !singleSelectionOnly : "singleSelectionOnly value mismatch"; //$NON-NLS-1$
assert isMultiSelectionOnly() : "singleSelectionOnly value mismatch"; //$NON-NLS-1$
return (OrderedMultiSelectionModel<T>) delegate;
}

private boolean isMultiSelectionOnly() {
return mode.equals(Mode.MULTI_SELECTION);
}

public void setDataDisplay(HasData<T> dataDisplay) {
if (!isSingleSelectionOnly()) {
if (isMultiSelectionOnly()) {
asMultiSelectionModel().setDataDisplay(dataDisplay);
}
}

public boolean isSingleSelectionOnly() {
return singleSelectionOnly;
return mode.equals(Mode.SINGLE_SELECTION);
}

/**
* Turns multiple selection feature on or off. If the underlying selection model supports multi selection
* otherwise does nothing.
*/
public void setMultiSelectEnabled(boolean multiSelectEnabled) {
if (!isSingleSelectionOnly()) {
if (isMultiSelectionOnly()) {
asMultiSelectionModel().setMultiSelectEnabled(multiSelectEnabled);
}
}
Expand All @@ -128,7 +158,7 @@ public void setMultiSelectEnabled(boolean multiSelectEnabled) {
* otherwise does nothing.
*/
public void setMultiRangeSelectEnabled(boolean multiRangeSelectEnabled) {
if (!isSingleSelectionOnly()) {
if (isMultiSelectionOnly()) {
asMultiSelectionModel().setMultiRangeSelectEnabled(multiRangeSelectEnabled);
}
}
Expand Down

0 comments on commit 339abfa

Please sign in to comment.