Add search button to the CommonPagedPanel.

Search button will allow to search elements if there are more than displayed elements.
This commit is contained in:
BONNe 2021-09-20 15:14:42 +03:00
parent 8c9ddb189d
commit 09d5bfc8cf
8 changed files with 303 additions and 47 deletions

View File

@ -14,7 +14,7 @@ import org.eclipse.jdt.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Consumer;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
@ -27,7 +27,7 @@ import world.bentobox.challenges.utils.Constants;
/** /**
* This panel implements common things for Paged pages. * This panel implements common things for Paged pages.
*/ */
public abstract class CommonPagedPanel extends CommonPanel public abstract class CommonPagedPanel<T> extends CommonPanel
{ {
/** /**
* Instantiates a new Common paged panel. * Instantiates a new Common paged panel.
@ -57,16 +57,28 @@ public abstract class CommonPagedPanel extends CommonPanel
} }
/**
* This method is called when filter value is updated.
*/
protected abstract void updateFilters();
/**
* Create element button panel item.
*
* @param object the object
* @return the panel item
*/
protected abstract PanelItem createElementButton(T object);
/** /**
* Populate elements. * Populate elements.
* *
* @param panelBuilder the panel builder * @param panelBuilder the panel builder
* @param objectList the object list * @param objectList the object list
* @param buttonBuilder the button builder
*/ */
protected void populateElements(PanelBuilder panelBuilder, protected void populateElements(PanelBuilder panelBuilder, List<T> objectList)
List<?> objectList,
Function<Object, PanelItem> buttonBuilder)
{ {
final int MAX_ELEMENTS = 21; final int MAX_ELEMENTS = 21;
final int size = objectList.size(); final int size = objectList.size();
@ -91,7 +103,7 @@ public abstract class CommonPagedPanel extends CommonPanel
{ {
if (!panelBuilder.slotOccupied(index)) if (!panelBuilder.slotOccupied(index))
{ {
panelBuilder.item(index, buttonBuilder.apply(objectList.get(objectIndex++))); panelBuilder.item(index, this.createElementButton(objectList.get(objectIndex++)));
} }
index++; index++;
@ -107,6 +119,13 @@ public abstract class CommonPagedPanel extends CommonPanel
{ {
panelBuilder.item(18, this.getButton(CommonButtons.PREVIOUS)); panelBuilder.item(18, this.getButton(CommonButtons.PREVIOUS));
} }
// Add search button only if there is more than MAX_ELEMENTS objects or searchString
// is not blank.
if (!this.searchString.isBlank() || objectList.size() > MAX_ELEMENTS)
{
panelBuilder.item(40, this.getButton(CommonButtons.SEARCH));
}
} }
@ -157,6 +176,59 @@ public abstract class CommonPagedPanel extends CommonPanel
return true; return true;
}; };
} }
else if (button == CommonButtons.SEARCH)
{
description.add(this.user.getTranslation(reference + "description"));
if (this.searchString != null && !this.searchString.isEmpty())
{
description.add(this.user.getTranslation(reference + "search",
Constants.PARAMETER_VALUE, this.searchString));
}
description.add("");
description.add(this.user.getTranslation(Constants.TIPS + "left-click-to-edit"));
if (!this.searchString.isEmpty())
{
description.add(this.user.getTranslation(Constants.TIPS + "right-click-to-clear"));
}
icon = new ItemStack(Material.ANVIL);
clickHandler = (panel, user, clickType, slot) -> {
if (clickType.isRightClick())
{
// Clear string.
this.searchString = "";
this.updateFilters();
// Rebuild gui.
this.build();
}
else
{
// Create consumer that process description change
Consumer<String> consumer = value ->
{
if (value != null)
{
this.searchString = value;
this.updateFilters();
}
this.build();
};
// start conversation
ConversationUtils.createStringInput(consumer,
user,
user.getTranslation(Constants.CONVERSATIONS + "write-search"),
user.getTranslation(Constants.CONVERSATIONS + "search-updated"));
}
return true;
};
}
else else
{ {
icon = new ItemStack(Material.PAPER); icon = new ItemStack(Material.PAPER);
@ -178,7 +250,8 @@ public abstract class CommonPagedPanel extends CommonPanel
private enum CommonButtons private enum CommonButtons
{ {
NEXT, NEXT,
PREVIOUS PREVIOUS,
SEARCH
} }
@ -186,4 +259,9 @@ public abstract class CommonPagedPanel extends CommonPanel
* Current page index. * Current page index.
*/ */
private int pageIndex; private int pageIndex;
/**
* Text that contains filter string.
*/
protected String searchString = "";
} }

