1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package me.shedaniel.rei.client;
- 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 EMPTY = new DisplayBoundsHandler() {
- @Override
- public Class getBaseSupportedClass() {
- return Object.class;
- }
-
- @Override
- public Rectangle getLeftBounds(Object screen) {
- return DisplayBoundsHandler.EMPTY;
- }
-
- @Override
- public Rectangle getRightBounds(Object screen) {
- return DisplayBoundsHandler.EMPTY;
- }
-
- @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<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();
- }
-
- }
|