/*******************************************************************************
* 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.holders;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.racbuilder.AbstractHolderBuilder;
import de.tobiyas.racesandclasses.racbuilder.gui.trait.TraitBuilderInterface;
import de.tobiyas.racesandclasses.racbuilder.gui.trait.TraitConfigOptionContainer;
import de.tobiyas.racesandclasses.traitcontainer.container.TraitsList;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.AbstractBasicTrait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.util.items.ItemMetaUtils;
import de.tobiyas.racesandclasses.util.traitutil.TraitConfiguration;
import de.tobiyas.util.inventorymenu.BasicSelectionInterface;
import de.tobiyas.util.inventorymenu.elements.ScrollableItems;
import de.tobiyas.util.inventorymenu.stats.StatType;
public class HolderBuildInterface extends BasicSelectionInterface {
/**
* The Traits the holders already has.
*/
protected ScrollableItems holderTraits;
/**
* The Traits the holders can still use.
*/
protected ScrollableItems possibleTraits;
/**
* The builder to build this Holder
*/
protected final AbstractHolderBuilder builder;
/**
* The List to check after returning
*/
protected List<TraitConfigOptionContainer> currentTraitEditingList;
/**
* The Name currently editing
*/
protected String currentTraitName;
public HolderBuildInterface(Player player, BasicSelectionInterface parent, AbstractHolderBuilder builder, RacesAndClasses plugin) {
super(player, parent, plugin);
this.builder = builder;
holderTraits = new ScrollableItems(selectionInventory, 0, 8, 0);
possibleTraits = new ScrollableItems(controlInventory, 0, 8, 1);
populateFromBuilder();
}
/**
* populates the Lists from the Builder
*/
@SuppressWarnings("unchecked")
private void populateFromBuilder(){
possibleTraits.clear();
holderTraits.clear();
List<ItemStack> itemsToAdd = new LinkedList<ItemStack>();
for(Trait trait : builder.getTraits()){
ItemStack traitItem = new ItemStack(Material.SKULL_ITEM);
ItemMetaUtils.setDisplayNameOfItem(traitItem, ChatColor.RED + trait.getName());
List<String> helpList = new LinkedList<String>();
try{
Class<? extends Trait> clazz = TraitsList.getClassOfTrait(trait.getName());
if(clazz == null){
break;
}
helpList = (List<String>) clazz.getMethod("getHelpForTrait").invoke(clazz);
}catch(Exception exp){
helpList.add("No help found.");
}
for(String line : helpList){
ItemMetaUtils.addStringToLore(traitItem, line);
}
ItemMetaUtils.addStringToLore(traitItem, "ConfigTotal:");
ItemMetaUtils.addStringToLore(traitItem, trait.getPrettyConfiguration());
itemsToAdd.add(traitItem);
}
holderTraits.addItems(itemsToAdd);
itemsToAdd = new LinkedList<ItemStack>();
List<String> alreadyPresentInList = new LinkedList<String>();
for(String traitName : TraitsList.getAllVisibleTraits()){
boolean skip = false;
for(ItemStack item : holderTraits.getAllItems()){
if(item.getItemMeta().hasDisplayName() &&
item.getItemMeta().getDisplayName().contains(traitName)){
skip = true;
break;
}
}
if(skip) continue;
if(alreadyPresentInList.contains(traitName)){
continue;
}
List<String> helpList = new LinkedList<String>();
try{
Class<? extends Trait> clazz = TraitsList.getClassOfTrait(traitName);
if(clazz == null){
break;
}
helpList = (List<String>) clazz.getMethod("getHelpForTrait").invoke(clazz);
}catch(Exception exp){
helpList.add("No help found.");
}
ItemStack traitItem = new ItemStack(Material.SKULL_ITEM);
ItemMetaUtils.setDisplayNameOfItem(traitItem, ChatColor.RED + traitName);
for(String helpString : helpList){
ItemMetaUtils.addStringToLore(traitItem, helpString);
}
itemsToAdd.add(traitItem);
alreadyPresentInList.add(traitName);
}
possibleTraits.addItems(itemsToAdd);
}
@Override
protected boolean onBackPressed() {
return true;
}
@Override
protected void onAcceptPressed() {
performSave();
closeAndReturnToParent();
}
/**
* Saves the builder
*/
private void performSave(){
builder.setReadyForBuilding(true);
}
@Override
protected void onSelectionItemPressed(ItemStack item) {
if(holderTraits.checkScrollButtons(item)) return;
ItemMeta meta = item.getItemMeta();
if(meta.hasDisplayName()){
String traitName = meta.getDisplayName();
traitName = traitName.substring(2, traitName.length());
for(Trait trait : builder.getTraits()){
if(trait.getName().equalsIgnoreCase(traitName)){
currentTraitEditingList = loadFromTrait(trait);
currentTraitName = trait.getName();
openNewView(new TraitBuilderInterface(player, this, trait.getName(), currentTraitEditingList, (RacesAndClasses) plugin));
return;
}
}
}
}
/**
* Builds the List of TraitOptions from the passed Trait
*
* @param trait
* @return
*/
private List<TraitConfigOptionContainer> loadFromTrait(Trait trait){
List<TraitConfigOptionContainer> configOptions = new LinkedList<TraitConfigOptionContainer>();
if(!(trait instanceof AbstractBasicTrait) ) return configOptions;
Map<String, Object> traitconfigMap = trait.getCurrentconfig();
if(traitconfigMap == null) return configOptions;
for(String key : traitconfigMap.keySet()){
Object value = traitconfigMap.get(key);
ItemStack item = generateItem(Material.ANVIL, key, value.toString());
TraitConfigOptionContainer newOptions = new TraitConfigOptionContainer(key, StatType.getTypeFromClass(value.getClass()), item);
newOptions.setValue(value);
configOptions.add(newOptions);
}
return configOptions;
}
@Override
protected void onControlItemPressed(ItemStack item) {
if(possibleTraits.checkScrollButtons(item)) return;
ItemMeta meta = item.getItemMeta();
if(meta.hasDisplayName()){
String traitName = meta.getDisplayName();
traitName = traitName.substring(2, traitName.length());
currentTraitName = traitName;
currentTraitEditingList = new LinkedList<TraitConfigOptionContainer>();
openNewView(new TraitBuilderInterface(player, this, traitName, currentTraitEditingList, (RacesAndClasses) plugin));
}
}
@Override
protected void notifyReopened() {
super.notifyReopened();
TraitConfiguration configMap = new TraitConfiguration(null);
for(TraitConfigOptionContainer container : currentTraitEditingList){
if(!container.isValueSet()){
return;
}
configMap.put(container.getName(), container.getValue());
}
builder.addTrait(currentTraitName, configMap);
populateFromBuilder();
}
}