/*
 * Licensed Materials - Property of Perforce Software, Inc. 
 * © Copyright Perforce Software, Inc. 2014, 2021 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

import java.awt.Dimension;

import ilog.views.IlvManagerView;
import ilog.views.IlvRect;
import ilog.views.IlvTransformer;
import ilog.views.tiling.IlvTileController;
import ilog.views.tiling.IlvTileLockFilter;

/**
 * A tile lock filter that does not allow more than N tiles to be loaded
 */
class TileFilter extends IlvTileLockFilter {
  /**
   * Internally stores the maximum number of tiles that can be locked
   */
  private int maxTileNum;

  /**
   * Constructs a new TileFilter to not lock more than specified number of tiles
   * 
   * @param maxTile
   *          maximum number of tiles that can be locked
   */
  public TileFilter(int maxTile) {
    super();
    maxTileNum = maxTile;
  }

  Override
  public boolean isLockAllowed(IlvTileController tileController, IlvManagerView view) {
    // get the size of the view
    Dimension size = view.getSize();

    // compute the corners of the view in the manager coordinate system
    IlvTransformer t = view.getTransformer();
    if (t == null)
      return true;
    IlvRect rect = new IlvRect(0, 0, size.width, size.height);
    t.inverse(rect);

    // compute the number of visible tiles
    int indexes[] = tileController.getTileIndexes(rect);
    int horizontalTiles = indexes[IlvTileController.RIGHT_COLUMN_INDEX] - indexes[IlvTileController.LEFT_COLUMN_INDEX]
        + 1;
    int verticalTiles = indexes[IlvTileController.LOWER_ROW_INDEX] - indexes[IlvTileController.UPPER_ROW_INDEX] + 1;
    if ((horizontalTiles * verticalTiles) > maxTileNum)
      return false;
    else
      return true;
  }

  Override
  public boolean isPersistent() {
    return false;
  }
}