From 41998600e53f941554c8d73790180c13a2e5663c Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 11 Apr 2019 21:47:51 +0800 Subject: 2.7.2 --- .../me/shedaniel/rei/client/DisplayHelperImpl.java | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java (limited to 'src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java') diff --git a/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java b/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java new file mode 100644 index 000000000..e1f6c8144 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java @@ -0,0 +1,66 @@ +package me.shedaniel.rei.client; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +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 = Comparator.comparingDouble(value -> { + if (value instanceof DisplayBoundsHandler) + return (double) ((DisplayBoundsHandler) value).getPriority(); + return -Double.MAX_VALUE; + }).reversed(); + 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(); + } + }; + private List screenDisplayBoundsHandlerMap = Lists.newArrayList(); + private Map handlerCache = Maps.newHashMap(); + + @Override + public List getSortedBoundsHandlers(Class screenClass) { + List list = Lists.newArrayList(screenDisplayBoundsHandlerMap.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).collect(Collectors.toList())); + list.sort(BOUNDS_HANDLER_COMPARATOR); + return list; + } + + @Override + public DisplayBoundsHandler getResponsibleBoundsHandler(Class screenClass) { + Optional handler = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); + if (handler.isPresent()) + return handler.get(); + List sortedBoundsHandlers = getSortedBoundsHandlers(screenClass); + handlerCache.put(screenClass, sortedBoundsHandlers.isEmpty() ? EMPTY : sortedBoundsHandlers.get(0)); + return handlerCache.get(screenClass); + } + + @Override + public void registerBoundsHandler(DisplayBoundsHandler handler) { + screenDisplayBoundsHandlerMap.add(handler); + } + + public void resetCache() { + handlerCache.clear(); + } + +} -- cgit