/* * Copyright (C) 2015 Patryk Strach * * This file is part of Virtual Slide Viewer. * * Virtual Slide Viewer is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * Virtual Slide Viewer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with Virtual Slide Viewer. * If not, see <http://www.gnu.org/licenses/>. */ package virtualslideviewer; import java.awt.Dimension; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import net.sf.ehcache.CacheManager; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import virtualslideviewer.bioformats.*; import virtualslideviewer.config.ApplicationConfiguration; import virtualslideviewer.core.*; import virtualslideviewer.core.persistence.VirtualSlidePersistenceService; import virtualslideviewer.imageviewing.*; import virtualslideviewer.ui.*; import virtualslideviewer.ui.about.*; import virtualslideviewer.ui.config.*; import virtualslideviewer.ui.imagelist.ImageListPresenter; import virtualslideviewer.ui.imagelist.view.ImageListSwingPanel; import virtualslideviewer.ui.imageviewing.*; import virtualslideviewer.ui.progress.*; import virtualslideviewer.ui.utils.SwingUIThreadMarshaller; import virtualslideviewer.undo.UndoableActionSystem; public class Main { private static ApplicationConfiguration mAppConfig = new ApplicationConfiguration(); private static ExecutorService mThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); private static TileCache mCache; private static VirtualSlidePersistenceService mVirtualSlidePersistenceService; private static ImagePresentationModel mImageViewModel; private static ImageListPresenter mImageListPresenter; private static MainWindow mMainWindow; public static void main(String[] args) { Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(Level.WARN); configureImagePresentationModel(); bindImagePresentationModelToApplicationConfiguration(); configurePersistenceService(); createMainWindow(); mImageListPresenter.addImageShowListener((image) -> { mImageViewModel.setImage(new BufferedVirtualSlideImage(image, mCache)); }); mMainWindow.show(); } private static void configureImagePresentationModel() { PrefetchingStrategy prefetchingStrategy = new NeighbourPrefetchingStrategy(512); TileLoadingPrioritizer tilePrioritizer = new DistanceToCenterTilePrioritizer(); LoadingTilePlaceholderGenerator tilePlaceholderGenerator = new DifferentResolutionsTileGenerator(); VisibleImageLoader imageLoader = new AsyncVisibleImageLoader(mThreadPool, tilePlaceholderGenerator, prefetchingStrategy, tilePrioritizer); mImageViewModel = new ImagePresentationModel(new Camera(), imageLoader); } private static void bindImagePresentationModelToApplicationConfiguration() { mImageViewModel.setZoomIncrement(mAppConfig.getZoomIncrement()); mImageViewModel.setResolutionTransitionThreshold(mAppConfig.getResolutionTransitionThreshold()); mAppConfig.addPropertyChangeListener("ZoomIncrement", e -> { mImageViewModel.setZoomIncrement((double)e.getNewValue()); }); mAppConfig.addPropertyChangeListener("ResolutionTransitionThreshold", e -> { mImageViewModel.setResolutionTransitionThreshold((double)e.getNewValue()); }); } private static void configurePersistenceService() { CacheManager.getInstance().addCache("DefaultCache"); mCache = new EhcacheTileCacheAdapter(CacheManager.getInstance().getCache("DefaultCache")); mVirtualSlidePersistenceService = new VirtualSlidePersistenceService(mCache, mThreadPool); mVirtualSlidePersistenceService.addLoader(new OmeTiffLoader(new PaddingCalculator(mThreadPool))); mVirtualSlidePersistenceService.addLoader(new BioformatsLoader(new PaddingCalculator(mThreadPool))); } private static void createMainWindow() { UndoableActionSystem undoManager = new UndoableActionSystem(); FileMenu fileMenu = new FileMenu(); ImageListSwingPanel imageSelectionPanel = new ImageListSwingPanel(new Dimension(200, 150)); MainPanel mainPanel = new MainPanel(imageSelectionPanel, mImageViewModel); mMainWindow = new MainWindow(fileMenu); ProgressViewFactory progressViewFactory = new ProgressDialogFactory(mMainWindow); ConfigView configView = new ConfigDialogFactory(mMainWindow, mAppConfig); AboutView aboutView = new AboutDialog(mMainWindow); FileMenuPresenter fileMenuPresenter = new FileMenuPresenter(fileMenu, progressViewFactory, mVirtualSlidePersistenceService, undoManager); mImageListPresenter = new ImageListPresenter(imageSelectionPanel, undoManager, new SwingUIThreadMarshaller()); MainPanelPresenter mainPanelPresenter = new MainPanelPresenter(mainPanel, mMainWindow.getMainRegion()); MainPresenter mainWindowPresenter = new MainPresenter(mMainWindow, configView, aboutView, mVirtualSlidePersistenceService, undoManager, mAppConfig); mVirtualSlidePersistenceService.addListener(mainPanelPresenter); mVirtualSlidePersistenceService.addListener(mImageListPresenter); } }