/*
 * 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.event.shared.HandlerRegistration;
import com.google.gwt.event.shared.HasHandlers;

/**
 * Describes an object that displays a range of rows.
 */
public interface HasRows extends HasHandlers {

  /**
   * Add a {@link RangeChangeEvent.Handler}.
   *
   * @param handler the handler
   * @return a {@link HandlerRegistration} to remove the handler
   */
  HandlerRegistration addRangeChangeHandler(RangeChangeEvent.Handler handler);

  /**
   * Add a {@link RowCountChangeEvent.Handler}.
   *
   * @param handler the handler
   * @return a {@link HandlerRegistration} to remove the handler
   */
  HandlerRegistration addRowCountChangeHandler(
      RowCountChangeEvent.Handler handler);

  /**
   * Get the total count of all rows.
   *
   * @return the total row count
   */
  int getRowCount();

  /**
   * Get the range of visible rows.
   *
   * @return the visible range
   */
  Range getVisibleRange();

  /**
   * Check if the total row count is exact, or an estimate.
   *
   * @return true if exact, false if an estimate
   */
  boolean isRowCountExact();

  /**
   * Set the exact total count of all rows. This method defers to
   * {@link #setRowCount(int, boolean)}.
   *
   * @param count the exact total count
   */
  void setRowCount(int count);

  /**
   * Set the total count of all rows, specifying whether the count is exact or
   * an estimate.
   *
   * @param count the total count
   * @param isExact true if the count is exact, false if an estimate
   */
  void setRowCount(int count, boolean isExact);

  /**
   * Set the visible range or rows. This method defers to
   * {@link #setVisibleRange(Range)}.
   *
   * @param start the start index
   * @param length the length
   */
  // TODO(jlabanca): Should we include setPageStart/Size as shortcut methods?
  void setVisibleRange(int start, int length);

  /**
   * Set the visible range or rows.
   *
   * @param range the visible range
   */
  void setVisibleRange(Range range);
}
