/* * Copyright 2000-2016 Vaadin Ltd. * * 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. */ package com.vaadin.v7.shared.ui.grid; import java.io.Serializable; import java.util.Comparator; import com.vaadin.shared.Connector; /** * A description of an indexing modification for a connector. This is used by * Grid for internal bookkeeping updates. * * @since 7.5.0 * @author Vaadin Ltd */ public class DetailsConnectorChange implements Serializable { public static final Comparator<DetailsConnectorChange> REMOVED_FIRST_COMPARATOR = new Comparator<DetailsConnectorChange>() { @Override public int compare(DetailsConnectorChange a, DetailsConnectorChange b) { boolean deleteA = a.getNewIndex() == null; boolean deleteB = b.getNewIndex() == null; if (deleteA && !deleteB) { return -1; } else if (!deleteA && deleteB) { return 1; } else { return 0; } } }; private Connector connector; private Integer oldIndex; private Integer newIndex; private boolean shouldStillBeVisible; /** Create a new connector index change */ public DetailsConnectorChange() { } /** * Convenience constructor for setting all the fields in one line. * <p> * Calling this constructor will also assert that the state of the pojo is * consistent by internal assumptions. * * @param connector * the changed connector * @param oldIndex * the old index * @param newIndex * the new index * @param shouldStillBeVisible * details should be visible regardless of {@code connector} */ public DetailsConnectorChange(Connector connector, Integer oldIndex, Integer newIndex, boolean shouldStillBeVisible) { this.connector = connector; this.oldIndex = oldIndex; this.newIndex = newIndex; this.shouldStillBeVisible = shouldStillBeVisible; assert assertStateIsOk(); } private boolean assertStateIsOk() { boolean connectorAndNewIndexIsNotNull = connector != null && newIndex != null; boolean connectorAndNewIndexIsNullThenOldIndexIsSet = connector == null && newIndex == null && oldIndex != null; assert (connectorAndNewIndexIsNotNull || connectorAndNewIndexIsNullThenOldIndexIsSet) : "connector: " + nullityString(connector) + ", oldIndex: " + nullityString(oldIndex) + ", newIndex: " + nullityString(newIndex); return true; } private static String nullityString(Object object) { return object == null ? "null" : "non-null"; } /** * Gets the old index for the connector. * <p> * If <code>null</code>, the connector is recently added. This means that * {@link #getConnector()} is expected not to return <code>null</code>. * * @return the old index for the connector */ public Integer getOldIndex() { assert assertStateIsOk(); return oldIndex; } /** * Gets the new index for the connector. * <p> * If <code>null</code>, the connector should be removed. This means that * {@link #getConnector()} is expected to return <code>null</code> as well. * * @return the new index for the connector */ public Integer getNewIndex() { assert assertStateIsOk(); return newIndex; } /** * Gets the changed connector. * * @return the changed connector. Might be <code>null</code> */ public Connector getConnector() { assert assertStateIsOk(); return connector; } /** * Sets the changed connector. * * @param connector * the changed connector. May be <code>null</code> */ public void setConnector(Connector connector) { this.connector = connector; } /** * Sets the old index * * @param oldIndex * the old index. May be <code>null</code> if a new connector is * being inserted */ public void setOldIndex(Integer oldIndex) { this.oldIndex = oldIndex; } /** * Sets the new index * * @param newIndex * the new index. May be <code>null</code> if a connector is * being removed */ public void setNewIndex(Integer newIndex) { this.newIndex = newIndex; } /** * Checks whether whether the details should remain open, even if connector * might be <code>null</code>. * * @return <code>true</code> iff the details should remain open, even if * connector might be <code>null</code> */ public boolean isShouldStillBeVisible() { return shouldStillBeVisible; } /** * Sets whether the details should remain open, even if connector might be * <code>null</code>. * * @param shouldStillBeVisible * <code>true</code> iff the details should remain open, even if * connector might be <code>null</code> */ public void setShouldStillBeVisible(boolean shouldStillBeVisible) { this.shouldStillBeVisible = shouldStillBeVisible; } }