converted ViewerFacadeBuilder to PerViewerFacadeInjector

master
Stefan Dollase 2017-02-24 00:43:45 +01:00
parent 875f542ec2
commit 0e9e935fca
4 changed files with 168 additions and 124 deletions

View File

@ -7,17 +7,22 @@ import amidst.CommandLineParameters;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.fragment.FragmentManager;
import amidst.fragment.layer.LayerBuilder;
import amidst.gui.license.LicenseWindow;
import amidst.gui.main.Actions;
import amidst.gui.main.MainWindow;
import amidst.gui.main.UpdatePrompt;
import amidst.gui.main.viewer.ViewerFacadeBuilder;
import amidst.gui.main.viewer.BiomeSelection;
import amidst.gui.main.viewer.ViewerFacade;
import amidst.gui.main.viewer.Zoom;
import amidst.gui.profileselect.ProfileSelectWindow;
import amidst.mojangapi.MojangApi;
import amidst.mojangapi.MojangApiBuilder;
import amidst.mojangapi.file.DotMinecraftDirectoryNotFoundException;
import amidst.mojangapi.minecraftinterface.local.LocalMinecraftInterfaceCreationException;
import amidst.mojangapi.world.SeedHistoryLogger;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.WorldBuilder;
import amidst.mojangapi.world.player.PlayerInformationCache;
import amidst.mojangapi.world.player.PlayerInformationCacheImpl;
@ -35,7 +40,9 @@ public class PerApplicationInjector {
private final BiomeProfileDirectory biomeProfileDirectory;
private final ThreadMaster threadMaster;
private final LayerBuilder layerBuilder;
private final ViewerFacadeBuilder viewerFacadeBuilder;
private final Zoom zoom;
private final FragmentManager fragmentManager;
private final BiomeSelection biomeSelection;
private final Application application;
@CalledOnlyBy(AmidstThread.EDT)
@ -51,7 +58,9 @@ public class PerApplicationInjector {
this.biomeProfileDirectory = BiomeProfileDirectory.create(parameters.biomeProfilesDirectory);
this.threadMaster = new ThreadMaster();
this.layerBuilder = new LayerBuilder();
this.viewerFacadeBuilder = new ViewerFacadeBuilder(settings, threadMaster.getWorkerExecutor(), layerBuilder);
this.zoom = new Zoom(settings.maxZoom);
this.fragmentManager = new FragmentManager(layerBuilder.getConstructors(), layerBuilder.getNumberOfLayers());
this.biomeSelection = new BiomeSelection();
this.application = new Application(
mojangApi,
this::createNoisyUpdatePrompt,
@ -61,11 +70,6 @@ public class PerApplicationInjector {
this::createLicenseWindow);
}
@CalledOnlyBy(AmidstThread.EDT)
public Application getApplication() {
return application;
}
@CalledOnlyBy(AmidstThread.EDT)
private UpdatePrompt createNoisyUpdatePrompt(MainWindow mainWindow) {
return UpdatePrompt.from(metadata.getVersion(), threadMaster.getWorkerExecutor(), mainWindow, false);
@ -84,7 +88,7 @@ public class PerApplicationInjector {
settings,
mojangApi,
biomeProfileDirectory,
viewerFacadeBuilder,
this::createViewerFacade,
threadMaster);
}
@ -97,4 +101,22 @@ public class PerApplicationInjector {
private LicenseWindow createLicenseWindow() {
return new LicenseWindow(metadata);
}
@CalledOnlyBy(AmidstThread.EDT)
private ViewerFacade createViewerFacade(World world, Actions actions) {
return new PerViewerFacadeInjector(
settings,
threadMaster.getWorkerExecutor(),
zoom,
layerBuilder,
fragmentManager,
biomeSelection,
world,
actions).getViewerFacade();
}
@CalledOnlyBy(AmidstThread.EDT)
public Application getApplication() {
return application;
}
}

View File

@ -0,0 +1,132 @@
package amidst.dependency.injection;
import java.util.List;
import amidst.AmidstSettings;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.fragment.FragmentGraph;
import amidst.fragment.FragmentManager;
import amidst.fragment.FragmentQueueProcessor;
import amidst.fragment.layer.LayerBuilder;
import amidst.fragment.layer.LayerManager;
import amidst.fragment.layer.LayerReloader;
import amidst.gui.main.Actions;
import amidst.gui.main.viewer.BiomeSelection;
import amidst.gui.main.viewer.Drawer;
import amidst.gui.main.viewer.FragmentGraphToScreenTranslator;
import amidst.gui.main.viewer.Graphics2DAccelerationCounter;
import amidst.gui.main.viewer.Movement;
import amidst.gui.main.viewer.Viewer;
import amidst.gui.main.viewer.ViewerFacade;
import amidst.gui.main.viewer.ViewerMouseListener;
import amidst.gui.main.viewer.WorldIconSelection;
import amidst.gui.main.viewer.Zoom;
import amidst.gui.main.viewer.widget.Widget;
import amidst.gui.main.viewer.widget.WidgetBuilder;
import amidst.gui.main.viewer.widget.WidgetManager;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.export.WorldExporterFactory;
import amidst.threading.WorkerExecutor;
@NotThreadSafe
public class PerViewerFacadeInjector {
private final Graphics2DAccelerationCounter accelerationCounter;
private final Movement movement;
private final WorldIconSelection worldIconSelection;
private final LayerManager layerManager;
private final FragmentGraph graph;
private final FragmentGraphToScreenTranslator translator;
private final FragmentQueueProcessor fragmentQueueProcessor;
private final LayerReloader layerReloader;
private final WorldExporterFactory worldExporterFactory;
private final WidgetBuilder widgetBuilder;
private final List<Widget> widgets;
private final Drawer drawer;
private final WidgetManager widgetManager;
private final ViewerMouseListener viewerMouseListener;
private final Viewer viewer;
private final ViewerFacade viewerFacade;
@CalledOnlyBy(AmidstThread.EDT)
public PerViewerFacadeInjector(
AmidstSettings settings,
WorkerExecutor workerExecutor,
Zoom zoom,
LayerBuilder layerBuilder,
FragmentManager fragmentManager,
BiomeSelection biomeSelection,
World world,
Actions actions) {
this.accelerationCounter = new Graphics2DAccelerationCounter();
this.movement = new Movement(settings.smoothScrolling);
this.worldIconSelection = new WorldIconSelection();
this.layerManager = layerBuilder
.create(settings, world, biomeSelection, worldIconSelection, zoom, accelerationCounter);
this.graph = new FragmentGraph(layerManager.getDeclarations(), fragmentManager);
this.translator = new FragmentGraphToScreenTranslator(graph, zoom);
this.fragmentQueueProcessor = fragmentManager.createQueueProcessor(layerManager, settings.dimension);
this.layerReloader = layerManager.createLayerReloader(world);
this.worldExporterFactory = new WorldExporterFactory(workerExecutor, world);
this.widgetBuilder = new WidgetBuilder(
world,
graph,
translator,
zoom,
biomeSelection,
worldIconSelection,
layerReloader,
fragmentManager,
accelerationCounter,
settings,
worldExporterFactory::getProgressMessage);
this.widgets = widgetBuilder.create();
this.drawer = new Drawer(
graph,
translator,
zoom,
movement,
widgets,
layerManager.getDrawers(),
settings.dimension,
accelerationCounter);
this.widgetManager = new WidgetManager(widgets);
this.viewerMouseListener = new ViewerMouseListener(widgetManager, graph, translator, zoom, movement, actions);
this.viewer = new Viewer(viewerMouseListener, drawer);
this.viewerFacade = new ViewerFacade(
world,
graph,
translator,
zoom,
viewer,
layerReloader,
worldIconSelection,
layerManager,
workerExecutor,
worldExporterFactory,
this::onRepainterTick,
this::onFragmentLoaderTick,
this::onPlayerFinishedLoading);
}
@CalledOnlyBy(AmidstThread.REPAINTER)
private void onRepainterTick() {
viewer.repaintComponent();
}
@CalledOnlyBy(AmidstThread.FRAGMENT_LOADER)
private void onFragmentLoaderTick() {
fragmentQueueProcessor.processQueues();
}
@CalledOnlyBy(AmidstThread.EDT)
private void onPlayerFinishedLoading() {
layerReloader.reloadPlayerLayer();
}
@CalledOnlyBy(AmidstThread.EDT)
public ViewerFacade getViewerFacade() {
return viewerFacade;
}
}

View File

@ -16,13 +16,13 @@ import javax.swing.JOptionPane;
import amidst.AmidstMetaData;
import amidst.AmidstSettings;
import amidst.Application;
import amidst.dependency.injection.Factory2;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.gui.main.menu.AmidstMenu;
import amidst.gui.main.menu.AmidstMenuBuilder;
import amidst.gui.main.viewer.ViewerFacade;
import amidst.gui.main.viewer.ViewerFacadeBuilder;
import amidst.gui.seedsearcher.SeedSearcher;
import amidst.gui.seedsearcher.SeedSearcherWindow;
import amidst.logging.AmidstLogger;
@ -46,7 +46,7 @@ public class MainWindow {
private final AmidstSettings settings;
private final MojangApi mojangApi;
private final BiomeProfileDirectory biomeProfileDirectory;
private final ViewerFacadeBuilder viewerFacadeBuilder;
private final Factory2<World, Actions, ViewerFacade> viewerFacadeFactory;
private final ThreadMaster threadMaster;
private final JFrame frame;
@ -64,14 +64,14 @@ public class MainWindow {
AmidstSettings settings,
MojangApi mojangApi,
BiomeProfileDirectory biomeProfileDirectory,
ViewerFacadeBuilder viewerFacadeBuilder,
Factory2<World, Actions, ViewerFacade> viewerFacadeFactory,
ThreadMaster threadMaster) {
this.application = application;
this.metadata = metadata;
this.settings = settings;
this.mojangApi = mojangApi;
this.biomeProfileDirectory = biomeProfileDirectory;
this.viewerFacadeBuilder = viewerFacadeBuilder;
this.viewerFacadeFactory = viewerFacadeFactory;
this.threadMaster = threadMaster;
this.frame = createFrame();
this.contentPane = createContentPane();
@ -168,7 +168,7 @@ public class MainWindow {
private void setWorld(World world) {
clearViewerFacade();
if (decideWorldPlayerType(world.getMovablePlayerList())) {
setViewerFacade(viewerFacadeBuilder.create(world, actions));
setViewerFacade(viewerFacadeFactory.create(world, actions));
} else {
frame.revalidate();
frame.repaint();

View File

@ -1,110 +0,0 @@
package amidst.gui.main.viewer;
import java.util.List;
import amidst.AmidstSettings;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
import amidst.fragment.FragmentGraph;
import amidst.fragment.FragmentManager;
import amidst.fragment.FragmentQueueProcessor;
import amidst.fragment.layer.LayerBuilder;
import amidst.fragment.layer.LayerManager;
import amidst.fragment.layer.LayerReloader;
import amidst.gui.main.Actions;
import amidst.gui.main.viewer.widget.Widget;
import amidst.gui.main.viewer.widget.WidgetBuilder;
import amidst.gui.main.viewer.widget.WidgetManager;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.export.WorldExporterFactory;
import amidst.threading.WorkerExecutor;
@NotThreadSafe
public class ViewerFacadeBuilder {
private final Zoom zoom;
private final BiomeSelection biomeSelection = new BiomeSelection();
private final AmidstSettings settings;
private final WorkerExecutor workerExecutor;
private final LayerBuilder layerBuilder;
private final FragmentManager fragmentManager;
@CalledOnlyBy(AmidstThread.EDT)
public ViewerFacadeBuilder(AmidstSettings settings, WorkerExecutor workerExecutor, LayerBuilder layerBuilder) {
this.settings = settings;
this.workerExecutor = workerExecutor;
this.zoom = new Zoom(settings.maxZoom);
this.layerBuilder = layerBuilder;
this.fragmentManager = new FragmentManager(layerBuilder.getConstructors(), layerBuilder.getNumberOfLayers());
}
@CalledOnlyBy(AmidstThread.EDT)
public ViewerFacade create(World world, Actions actions) {
Graphics2DAccelerationCounter accelerationCounter = new Graphics2DAccelerationCounter();
Movement movement = new Movement(settings.smoothScrolling);
WorldIconSelection worldIconSelection = new WorldIconSelection();
LayerManager layerManager = layerBuilder
.create(settings, world, biomeSelection, worldIconSelection, zoom, accelerationCounter);
FragmentGraph graph = new FragmentGraph(layerManager.getDeclarations(), fragmentManager);
FragmentGraphToScreenTranslator translator = new FragmentGraphToScreenTranslator(graph, zoom);
FragmentQueueProcessor fragmentQueueProcessor = fragmentManager
.createQueueProcessor(layerManager, settings.dimension);
LayerReloader layerReloader = layerManager.createLayerReloader(world);
WorldExporterFactory worldExporterFactory = new WorldExporterFactory(workerExecutor, world);
WidgetBuilder widgetBuilder = new WidgetBuilder(
world,
graph,
translator,
zoom,
biomeSelection,
worldIconSelection,
layerReloader,
fragmentManager,
accelerationCounter,
settings,
worldExporterFactory::getProgressMessage);
List<Widget> widgets = widgetBuilder.create();
Drawer drawer = new Drawer(
graph,
translator,
zoom,
movement,
widgets,
layerManager.getDrawers(),
settings.dimension,
accelerationCounter);
Viewer viewer = new Viewer(
new ViewerMouseListener(new WidgetManager(widgets), graph, translator, zoom, movement, actions),
drawer);
return new ViewerFacade(
world,
graph,
translator,
zoom,
viewer,
layerReloader,
worldIconSelection,
layerManager,
workerExecutor,
worldExporterFactory,
() -> onRepainterTick(viewer),
() -> onFragmentLoaderTick(fragmentQueueProcessor),
() -> onPlayerFinishedLoading(layerReloader));
}
@CalledOnlyBy(AmidstThread.REPAINTER)
private void onRepainterTick(final Viewer viewer) {
viewer.repaintComponent();
}
@CalledOnlyBy(AmidstThread.FRAGMENT_LOADER)
private void onFragmentLoaderTick(final FragmentQueueProcessor fragmentQueueProcessor) {
fragmentQueueProcessor.processQueues();
}
@CalledOnlyBy(AmidstThread.EDT)
private void onPlayerFinishedLoading(final LayerReloader layerReloader) {
layerReloader.reloadPlayerLayer();
}
}