View File

@ -34,7 +34,7 @@ import world.bentobox.challenges.utils.Utils;
/** /**
* This class contains all necessary elements to create Levels Edit GUI. * This class contains all necessary elements to create Levels Edit GUI.
*/ */
public class EditLevelPanel extends CommonPagedPanel public class EditLevelPanel extends CommonPagedPanel<Challenge>
{ {
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Constructors // Section: Constructors
@ -111,6 +111,16 @@ public class EditLevelPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
// Do nothing here.
}
/** /**
* This method builds all necessary elements in GUI panel. * This method builds all necessary elements in GUI panel.
*/ */
@ -190,11 +200,15 @@ public class EditLevelPanel extends CommonPagedPanel
*/ */
private void buildChallengesPanel(PanelBuilder panelBuilder) private void buildChallengesPanel(PanelBuilder panelBuilder)
{ {
List<Challenge> challengeList = this.addon.getChallengesManager().getLevelChallenges(this.challengeLevel); List<Challenge> challengeList = this.addon.getChallengesManager().
getLevelChallenges(this.challengeLevel).stream().
filter(challenge -> this.searchString.isBlank() ||
challenge.getFriendlyName().toLowerCase().contains(this.searchString.toLowerCase()) ||
challenge.getUniqueId().toLowerCase().contains(this.searchString.toLowerCase()) ||
challenge.getChallengeType().name().toLowerCase().contains(this.searchString)).
collect(Collectors.toList());
this.populateElements(panelBuilder, this.populateElements(panelBuilder, challengeList);
challengeList,
o -> this.createChallengeIcon((Challenge) o));
panelBuilder.item(39, this.createButton(Button.ADD_CHALLENGES)); panelBuilder.item(39, this.createButton(Button.ADD_CHALLENGES));
panelBuilder.item(41, this.createButton(Button.REMOVE_CHALLENGES)); panelBuilder.item(41, this.createButton(Button.REMOVE_CHALLENGES));
@ -279,7 +293,8 @@ public class EditLevelPanel extends CommonPagedPanel
* @param challenge Challenge which icon must be created. * @param challenge Challenge which icon must be created.
* @return PanelItem that represents given challenge. * @return PanelItem that represents given challenge.
*/ */
private PanelItem createChallengeIcon(Challenge challenge) @Override
protected PanelItem createElementButton(Challenge challenge)
{ {
return new PanelItemBuilder(). return new PanelItemBuilder().
name(Util.translateColorCodes(challenge.getFriendlyName())). name(Util.translateColorCodes(challenge.getFriendlyName())).

View File

@ -33,7 +33,7 @@ import world.bentobox.challenges.web.object.LibraryEntry;
* This class contains all necessary elements to create GUI that lists all challenges. * This class contains all necessary elements to create GUI that lists all challenges.
* It allows to edit them or remove, depending on given input mode. * It allows to edit them or remove, depending on given input mode.
*/ */
public class LibraryPanel extends CommonPagedPanel public class LibraryPanel extends CommonPagedPanel<LibraryEntry>
{ {
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Constructor // Section: Constructor
@ -54,6 +54,8 @@ public class LibraryPanel extends CommonPagedPanel
case DATABASE -> this.generateDatabaseEntries(); case DATABASE -> this.generateDatabaseEntries();
case TEMPLATE -> this.generateTemplateEntries(); case TEMPLATE -> this.generateTemplateEntries();
}; };
this.filterElements = this.libraryEntries;
} }
@ -130,6 +132,32 @@ public class LibraryPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
if (this.searchString == null || this.searchString.isBlank())
{
this.filterElements = this.libraryEntries;
}
else
{
this.filterElements = this.libraryEntries.stream().
filter(element -> {
// If element name is set and name contains search field, then do not filter out.
return element.name().toLowerCase().contains(this.searchString.toLowerCase()) ||
element.author().toLowerCase().contains(this.searchString.toLowerCase()) ||
element.gameMode().toLowerCase().contains(this.searchString.toLowerCase()) ||
element.language().toLowerCase().contains(this.searchString.toLowerCase());
}).
distinct().
collect(Collectors.toList());
}
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -156,9 +184,7 @@ public class LibraryPanel extends CommonPagedPanel
GuiUtils.fillBorder(panelBuilder); GuiUtils.fillBorder(panelBuilder);
this.populateElements(panelBuilder, this.populateElements(panelBuilder, this.filterElements);
this.libraryEntries,
o -> this.createEntryIcon((LibraryEntry) o));
if (this.mode == Library.WEB) if (this.mode == Library.WEB)
{ {
@ -232,7 +258,8 @@ public class LibraryPanel extends CommonPagedPanel
* @param libraryEntry LibraryEntry which button must be created. * @param libraryEntry LibraryEntry which button must be created.
* @return Entry button. * @return Entry button.
*/ */
private PanelItem createEntryIcon(LibraryEntry libraryEntry) @Override
protected PanelItem createElementButton(LibraryEntry libraryEntry)
{ {
PanelItemBuilder itemBuilder = new PanelItemBuilder(). PanelItemBuilder itemBuilder = new PanelItemBuilder().
name(ChatColor.translateAlternateColorCodes('&', libraryEntry.name())). name(ChatColor.translateAlternateColorCodes('&', libraryEntry.name())).
@ -436,4 +463,9 @@ public class LibraryPanel extends CommonPagedPanel
* List of library elements. * List of library elements.
*/ */
private final List<LibraryEntry> libraryEntries; private final List<LibraryEntry> libraryEntries;
/**
* Stores filtered items.
*/
private List<LibraryEntry> filterElements;
} }

View File

@ -1,7 +1,9 @@
package world.bentobox.challenges.panel.admin; package world.bentobox.challenges.panel.admin;
import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@ -25,7 +27,7 @@ import world.bentobox.challenges.utils.Utils;
* This class contains all necessary elements to create GUI that lists all challenges. * This class contains all necessary elements to create GUI that lists all challenges.
* It allows to edit them or remove, depending on given input mode. * It allows to edit them or remove, depending on given input mode.
*/ */
public class ListChallengesPanel extends CommonPagedPanel public class ListChallengesPanel extends CommonPagedPanel<Challenge>
{ {
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Constructor // Section: Constructor
@ -96,6 +98,16 @@ public class ListChallengesPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
// Do nothing here.
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -114,9 +126,15 @@ public class ListChallengesPanel extends CommonPagedPanel
GuiUtils.fillBorder(panelBuilder); GuiUtils.fillBorder(panelBuilder);
} }
this.populateElements(panelBuilder, List<Challenge> challengeList = this.addon.getChallengesManager().getAllChallenges(this.world).
this.addon.getChallengesManager().getAllChallenges(this.world), stream().
o -> this.createChallengeIcon((Challenge) o)); filter(challenge -> this.searchString.isBlank() ||
challenge.getFriendlyName().toLowerCase().contains(this.searchString.toLowerCase()) ||
challenge.getUniqueId().toLowerCase().contains(this.searchString.toLowerCase()) ||
challenge.getChallengeType().name().toLowerCase().contains(this.searchString)).
collect(Collectors.toList());
this.populateElements(panelBuilder, challengeList);
panelBuilder.item(44, this.returnButton); panelBuilder.item(44, this.returnButton);
@ -129,7 +147,8 @@ public class ListChallengesPanel extends CommonPagedPanel
* @param challenge Challenge which button must be created. * @param challenge Challenge which button must be created.
* @return Challenge button. * @return Challenge button.
*/ */
private PanelItem createChallengeIcon(Challenge challenge) @Override
protected PanelItem createElementButton(Challenge challenge)
{ {
PanelItemBuilder itemBuilder = new PanelItemBuilder(). PanelItemBuilder itemBuilder = new PanelItemBuilder().
name(Util.translateColorCodes(challenge.getFriendlyName())). name(Util.translateColorCodes(challenge.getFriendlyName())).

View File

@ -4,7 +4,9 @@ package world.bentobox.challenges.panel.admin;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
@ -12,6 +14,7 @@ import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util; import world.bentobox.bentobox.util.Util;
import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.ChallengesAddon;
import world.bentobox.challenges.database.object.Challenge;
import world.bentobox.challenges.database.object.ChallengeLevel; import world.bentobox.challenges.database.object.ChallengeLevel;
import world.bentobox.challenges.panel.CommonPagedPanel; import world.bentobox.challenges.panel.CommonPagedPanel;
import world.bentobox.challenges.panel.CommonPanel; import world.bentobox.challenges.panel.CommonPanel;
@ -25,7 +28,7 @@ import world.bentobox.challenges.utils.Utils;
* This class creates GUI that lists all Levels. Clicking on Level icon will be processed * This class creates GUI that lists all Levels. Clicking on Level icon will be processed
* by input mode. * by input mode.
*/ */
public class ListLevelsPanel extends CommonPagedPanel public class ListLevelsPanel extends CommonPagedPanel<ChallengeLevel>
{ {
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Constructor // Section: Constructor
@ -96,6 +99,16 @@ public class ListLevelsPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
// Do nothing here.
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -114,9 +127,14 @@ public class ListLevelsPanel extends CommonPagedPanel
GuiUtils.fillBorder(panelBuilder); GuiUtils.fillBorder(panelBuilder);
} }
this.populateElements(panelBuilder, List<ChallengeLevel> levelList = this.addon.getChallengesManager().getLevels(this.world).
this.addon.getChallengesManager().getLevels(this.world), stream().
o -> this.createLevelIcon((ChallengeLevel) o)); filter(challenge -> this.searchString.isBlank() ||
challenge.getFriendlyName().toLowerCase().contains(this.searchString.toLowerCase()) ||
challenge.getUniqueId().toLowerCase().contains(this.searchString.toLowerCase())).
collect(Collectors.toList());
this.populateElements(panelBuilder, levelList);
panelBuilder.item(44, this.returnButton); panelBuilder.item(44, this.returnButton);
@ -129,7 +147,8 @@ public class ListLevelsPanel extends CommonPagedPanel
* @param challengeLevel Level which button must be created. * @param challengeLevel Level which button must be created.
* @return Level button. * @return Level button.
*/ */
private PanelItem createLevelIcon(ChallengeLevel challengeLevel) @Override
protected PanelItem createElementButton(ChallengeLevel challengeLevel)
{ {
PanelItemBuilder itemBuilder = new PanelItemBuilder(). PanelItemBuilder itemBuilder = new PanelItemBuilder().
name(Util.translateColorCodes(challengeLevel.getFriendlyName())). name(Util.translateColorCodes(challengeLevel.getFriendlyName())).

View File

@ -31,7 +31,7 @@ import world.bentobox.challenges.utils.Utils;
/** /**
* This class contains methods that allows to select specific user. * This class contains methods that allows to select specific user.
*/ */
public class ListUsersPanel extends CommonPagedPanel public class ListUsersPanel extends CommonPagedPanel<Player>
{ {
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Constructors // Section: Constructors
@ -56,6 +56,7 @@ public class ListUsersPanel extends CommonPagedPanel
super(addon, user, world, topLabel, permissionPrefix); super(addon, user, world, topLabel, permissionPrefix);
this.onlineUsers = this.collectUsers(ViewMode.IN_WORLD); this.onlineUsers = this.collectUsers(ViewMode.IN_WORLD);
this.operationMode = operationMode; this.operationMode = operationMode;
this.filterElements = this.onlineUsers;
} }
@ -67,6 +68,7 @@ public class ListUsersPanel extends CommonPagedPanel
super(panel); super(panel);
this.onlineUsers = this.collectUsers(ViewMode.IN_WORLD); this.onlineUsers = this.collectUsers(ViewMode.IN_WORLD);
this.operationMode = operationMode; this.operationMode = operationMode;
this.filterElements = this.onlineUsers;
} }
@ -104,6 +106,29 @@ public class ListUsersPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
if (this.searchString == null || this.searchString.isBlank())
{
this.filterElements = this.onlineUsers;
}
else
{
this.filterElements = this.onlineUsers.stream().
filter(element -> {
// If element name is set and name contains search field, then do not filter out.
return element.getDisplayName().toLowerCase().contains(this.searchString.toLowerCase());
}).
distinct().
collect(Collectors.toList());
}
}
@Override @Override
protected void build() protected void build()
{ {
@ -112,9 +137,7 @@ public class ListUsersPanel extends CommonPagedPanel
GuiUtils.fillBorder(panelBuilder); GuiUtils.fillBorder(panelBuilder);
this.populateElements(panelBuilder, this.populateElements(panelBuilder, this.filterElements);
this.onlineUsers,
o -> this.createPlayerIcon((Player) o));
// Add button that allows to toggle different player lists. // Add button that allows to toggle different player lists.
panelBuilder.item( 4, this.createToggleButton()); panelBuilder.item( 4, this.createToggleButton());
@ -129,7 +152,8 @@ public class ListUsersPanel extends CommonPagedPanel
* @param player Player which button must be created. * @param player Player which button must be created.
* @return Player button. * @return Player button.
*/ */
private PanelItem createPlayerIcon(Player player) @Override
protected PanelItem createElementButton(Player player)
{ {
final String reference = Constants.BUTTON + "player."; final String reference = Constants.BUTTON + "player.";
@ -318,6 +342,10 @@ public class ListUsersPanel extends CommonPagedPanel
this.onlineUsers = this.collectUsers(this.mode); this.onlineUsers = this.collectUsers(this.mode);
} }
// Reset search
this.searchString = "";
this.updateFilters();
this.build(); this.build();
return true; return true;
}).build(); }).build();
@ -359,6 +387,11 @@ public class ListUsersPanel extends CommonPagedPanel
*/ */
private List<Player> onlineUsers; private List<Player> onlineUsers;
/**
* List with players that should be in GUI.
*/
private List<Player> filterElements;
/** /**
* Current operation mode. * Current operation mode.
*/ */

View File

@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -27,7 +28,7 @@ import world.bentobox.challenges.utils.Utils;
/** /**
* This class allows to edit material that are in required material map. * This class allows to edit material that are in required material map.
*/ */
public class ManageBlocksPanel extends CommonPagedPanel public class ManageBlocksPanel extends CommonPagedPanel<Material>
{ {
private ManageBlocksPanel(CommonPanel parentGUI, Map<Material, Integer> materialMap) private ManageBlocksPanel(CommonPanel parentGUI, Map<Material, Integer> materialMap)
{ {
@ -36,9 +37,12 @@ public class ManageBlocksPanel extends CommonPagedPanel
this.materialList = new ArrayList<>(this.materialMap.keySet()); this.materialList = new ArrayList<>(this.materialMap.keySet());
// Sort materials by their ordinal value. // Sort materials by their ordinal value.
this.materialList.sort(Comparator.comparing(Enum::ordinal)); this.materialList.sort(Comparator.comparing(Enum::name));
this.selectedMaterials = new HashSet<>(); this.selectedMaterials = new HashSet<>();
// Init without filters applied.
this.filterElements = this.materialList;
} }
@ -56,11 +60,34 @@ public class ManageBlocksPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
if (this.searchString == null || this.searchString.isBlank())
{
this.filterElements = this.materialList;
}
else
{
this.filterElements = this.materialList.stream().
filter(element -> {
// If element name is set and name contains search field, then do not filter out.
return element.name().toLowerCase().contains(this.searchString.toLowerCase());
}).
distinct().
collect(Collectors.toList());
}
}
/** /**
* This method builds all necessary elements in GUI panel. * This method builds all necessary elements in GUI panel.
*/ */
@Override @Override
public void build() protected void build()
{ {
PanelBuilder panelBuilder = new PanelBuilder().user(this.user). PanelBuilder panelBuilder = new PanelBuilder().user(this.user).
name(this.user.getTranslation(Constants.TITLE + "manage-blocks")); name(this.user.getTranslation(Constants.TITLE + "manage-blocks"));
@ -71,9 +98,7 @@ public class ManageBlocksPanel extends CommonPagedPanel
panelBuilder.item(3, this.createButton(Button.ADD_BLOCK)); panelBuilder.item(3, this.createButton(Button.ADD_BLOCK));
panelBuilder.item(5, this.createButton(Button.REMOVE_BLOCK)); panelBuilder.item(5, this.createButton(Button.REMOVE_BLOCK));
this.populateElements(panelBuilder, this.populateElements(panelBuilder, this.filterElements);
this.materialList,
o -> this.createElementButton((Material) o));
// Add return button. // Add return button.
panelBuilder.item(44, this.returnButton); panelBuilder.item(44, this.returnButton);
@ -181,7 +206,8 @@ public class ManageBlocksPanel extends CommonPagedPanel
* @param material material which button must be created. * @param material material which button must be created.
* @return new Button for material. * @return new Button for material.
*/ */
private PanelItem createElementButton(Material material) @Override
protected PanelItem createElementButton(Material material)
{ {
final String reference = Constants.BUTTON + "material."; final String reference = Constants.BUTTON + "material.";
@ -279,4 +305,9 @@ public class ManageBlocksPanel extends CommonPagedPanel
* List of required materials. * List of required materials.
*/ */
private final Map<Material, Integer> materialMap; private final Map<Material, Integer> materialMap;
/**
* Stores filtered items.
*/
private List<Material> filterElements;
} }

View File

@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -28,7 +29,7 @@ import world.bentobox.challenges.utils.Utils;
/** /**
* This class allows to edit entities that are in required entities map. * This class allows to edit entities that are in required entities map.
*/ */
public class ManageEntitiesPanel extends CommonPagedPanel public class ManageEntitiesPanel extends CommonPagedPanel<EntityType>
{ {
private ManageEntitiesPanel(CommonPanel parentGUI, Map<EntityType, Integer> requiredEntities) private ManageEntitiesPanel(CommonPanel parentGUI, Map<EntityType, Integer> requiredEntities)
{ {
@ -39,6 +40,7 @@ public class ManageEntitiesPanel extends CommonPagedPanel
this.entityList.sort(Comparator.comparing(Enum::name)); this.entityList.sort(Comparator.comparing(Enum::name));
this.selectedEntities = new HashSet<>(EntityType.values().length); this.selectedEntities = new HashSet<>(EntityType.values().length);
this.filterElements = this.entityList;
} }
@ -56,11 +58,34 @@ public class ManageEntitiesPanel extends CommonPagedPanel
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
/**
* This method is called when filter value is updated.
*/
@Override
protected void updateFilters()
{
if (this.searchString == null || this.searchString.isBlank())
{
this.filterElements = this.entityList;
}
else
{
this.filterElements = this.entityList.stream().
filter(element -> {
// If element name is set and name contains search field, then do not filter out.
return element.name().toLowerCase().contains(this.searchString.toLowerCase());
}).
distinct().
collect(Collectors.toList());
}
}
/** /**
* This method builds all necessary elements in GUI panel. * This method builds all necessary elements in GUI panel.
*/ */
@Override @Override
public void build() protected void build()
{ {
PanelBuilder panelBuilder = new PanelBuilder().user(this.user). PanelBuilder panelBuilder = new PanelBuilder().user(this.user).
name(this.user.getTranslation(Constants.TITLE + "manage-entities")); name(this.user.getTranslation(Constants.TITLE + "manage-entities"));
@ -72,9 +97,7 @@ public class ManageEntitiesPanel extends CommonPagedPanel
panelBuilder.item(5, this.createButton(Button.REMOVE_ENTITY)); panelBuilder.item(5, this.createButton(Button.REMOVE_ENTITY));
panelBuilder.item(8, this.createButton(Button.SWITCH_ENTITY)); panelBuilder.item(8, this.createButton(Button.SWITCH_ENTITY));
this.populateElements(panelBuilder, this.populateElements(panelBuilder, this.filterElements);
this.entityList,
o -> this.createEntityButton((EntityType) o));
// Add return button. // Add return button.
panelBuilder.item(44, this.returnButton); panelBuilder.item(44, this.returnButton);
@ -193,7 +216,8 @@ public class ManageEntitiesPanel extends CommonPagedPanel
* @param entity Entity which button must be created. * @param entity Entity which button must be created.
* @return new Button for entity. * @return new Button for entity.
*/ */
private PanelItem createEntityButton(EntityType entity) @Override
protected PanelItem createElementButton(EntityType entity)
{ {
final String reference = Constants.BUTTON + "entity."; final String reference = Constants.BUTTON + "entity.";
@ -299,4 +323,9 @@ public class ManageEntitiesPanel extends CommonPagedPanel
* Boolean indicate if entities should be displayed as eggs or mob heads. * Boolean indicate if entities should be displayed as eggs or mob heads.
*/ */
private boolean asEggs; private boolean asEggs;
/**
* Stores filtered items.
*/
private List<EntityType> filterElements;
} }