001package com.ericlam.mc.eldgui; 002 003import com.ericlam.mc.eldgui.component.ComponentFactory; 004import com.ericlam.mc.eldgui.exception.ExceptionViewHandler; 005import com.ericlam.mc.eldgui.middleware.MiddleWare; 006import com.ericlam.mc.eldgui.view.LoadingView; 007import org.bukkit.event.inventory.InventoryInteractEvent; 008 009import java.lang.annotation.Annotation; 010import java.util.List; 011 012/** 013 * ELDependenci-MVC 安裝器 014 */ 015public interface MVCInstallation { 016 017 /** 018 * 安裝界面互動事件自定義過濾 019 * 020 * @param qualifier 指定的標注 021 * @param predicate 指定自定義過濾 022 * @param <A> 標注類 023 */ 024 <A extends Annotation> void registerQualifier(Class<A> qualifier, QualifierFilter<A> predicate); 025 026 <A extends Annotation, M extends MiddleWare<A>> void registerMiddleWare(Class<A> qualifier, Class<M> middleWareClass); 027 028 /** 029 * 安裝 controllers (控制器) 030 * 031 * @param controllers controllers 032 */ 033 void registerControllers(Class<?>... controllers); 034 035 /** 036 * 新增自定義異常處理器 037 * 038 * @param exceptionHandlers 異常處理器 039 */ 040 void addExceptionViewHandlers(List<Class<? extends ExceptionViewHandler>> exceptionHandlers); 041 042 /** 043 * 設置全局異常處理器 044 * @param exceptionHandler 異常處理器 045 */ 046 void setGlobalExceptionHandler(Class<? extends ExceptionViewHandler> exceptionHandler); 047 048 /** 049 * 設置全局異步加載界面 050 * @param loadingView 異步加載界面 051 */ 052 void setGlobalLoadingView(Class<? extends LoadingView> loadingView); 053 054 /** 055 * 新增自定義組件工廠 056 * @param factory 組件類,必須爲 interface 057 * @param implement 組件實作類 058 * @param <T> 組件工廠類 059 * @param <E> 組件工廠實作類 060 */ 061 <T extends ComponentFactory<T>, E extends T> void addComponentFactory(Class<T> factory, Class<E> implement); 062 063 @FunctionalInterface 064 interface QualifierFilter<A extends Annotation> { 065 boolean checkIsPass(InventoryInteractEvent interactEvent, char pattern, A annotation); 066 } 067 068}