package rtt.annotation.editor.controller; import java.util.ArrayList; import java.util.List; import rtt.annotation.editor.controller.IAnnotationController.Mode; import rtt.annotation.editor.controller.impl.InitAnnotationController; import rtt.annotation.editor.controller.impl.NodeAnnotationController; import rtt.annotation.editor.controller.impl.ValueAnnotationController; import rtt.annotation.editor.model.annotation.Annotatable; import rtt.annotation.editor.model.annotation.Annotation; @SuppressWarnings("unchecked") public class ControllerRegistry { public static final ControllerRegistry INSTANCE = new ControllerRegistry(); private List<IAnnotationController<?>> controllers; protected ControllerRegistry() { controllers = new ArrayList<>(); controllers.add(new NodeAnnotationController()); controllers.add(new ValueAnnotationController()); controllers.add(new InitAnnotationController()); } protected <A extends Annotation> IAnnotationController<A> findController(Class<A> annotationType) { for (IAnnotationController<?> controller : controllers) { if (controller.hasAnnotationType(annotationType)) { return (IAnnotationController<A>) controller; } } return null; } public static <A extends Annotation> boolean canExecute(Mode mode, Class<? extends Annotation> annotationType, Annotatable<?> element) { IAnnotationController<?> controller = INSTANCE.findController(annotationType); return controller != null && controller.canExecute(mode, element); } public static <A extends Annotation> boolean execute(Mode mode, Class<A> annotationType, Annotatable<?> element) { IAnnotationController<A> controller = INSTANCE.findController(annotationType); if (controller != null && controller.canExecute(mode, element)) { if (controller.execute(mode, (Annotatable<A>) element)) { element.setChanged(); return true; }; } return false; } }