From 28025895e0da1e6079264dbfe951e7fd9bf069d8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 11 Aug 2019 23:28:33 +0800 Subject: Scrollable Entry List? --- .../me/shedaniel/rei/impl/DisplayHelperImpl.java | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java (limited to 'src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java new file mode 100644 index 000000000..470d5a2c1 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java @@ -0,0 +1,91 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.impl; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import me.shedaniel.rei.api.BaseBoundsHandler; +import me.shedaniel.rei.api.DisplayHelper; + +import java.awt.*; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +public class DisplayHelperImpl implements DisplayHelper { + + private static final Comparator> BOUNDS_HANDLER_COMPARATOR; + private static final DisplayBoundsHandler EMPTY = new DisplayBoundsHandler() { + @Override + public Class getBaseSupportedClass() { + return null; + } + + @Override + public Rectangle getLeftBounds(Object screen) { + return new Rectangle(); + } + + @Override + public Rectangle getRightBounds(Object screen) { + return new Rectangle(); + } + + @Override + public float getPriority() { + return -10f; + } + }; + + static { + Comparator> comparator = Comparator.comparingDouble(DisplayBoundsHandler::getPriority); + BOUNDS_HANDLER_COMPARATOR = comparator.reversed(); + } + + private List> screenDisplayBoundsHandlers = Lists.newArrayList(); + private Map, DisplayBoundsHandler> handlerCache = Maps.newHashMap(); + private BaseBoundsHandler baseBoundsHandler; + + @Override + public List> getSortedBoundsHandlers(Class screenClass) { + return screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList()); + } + + @Override + public List> getAllBoundsHandlers() { + return screenDisplayBoundsHandlers; + } + + @Override + public DisplayBoundsHandler getResponsibleBoundsHandler(Class screenClass) { + Optional> any = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); + if (any.isPresent()) + return any.get(); + handlerCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).findAny().orElse(EMPTY)); + return handlerCache.get(screenClass); + } + + @Override + public void registerBoundsHandler(DisplayBoundsHandler handler) { + screenDisplayBoundsHandlers.add(handler); + } + + @Override + public BaseBoundsHandler getBaseBoundsHandler() { + return baseBoundsHandler; + } + + public void setBaseBoundsHandler(BaseBoundsHandler baseBoundsHandler) { + this.baseBoundsHandler = baseBoundsHandler; + } + + public void resetCache() { + handlerCache.clear(); + } + +} -- cgit