/*******************************************************************************
* 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.HashMap;
import java.util.Map;
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.racbuilder.AbstractHolderBuilder;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.util.items.ItemMetaUtils;
import de.tobiyas.util.inventorymenu.BasicSelectionInterface;
import de.tobiyas.util.inventorymenu.stats.DoubleSelectionInterface;
import de.tobiyas.util.inventorymenu.stats.StringSelectionInterface;
public class HolderGeneralBuilderInterface extends BasicSelectionInterface {
private static final String emptyName = "<EMPTY>";
/**
* The Path to the Name of the Holder
*/
private static final String NAME_PATH = "name";
/**
* The Path to the Health bonus.
*/
private static final String HEALTH_PATH = "health";
/**
* The Path to the Callback Tag of the Holder
*/
private static final String TAG_PATH = "tag";
/**
* The name selection item
*/
private final ItemStack nameSelector;
/**
* The Health selector
*/
private final ItemStack healthSelector;
/**
* The Tag selector Item
*/
private final ItemStack tagSelector;
/**
* The Trait selector Item
*/
private final ItemStack traitSelector;
/**
* The Map to put callback values into.
*/
protected final Map<String, Object> callbackMap;
/**
* The Value modified to set on callback
*/
protected String currentModifiedValue = null;
/**
* The Builder to build this holders
*/
protected final AbstractHolderBuilder builder;
public HolderGeneralBuilderInterface(Player player,
BasicSelectionInterface parent, AbstractHolderBuilder builder, RacesAndClasses plugin) {
super(player, parent, "Controls", "Build Your Holder", plugin);
this.callbackMap = new HashMap<String, Object>();
this.builder = builder;
nameSelector = generateItem(Material.BAKED_POTATO, ChatColor.RED + "Holder Name: ", emptyName);
tagSelector = generateItem(Material.BAKED_POTATO, ChatColor.RED + "Holder Tag: ", emptyName);
healthSelector = generateItem(Material.BAKED_POTATO, ChatColor.RED + "Health: ", "");
traitSelector = generateItem(Material.ANVIL, ChatColor.RED + "Edit Traits", "");
redraw();
}
/**
* Rebuilds the Items from the
*/
protected void rebuildFromBuilder(){
String name = builder.getName();
if(name == null) name = emptyName;
ItemMetaUtils.replaceLoreWith(nameSelector, "Holder Name: " + name);
String tag = builder.getHolderTag();
if(tag == null) tag = emptyName;
ItemMetaUtils.replaceLoreWith(tagSelector, "Holder Tag: " + tag);
double health = builder.getHealth();
ItemMetaUtils.replaceLoreWith(healthSelector, "Holder health: " + health);
ItemMetaUtils.replaceLoreWith(traitSelector, "Traits:");
for(Trait trait : builder.getTraits()){
ItemMetaUtils.addStringToLore(traitSelector, trait.getName());
}
}
/**
* Redraws the GUI.
* Also rebuilds the items from the Builder
*/
protected void redraw(){
rebuildFromBuilder();
selectionInventory.setItem(2, nameSelector);
selectionInventory.setItem(3, tagSelector);
selectionInventory.setItem(5, healthSelector);
selectionInventory.setItem(7, traitSelector);
}
@Override
protected boolean onBackPressed() {
return true;
}
@Override
protected void onAcceptPressed() {
builder.setReadyForBuilding(true);
}
@Override
protected void onSelectionItemPressed(ItemStack item) {
if(nameSelector.equals(item)){
editName();
return;
}
if(tagSelector.equals(item)){
editTag();
return;
}
if(healthSelector.equals(item)){
editHealth();
return;
}
if(traitSelector.equals(item)){
editTraits();
return;
}
}
/**
* Schedules opening of a String Selection
* to get a new Name.
*/
private void editName(){
this.currentModifiedValue = NAME_PATH;
this.callbackMap.put(currentModifiedValue, builder.getName());
openNewView(new StringSelectionInterface(player, this, callbackMap, currentModifiedValue, plugin));
}
/**
* Schedules opening of a String Selection
* to get a new Tag.
*/
private void editTag(){
this.currentModifiedValue = TAG_PATH;
this.callbackMap.put(currentModifiedValue, builder.getName());
openNewView(new StringSelectionInterface(player, this, callbackMap, currentModifiedValue, plugin));
}
/**
* Schedules opening of a Double Selection
* to get a new Health
*/
private void editHealth(){
this.currentModifiedValue = HEALTH_PATH;
this.callbackMap.put(currentModifiedValue, builder.getHealth());
openNewView(new DoubleSelectionInterface(player, this, callbackMap, currentModifiedValue, plugin));
}
/**
* Schedules opening of the Trait edit window
* to edit Traits.
*/
private void editTraits(){
this.currentModifiedValue = null;
openNewView(new HolderBuildInterface(player, this, builder, (RacesAndClasses) plugin));
}
@Override
protected void onControlItemPressed(ItemStack item) {
}
@Override
protected void notifyReopened() {
super.notifyReopened();
if(currentModifiedValue == null) return;
if(currentModifiedValue == NAME_PATH){
String newName = (String) callbackMap.get(NAME_PATH);
builder.setName(newName);
redraw();
return;
}
if(currentModifiedValue == TAG_PATH){
String newTag = (String) callbackMap.get(TAG_PATH);
builder.setHolderTag(newTag);
redraw();
return;
}
if(currentModifiedValue == HEALTH_PATH){
double newHealth = (Double) callbackMap.get(HEALTH_PATH);
builder.setHealth(newHealth);
redraw();
return;
}
}
}