001    package org.bukkit.event.player;
002    
003    import org.apache.commons.lang.Validate;
004    import org.bukkit.Bukkit;
005    import org.bukkit.entity.Player;
006    import org.bukkit.event.Cancellable;
007    import org.bukkit.event.HandlerList;
008    import org.bukkit.inventory.meta.BookMeta;
009    
010    /**
011     * Called when a player edits or signs a book and quill item. If the event is
012     * cancelled, no changes are made to the BookMeta
013     */
014    public class PlayerEditBookEvent extends PlayerEvent implements Cancellable {
015        private static final HandlerList handlers = new HandlerList();
016    
017        private final BookMeta previousBookMeta;
018        private final int slot;
019        private BookMeta newBookMeta;
020        private boolean isSigning;
021        private boolean cancel;
022    
023        public PlayerEditBookEvent(Player who, int slot, BookMeta previousBookMeta, BookMeta newBookMeta, boolean isSigning) {
024            super(who);
025    
026            Validate.isTrue(slot >= 0 && slot <=8, "Slot must be in range 0-8 inclusive");
027            Validate.notNull(previousBookMeta, "Previous book meta must not be null");
028            Validate.notNull(newBookMeta, "New book meta must not be null");
029    
030            Bukkit.getItemFactory().equals(previousBookMeta, newBookMeta);
031    
032            this.previousBookMeta = previousBookMeta;
033            this.newBookMeta = newBookMeta;
034            this.slot = slot;
035            this.isSigning = isSigning;
036            this.cancel = false;
037        }
038    
039        /**
040         * Gets the book meta currently on the book.
041         * <p>
042         * Note: this is a copy of the book meta. You cannot use this object to
043         * change the existing book meta.
044         *
045         * @return the book meta currently on the book
046         */
047        public BookMeta getPreviousBookMeta() {
048            return previousBookMeta.clone();
049        }
050    
051        /**
052         * Gets the book meta that the player is attempting to add to the book.
053         * <p>
054         * Note: this is a copy of the proposed new book meta. Use {@link
055         * #setNewBookMeta(BookMeta)} to change what will actually be added to the
056         * book.
057         *
058         * @return the book meta that the player is attempting to add
059         */
060        public BookMeta getNewBookMeta() {
061            return newBookMeta.clone();
062        }
063    
064        /**
065         * Gets the inventory slot number for the book item that triggered this
066         * event.
067         * <p>
068         * This is a slot number on the player's hotbar in the range 0-8.
069         *
070         * @return the inventory slot number that the book item occupies
071         */
072        public int getSlot() {
073            return slot;
074        }
075    
076        /**
077         * Sets the book meta that will actually be added to the book.
078         *
079         * @param newBookMeta new book meta
080         * @throws IllegalArgumentException if the new book meta is null
081         */
082        public void setNewBookMeta(BookMeta newBookMeta) throws IllegalArgumentException {
083            Validate.notNull(newBookMeta, "New book meta must not be null");
084            Bukkit.getItemFactory().equals(newBookMeta, null);
085            this.newBookMeta = newBookMeta.clone();
086        }
087    
088        /**
089         * Gets whether or not the book is being signed. If a book is signed the
090         * Material changes from BOOK_AND_QUILL to WRITTEN_BOOK.
091         *
092         * @return true if the book is being signed
093         */
094        public boolean isSigning() {
095            return isSigning;
096        }
097    
098        /**
099         * Sets whether or not the book is being signed. If a book is signed the
100         * Material changes from BOOK_AND_QUILL to WRITTEN_BOOK.
101         *
102         * @param signing whether or not the book is being signed.
103         */
104        public void setSigning(boolean signing) {
105            isSigning = signing;
106        }
107    
108        @Override
109        public HandlerList getHandlers() {
110            return handlers;
111        }
112    
113        public static HandlerList getHandlerList() {
114            return handlers;
115        }
116    
117        public boolean isCancelled() {
118            return cancel;
119        }
120    
121        public void setCancelled(boolean cancel) {
122            this.cancel = cancel;
123        }
124    }