/******************************************************************************* * Copyright 2014 Tobias Welther * * 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 de.tobiyas.racesandclasses.racbuilder.gui.holdermanager; import java.util.LinkedList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractHolderManager; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractTraitHolder; import de.tobiyas.racesandclasses.racbuilder.AbstractHolderBuilder; import de.tobiyas.racesandclasses.racbuilder.gui.holders.HolderGeneralBuilderInterface; import de.tobiyas.racesandclasses.racbuilder.gui.holders.HolderSelectionState; import de.tobiyas.util.inventorymenu.BasicSelectionInterface; public abstract class HolderSelectionInterface extends BasicSelectionInterface { private final int currentStateField = 32; /** * The Add Button */ protected final ItemStack addHolderSelector; /** * The Edit Button */ protected final ItemStack editHolderSelector; /** * The Remove Button */ protected final ItemStack removeHolderSelector; /** * The Item indicating the current State */ protected final ItemStack currentStateIndicator; /** * The Builder to check if something new has arrived. */ protected AbstractHolderBuilder builder; /** * The HolderManager to get all Holders from */ protected final AbstractHolderManager holderManager; /** * An Link between Holder -> Item */ protected final List<HolderItemContainer> holderContainers; /** * The current state of the GUI. */ protected HolderSelectionState currentState = HolderSelectionState.EDIT; /** * Creates a Selection Inventory to Select A Holder. * * @param player * @param parents * @param holderManager */ public HolderSelectionInterface(Player player, BasicSelectionInterface parent, AbstractHolderManager holderManager, RacesAndClasses plugin) { super(player, parent, "Controls", holderManager.getContainerTypeAsString(), plugin); this.holderManager = holderManager; this.holderContainers = new LinkedList<HolderItemContainer>(); String holderTypeName = holderManager.getContainerTypeAsString(); this.addHolderSelector = generateItem(Material.DIAMOND, ChatColor.GREEN + "Add " + holderTypeName, ChatColor.LIGHT_PURPLE + "Adds a new " + holderTypeName); this.editHolderSelector = generateItem(Material.SPONGE, ChatColor.YELLOW + "Edit " + holderTypeName, ChatColor.LIGHT_PURPLE + "Edits an existing " + holderTypeName); this.removeHolderSelector = generateItem(Material.FIRE, ChatColor.RED + "Remove " + holderTypeName, ChatColor.LIGHT_PURPLE + "Removes an existing " + holderTypeName); this.currentStateIndicator = generateItem(Material.SPONGE, ChatColor.AQUA + "Current Operation", new LinkedList<String>()); this.controlInventory.setItem(2, this.addHolderSelector); this.controlInventory.setItem(5, this.editHolderSelector); this.controlInventory.setItem(6, this.removeHolderSelector); this.controlInventory.setItem(currentStateField, this.currentStateIndicator); createHolders(); redrawHolderList(); } /** * Creates an Item and adds it to the Selection Inventory. */ private void createHolders(){ for(String holderName : this.holderManager.listAllVisibleHolders()){ AbstractTraitHolder holder = holderManager.getHolderByName(holderName); AbstractHolderBuilder builder = generateHolderBuilderFor(holder); if(holder != null){ HolderItemContainer container = new HolderItemContainer(builder); container.getBuilder().setReadyForBuilding(true); this.holderContainers.add(container); } } } /** * Redraws the Holder from the list internally of holders. */ private void redrawHolderList() { selectionInventory.clear(); List<HolderItemContainer> toRemove = new LinkedList<HolderItemContainer>(); for(HolderItemContainer container: holderContainers){ if(!container.getBuilder().isReadyForBuilding()){ toRemove.add(container); continue; } if(container != null){ container.rebuildItem(); this.selectionInventory.addItem(container.getItemRepresentation()); } } for(HolderItemContainer remove : toRemove){ holderContainers.remove(remove); } } @Override protected boolean onBackPressed() { return true; } @Override protected void onAcceptPressed() { saveBuilders(); } /** * */ private void saveBuilders(){ for( HolderItemContainer holder : holderContainers){ AbstractHolderBuilder builder = holder.getBuilder(); builder.saveToFile(); } } @Override protected void onSelectionItemPressed(ItemStack item) { for(HolderItemContainer holder: holderContainers){ if(holder.getItemRepresentation().equals(item) && holder.getBuilder().isReadyForBuilding()){ holderPressed(holder); } } } @Override protected void onControlItemPressed(ItemStack item) { if(item.equals(this.currentStateIndicator)){ //indicator does not do anything return; } if(item.equals(addHolderSelector)){ scheduleAdd(); return; } if(item.equals(editHolderSelector)){ changeState(HolderSelectionState.EDIT); return; } if(item.equals(removeHolderSelector)){ changeState(HolderSelectionState.REMOVE); return; } } /** * Changes the currentState to the one wanted * * @param newState */ private void changeState(HolderSelectionState newState) { if(newState == currentState) return; currentState = newState; switch (newState) { case REMOVE: currentStateIndicator.setType(removeHolderSelector.getType()); break; case EDIT: currentStateIndicator.setType(editHolderSelector.getType()); break; } controlInventory.setItem(currentStateField, null); controlInventory.setItem(currentStateField, currentStateIndicator); } /** * This is called when an Holder is pressed. * * @param holders that is pressed. */ private void holderPressed(HolderItemContainer container){ switch(currentState){ case EDIT: editHolder(container); break; case REMOVE: removeHolder(container); break; } } /** * Opens an Edit Frame for the current Holder * * @param holders */ private void editHolder(HolderItemContainer holder){ builder = holder.getBuilder(); openNewView(new HolderGeneralBuilderInterface(player, this, builder, (RacesAndClasses) plugin)); } /** * Removes the Race * * @param holders */ private void removeHolder(HolderItemContainer holder){ holderContainers.remove(holder); redrawHolderList(); } /** * Indicates that the Add Button is clicked */ private void scheduleAdd() { builder = generateNewHolderBuilder("<No Name>"); HolderItemContainer container = new HolderItemContainer(builder); holderContainers.add(container); openNewView(new HolderGeneralBuilderInterface(player, this, builder, (RacesAndClasses) plugin)); } /** * Generates a new HolderBuilder * * @param name * @return */ protected abstract AbstractHolderBuilder generateNewHolderBuilder(String name); /** * Generates a {@link AbstractHolderBuilder} for the Holder passed. * * @param holders * @return */ protected abstract AbstractHolderBuilder generateHolderBuilderFor(AbstractTraitHolder holder); @Override protected void notifyReopened() { if(builder != null && builder.isReadyForBuilding()){ redrawHolderList(); builder = null; } } }