* NEW: ActionGui: Added documentation.

This commit is contained in:
Adrien Prokopowicz 2015-08-31 21:31:57 +02:00
parent 54931ae078
commit efd62283ea

View File

@ -31,39 +31,107 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
/**
* This class implements an action-based GUI.
* Actions are buttons which trigger an event when getting clicked on by the user.
* They are represented by (customizable) items, which are immutable by the user.
*
* Events handlers are (usually private) methods implemented in the derived
* class(es). They are named using the pattern 'action_[action name]', and
* are called when the associated action is triggered.
*/
abstract public class ActionGui extends Gui abstract public class ActionGui extends Gui
{ {
/**
* The prefix for action handlers.
*/
static private final String ACTION_HANDLER_NAME = "action_"; static private final String ACTION_HANDLER_NAME = "action_";
/**
* The class of this GUI.
* Useful to retreive methods from the derived classes.
*/
private final Class<? extends ActionGui> guiClass = this.getClass(); private final Class<? extends ActionGui> guiClass = this.getClass();
/**
* A map containing all the actions defined by the derived class, indexed by
* their position in the inventory.
*/
private final HashMap<Integer, Action> actions = new HashMap<>(); private final HashMap<Integer, Action> actions = new HashMap<>();
/* ===== Protected API ===== */ /* ===== Protected API ===== */
/**
* Creates a new action, represented by the given item.
* The item's metadata is changed to use the given title and lore.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
* @param material The material used to represent the action.
* @param title The title the item will show.
* @param loreLines The lore the item will show.
*/
protected void action(String name, int slot, Material material, String title, String ... loreLines) protected void action(String name, int slot, Material material, String title, String ... loreLines)
{ {
action(name, slot, new ItemStack(material), title, Arrays.asList(loreLines)); action(name, slot, new ItemStack(material), title, Arrays.asList(loreLines));
} }
/**
* Creates a new action, represented by the given item.
* The item's metadata is changed to use the given title and lore.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
* @param item The item used to represent the action.
* @param title The title the item will show.
* @param loreLines The lore the item will show.
*/
protected void action(String name, int slot, ItemStack item, String title, String ... loreLines) protected void action(String name, int slot, ItemStack item, String title, String ... loreLines)
{ {
action(name, slot, item, title, Arrays.asList(loreLines)); action(name, slot, item, title, Arrays.asList(loreLines));
} }
/**
* Creates a new action, represented by the given item.
* The item's metadata is changed to use the given title and lore.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
* @param item The item used to represent the action.
* @param title The title the item will show.
* @param loreLines The lore the item will show.
*/
protected void action(String name, int slot, ItemStack item, String title, List<String> loreLines) protected void action(String name, int slot, ItemStack item, String title, List<String> loreLines)
{ {
action(name, slot, GuiUtils.makeItem(item, title, loreLines)); action(name, slot, GuiUtils.makeItem(item, title, loreLines));
} }
/**
* Creates a new action, represented by the given material.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
* @param material The material used to represent the action.
*/
protected void action(String name, int slot, Material material) protected void action(String name, int slot, Material material)
{ {
action(name, slot, GuiUtils.makeItem(material)); action(name, slot, GuiUtils.makeItem(material));
} }
/**
* Creates a new action, represented by no item.
* This action will not be rendered to the user until {@link #updateAction(java.lang.String, org.bukkit.inventory.ItemStack, java.lang.String)
* } is called.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
*/
protected void action(String name, int slot) protected void action(String name, int slot)
{ {
action(name, slot, (ItemStack)null); action(name, slot, (ItemStack)null);
} }
/**
* Creates a new action, and adds it to the GUI.
* @param name The identifier of the action.
* @param slot The slot the action will be placed on.
* @param item The item used to represent the action.
*/
protected void action(String name, int slot, ItemStack item) protected void action(String name, int slot, ItemStack item)
{ {
if(slot > getSize() || slot < 0) if(slot > getSize() || slot < 0)
@ -72,17 +140,34 @@ abstract public class ActionGui extends Gui
action(new Action(name, slot, item, getActionHandler(guiClass, name))); action(new Action(name, slot, item, getActionHandler(guiClass, name)));
} }
/**
* Adds an action to the GUI.
* @param action
*/
private void action(Action action) private void action(Action action)
{ {
actions.put(action.slot, action); actions.put(action.slot, action);
} }
/**
* Updates the action represented by the given name.
* @param name The name of the action to update.
* @param item The new material to affect to the action.
* @param title The new title to affect to the action.
* @throws IllegalArgumentException If no action has the given name.
*/
protected void updateAction(String name, Material item, String title) protected void updateAction(String name, Material item, String title)
{ {
updateAction(name, new ItemStack(item), title); updateAction(name, new ItemStack(item), title);
} }
/**
* Updates the action represented by the given name.
* @param name The name of the action to update.
* @param item The new item to affect to the action.
* @param title The new title to affect to the action.
* @throws IllegalArgumentException If no action has the given name.
*/
protected void updateAction(String name, ItemStack item, String title) protected void updateAction(String name, ItemStack item, String title)
{ {
Action action = getAction(name); Action action = getAction(name);
@ -92,7 +177,13 @@ abstract public class ActionGui extends Gui
item.setItemMeta(meta); item.setItemMeta(meta);
} }
private Action getAction(String name) /**
* Retreives the action represented by the given name.
* @param name The name of the action to retreive.
* @return The action represented by the given name.
* @throws IllegalArgumentException If no action has the given name.
*/
private Action getAction(String name) throws IllegalArgumentException
{ {
for(Action action : actions.values()) for(Action action : actions.values())
{ {
@ -101,9 +192,19 @@ abstract public class ActionGui extends Gui
throw new IllegalArgumentException("Unknown action name : " + name); throw new IllegalArgumentException("Unknown action name : " + name);
} }
/**
* Raised when the Gui needs to be updated.
* Use this method to create your actions.
*/
@Override @Override
protected abstract void onUpdate(); protected abstract void onUpdate();
/**
* Raised when an action whithout any event handler has been triggered.
* @param name The name of the triggered action.
* @param slot The slot of the action.
* @param item The item of the action.
*/
protected void onAction_unknown(String name, int slot, ItemStack item){} protected void onAction_unknown(String name, int slot, ItemStack item){}
@Override @Override
@ -135,6 +236,10 @@ abstract public class ActionGui extends Gui
callAction(actions.get(event.getRawSlot())); callAction(actions.get(event.getRawSlot()));
} }
/**
* Triggers the given action's event handler.
* @param action The action to trigger.
*/
private void callAction(Action action) private void callAction(Action action)
{ {
if(action == null) return; if(action == null) return;
@ -159,6 +264,12 @@ abstract public class ActionGui extends Gui
} }
} }
/**
* Retreives the event handler matching the given name from a class (or any of its parents).
* @param klass The class to retreive the event handler from.
* @param name The name of the action.
* @return The event handler matching the action name, or null if none was found.
*/
private Method getActionHandler(Class klass, String name) private Method getActionHandler(Class klass, String name)
{ {
Method callback = null; Method callback = null;
@ -181,17 +292,34 @@ abstract public class ActionGui extends Gui
return callback; return callback;
} }
/**
* @return if this GUI has any actions defined.
*/
protected boolean hasActions() protected boolean hasActions()
{ {
return !actions.isEmpty(); return !actions.isEmpty();
} }
/**
* This structure represents an action.
*/
static private class Action static private class Action
{ {
/**
* The name of the action.
*/
public String name; public String name;
/**
* The slot the action will be put in.
*/
public int slot; public int slot;
/**
* The item this action will be represented by.
*/
public ItemStack item; public ItemStack item;
/**
* The callback this action will call when triggered.
*/
public Method callback; public Method callback;
public Action(String name, int slot, ItemStack item, Method callback) public Action(String name, int slot, ItemStack item, Method callback)