package org.peerbox.guice; import javafx.stage.Stage; import org.peerbox.app.ExitHandler; import org.peerbox.app.IExitHandler; import org.peerbox.app.config.IPeerWaspConfig; import org.peerbox.app.config.PeerWaspConfig; import org.peerbox.app.manager.node.INodeManager; import org.peerbox.app.manager.node.NodeManager; import org.peerbox.app.manager.user.IUserManager; import org.peerbox.app.manager.user.UserManager; import org.peerbox.delete.FileDeleteHandler; import org.peerbox.delete.IFileDeleteHandler; import org.peerbox.events.MessageBus; import org.peerbox.filerecovery.FileRecoveryHandler; import org.peerbox.filerecovery.IFileRecoveryHandler; import org.peerbox.forcesync.ForceSyncHandler; import org.peerbox.forcesync.IForceSyncHandler; import org.peerbox.share.IShareFolderHandler; import org.peerbox.share.ShareFolderHandler; import org.peerbox.view.tray.AbstractSystemTray; import org.peerbox.view.tray.JSystemTray; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.matcher.Matchers; import com.google.inject.name.Names; import com.google.inject.spi.InjectionListener; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; public class AppModule extends AbstractModule { private final MessageBus messageBus; private final Stage primaryStage; public AppModule(Stage primaryStage) { this.primaryStage = primaryStage; this.messageBus = new MessageBus(); } @Override protected void configure() { bindMessageBus(); bindSystemTray(); bindPrimaryStage(); bindManagers(); bindConfigs(); bindContextMenuHandlers(); bind(IFxmlLoaderProvider.class).to(GuiceFxmlLoader.class); bind(IExitHandler.class).to(ExitHandler.class); } private void bindMessageBus() { bind(MessageBus.class).toInstance(messageBus); messageBusRegisterRule(); } private void messageBusRegisterRule() { // This rule registers all objects created by Guice with the message bus. // As a result, all instances created by Guice can receive messages without explicit // subscription. bindListener(Matchers.any(), new TypeListener() { @Override public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { typeEncounter.register(new InjectionListener<I>() { public void afterInjection(I i) { messageBus.subscribe(i); } }); } }); } private void bindPrimaryStage() { bind(javafx.stage.Stage.class) .annotatedWith(Names.named("PrimaryStage")) .toInstance(primaryStage); } private void bindSystemTray() { bind(AbstractSystemTray.class).to(JSystemTray.class); } private void bindManagers() { bind(INodeManager.class).to(NodeManager.class); bind(IUserManager.class).to(UserManager.class); } private void bindContextMenuHandlers() { bind(IFileDeleteHandler.class).to(FileDeleteHandler.class); bind(IFileRecoveryHandler.class).to(FileRecoveryHandler.class); bind(IShareFolderHandler.class).to(ShareFolderHandler.class); bind(IForceSyncHandler.class).to(ForceSyncHandler.class); } private void bindConfigs() { bind(IPeerWaspConfig.class).to(PeerWaspConfig.class); } }