diff options
| author | Unknown <shekwancheung0528@gmail.com> | 2019-08-11 23:28:33 +0800 |
|---|---|---|
| committer | Unknown <shekwancheung0528@gmail.com> | 2019-08-11 23:28:33 +0800 |
| commit | 28025895e0da1e6079264dbfe951e7fd9bf069d8 (patch) | |
| tree | bd28e2f6bf02a2806c4b7802fac912ed43444e43 /src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java | |
| parent | 019aa13875ca639dda2f34c66e3160f72b923cfd (diff) | |
| download | RoughlyEnoughItems-28025895e0da1e6079264dbfe951e7fd9bf069d8.tar.gz RoughlyEnoughItems-28025895e0da1e6079264dbfe951e7fd9bf069d8.tar.bz2 RoughlyEnoughItems-28025895e0da1e6079264dbfe951e7fd9bf069d8.zip | |
Scrollable Entry List?
Diffstat (limited to 'src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java | 91 |
1 files changed, 91 insertions, 0 deletions
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<DisplayBoundsHandler<?>> BOUNDS_HANDLER_COMPARATOR; + private static final DisplayBoundsHandler<Object> 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<DisplayBoundsHandler<?>> comparator = Comparator.comparingDouble(DisplayBoundsHandler::getPriority); + BOUNDS_HANDLER_COMPARATOR = comparator.reversed(); + } + + private List<DisplayBoundsHandler<?>> screenDisplayBoundsHandlers = Lists.newArrayList(); + private Map<Class<?>, DisplayBoundsHandler<?>> handlerCache = Maps.newHashMap(); + private BaseBoundsHandler baseBoundsHandler; + + @Override + public List<DisplayBoundsHandler<?>> getSortedBoundsHandlers(Class<?> screenClass) { + return screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList()); + } + + @Override + public List<DisplayBoundsHandler<?>> getAllBoundsHandlers() { + return screenDisplayBoundsHandlers; + } + + @Override + public DisplayBoundsHandler<?> getResponsibleBoundsHandler(Class<?> screenClass) { + Optional<? extends DisplayBoundsHandler<?>> 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(); + } + +} |
