diff options
| author | Unknown <shekwancheung0528@gmail.com> | 2019-04-11 21:47:51 +0800 |
|---|---|---|
| committer | Unknown <shekwancheung0528@gmail.com> | 2019-04-11 21:47:51 +0800 |
| commit | 41998600e53f941554c8d73790180c13a2e5663c (patch) | |
| tree | f068c4e7c0f5a5f32a4d614b5f75bd4704c9e888 /src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java | |
| parent | 6c783c00640143c810c81486e0c49003b297221f (diff) | |
| download | RoughlyEnoughItems-41998600e53f941554c8d73790180c13a2e5663c.tar.gz RoughlyEnoughItems-41998600e53f941554c8d73790180c13a2e5663c.tar.bz2 RoughlyEnoughItems-41998600e53f941554c8d73790180c13a2e5663c.zip | |
2.7.2
Diffstat (limited to 'src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java | 66 |
1 files changed, 66 insertions, 0 deletions
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<DisplayBoundsHandler> screenDisplayBoundsHandlerMap = Lists.newArrayList(); + private Map<Class, DisplayBoundsHandler> handlerCache = Maps.newHashMap(); + + @Override + public List<DisplayBoundsHandler> getSortedBoundsHandlers(Class screenClass) { + List<DisplayBoundsHandler> 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<DisplayBoundsHandler> handler = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); + if (handler.isPresent()) + return handler.get(); + List<DisplayBoundsHandler> 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(); + } + +} |
