/*******************************************************************************
* Copyright (c) 2017 Skymatic UG (haftungsbeschränkt).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.controllers;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.cryptomator.ui.l10n.Localization;
import javafx.fxml.FXMLLoader;
@Singleton
public class ViewControllerLoader {
private final Map<Class<? extends ViewController>, Provider<ViewController>> controllerProviders;
private final Localization localization;
@Inject
public ViewControllerLoader(Map<Class<? extends ViewController>, Provider<ViewController>> controllerProviders, Localization localization) {
this.controllerProviders = controllerProviders;
this.localization = localization;
}
public <T extends ViewController> T load(String resourceName) {
FXMLLoader loader = new FXMLLoader();
loader.setControllerFactory(this::constructController);
loader.setResources(localization);
try (InputStream in = getClass().getResourceAsStream(resourceName)) {
loader.load(in);
} catch (IOException e) {
throw new UncheckedIOException("Error loading FXML: " + resourceName, e);
}
return loader.getController();
}
private ViewController constructController(Class<?> clazz) {
Provider<ViewController> ctrlProvider = controllerProviders.get(clazz);
if (ctrlProvider == null) {
throw new IllegalStateException("No provider for type " + clazz.getName() + " registered.");
}
return ctrlProvider.get();
}
}