/*
 * Copyright 2010 Google Inc.
 * 
 * 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.google.gwt.view.client;

import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;

/**
 * A selection model that does not allow selection, but fires selection change
 * events. Use this model if you want to know when a user selects an item, but
 * do not want the view to update based on the selection.
 * 
 * @param <T> the record data type
 */
public class NoSelectionModel<T> extends AbstractSelectionModel<T> {

  private Object lastKey;
  private T lastSelection;
  
  /**
   * Constructs a NoSelectionModel without a key provider.
   */
  public NoSelectionModel() {
    super(null);
  }
  
  /**
   * Constructs a NoSelectionModel with the given key provider.
   *
   * @param keyProvider an instance of ProvidesKey<T>, or null if the record
   *        object should act as its own key
   */
  public NoSelectionModel(ProvidesKey<T> keyProvider) {
    super(keyProvider);
  }

  /**
   * Gets the object that was last selected.
   * 
   * @return the last selected object
   */
  public T getLastSelectedObject() {
    return lastSelection;
  }

  public boolean isSelected(T object) {
    return false;
  }

  public void setSelected(T object, boolean selected) {
    Object key = getKey(object);
    if (selected) {
      lastSelection = object;
      lastKey = key;
    } else if (lastKey != null && lastKey.equals(key)) {
      lastSelection = null;
      lastKey = null;
    }
    scheduleSelectionChangeEvent();
  }
}
