DisplayHelperImpl.java 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package me.shedaniel.rei.client;
  2. import com.google.common.collect.Lists;
  3. import com.google.common.collect.Maps;
  4. import me.shedaniel.rei.api.BaseBoundsHandler;
  5. import me.shedaniel.rei.api.DisplayHelper;
  6. import java.awt.*;
  7. import java.util.Comparator;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Optional;
  11. import java.util.stream.Collectors;
  12. public class DisplayHelperImpl implements DisplayHelper {
  13. private static final Comparator<DisplayBoundsHandler> BOUNDS_HANDLER_COMPARATOR;
  14. private static final DisplayBoundsHandler EMPTY = new DisplayBoundsHandler() {
  15. @Override
  16. public Class getBaseSupportedClass() {
  17. return Object.class;
  18. }
  19. @Override
  20. public Rectangle getLeftBounds(Object screen) {
  21. return DisplayBoundsHandler.EMPTY;
  22. }
  23. @Override
  24. public Rectangle getRightBounds(Object screen) {
  25. return DisplayBoundsHandler.EMPTY;
  26. }
  27. @Override
  28. public float getPriority() {
  29. return -10f;
  30. }
  31. };
  32. static {
  33. Comparator<DisplayBoundsHandler> comparator = Comparator.comparingDouble(DisplayBoundsHandler::getPriority);
  34. BOUNDS_HANDLER_COMPARATOR = comparator.reversed();
  35. }
  36. private List<DisplayBoundsHandler> screenDisplayBoundsHandlers = Lists.newArrayList();
  37. private Map<Class, DisplayBoundsHandler> handlerCache = Maps.newHashMap();
  38. private BaseBoundsHandler baseBoundsHandler;
  39. @Override
  40. public List<DisplayBoundsHandler> getSortedBoundsHandlers(Class screenClass) {
  41. return screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList());
  42. }
  43. @Override
  44. public List<DisplayBoundsHandler> getAllBoundsHandlers() {
  45. return screenDisplayBoundsHandlers;
  46. }
  47. @Override
  48. public DisplayBoundsHandler getResponsibleBoundsHandler(Class screenClass) {
  49. Optional<DisplayBoundsHandler> any = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny();
  50. if (any.isPresent())
  51. return any.get();
  52. handlerCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).findAny().orElse(EMPTY));
  53. return handlerCache.get(screenClass);
  54. }
  55. @Override
  56. public void registerBoundsHandler(DisplayBoundsHandler handler) {
  57. screenDisplayBoundsHandlers.add(handler);
  58. }
  59. @Override
  60. public BaseBoundsHandler getBaseBoundsHandler() {
  61. return baseBoundsHandler;
  62. }
  63. public void setBaseBoundsHandler(BaseBoundsHandler baseBoundsHandler) {
  64. this.baseBoundsHandler = baseBoundsHandler;
  65. }
  66. public void resetCache() {
  67. handlerCache.clear();
  68. }
  69. }