/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-API/src/main/java/org/bukkit/event/player/PlayerEditBookEvent.java
package org.bukkit.event.player;

import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.meta.BookMeta;

/**
 * Called when a player edits or signs a book and quill item. If the event is
 * cancelled, no changes are made to the BookMeta
 */
public class PlayerEditBookEvent extends PlayerEvent implements Cancellable {
	private static final HandlerList handlers = new HandlerList();

	private final BookMeta previousBookMeta;
	private final int slot;
	private BookMeta newBookMeta;
	private boolean isSigning;
	private boolean cancel;

	public PlayerEditBookEvent(Player who, int slot, BookMeta previousBookMeta, BookMeta newBookMeta,
			boolean isSigning) {
		super(who);

		Validate.isTrue(slot >= 0 && slot <= 8, "Slot must be in range 0-8 inclusive");
		Validate.notNull(previousBookMeta, "Previous book meta must not be null");
		Validate.notNull(newBookMeta, "New book meta must not be null");

		Bukkit.getItemFactory().equals(previousBookMeta, newBookMeta);

		this.previousBookMeta = previousBookMeta;
		this.newBookMeta = newBookMeta;
		this.slot = slot;
		this.isSigning = isSigning;
		this.cancel = false;
	}

	/**
	 * Gets the book meta currently on the book.
	 * <p>
	 * Note: this is a copy of the book meta. You cannot use this object to change
	 * the existing book meta.
	 *
	 * @return the book meta currently on the book
	 */
	public BookMeta getPreviousBookMeta() {
		return previousBookMeta.clone();
	}

	/**
	 * Gets the book meta that the player is attempting to add to the book.
	 * <p>
	 * Note: this is a copy of the proposed new book meta. Use
	 * {@link #setNewBookMeta(BookMeta)} to change what will actually be added to
	 * the book.
	 *
	 * @return the book meta that the player is attempting to add
	 */
	public BookMeta getNewBookMeta() {
		return newBookMeta.clone();
	}

	/**
	 * Gets the inventory slot number for the book item that triggered this event.
	 * <p>
	 * This is a slot number on the player's hotbar in the range 0-8.
	 *
	 * @return the inventory slot number that the book item occupies
	 */
	public int getSlot() {
		return slot;
	}

	/**
	 * Sets the book meta that will actually be added to the book.
	 *
	 * @param newBookMeta new book meta
	 * @throws IllegalArgumentException if the new book meta is null
	 */
	public void setNewBookMeta(BookMeta newBookMeta) throws IllegalArgumentException {
		Validate.notNull(newBookMeta, "New book meta must not be null");
		Bukkit.getItemFactory().equals(newBookMeta, null);
		this.newBookMeta = newBookMeta.clone();
	}

	/**
	 * Gets whether or not the book is being signed. If a book is signed the
	 * Material changes from BOOK_AND_QUILL to WRITTEN_BOOK.
	 *
	 * @return true if the book is being signed
	 */
	public boolean isSigning() {
		return isSigning;
	}

	/**
	 * Sets whether or not the book is being signed. If a book is signed the
	 * Material changes from BOOK_AND_QUILL to WRITTEN_BOOK.
	 *
	 * @param signing whether or not the book is being signed.
	 */
	public void setSigning(boolean signing) {
		isSigning = signing;
	}

	@Override
	public HandlerList getHandlers() {
		return handlers;
	}

	public static HandlerList getHandlerList() {
		return handlers;
	}

	public boolean isCancelled() {
		return cancel;
	}

	public void setCancelled(boolean cancel) {
		this.cancel = cancel;
	}
}
